ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwY2FhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJmNDYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9hZGRQcmVCdWlsdENvbXBvbmVudHMueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYWRkUHJlQnVpbHRDb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyYTRjZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9hZGRQcmVCdWlsdENvbXBvbmVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIENhbGxiYWNrcyB0byB1c2Ugd2hlbiBidWlsZGluZyB0aGlzIGZlYXR1cmUgICAgICAgICAgICAgICAgCQkgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBidWlsZC5wcm9wZXJ0aWVzIG11c3QgaGF2ZSBhIGxpbmUgdGhhdCBzYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgY3VzdG9tQnVpbGRDYWxsYmFja3M9YWRkUHJlQnVpbHRDb21wb25lbnRzLnhtbCAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0iYWRkUHJlQnVpbHRDb21wb25lbnRzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotICAgIDwhLS0gCi0gICAgCU5vdGUgdG8gYmUgY3Jvc3MtcGxhdGZvcm0sICJlbnZpcm9ubWVudCB2YXJpYWJsZXMiIGFyZSBvbmx5IGFwcHJvcHJpYXRlIGZvciAKLSAgICAgICAgc29tZSB2YXJpYWJsZXMsIGUuZy4gb25lcyB3ZSBzZXQsIHNpbmNlIHByb3BlcnRpZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCBldmVuIGlmIAotICAgICAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcmUgbm90LCBlLmcuIGl0IHdpbGwgCi0gICAgICAgIGJlICR7ZW52LlBhdGh9IG5vdCAke2Vudi5QQVRIfSBvbiBXaW5kb3dzIC0tPgotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52IiAvPgotICAgIAotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gdGhlIGRpcmVjdG9yeSBwbHVnaW5zIHdpbGwgYmUgY29sbGVjdGVkIHRvIC0tPgotCTwhLS0gIGZlYXR1cmUuZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSByZXN1bHRpbmcgZmVhdHVyZSAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCSAgICA8IS0tIGNvcHkgb3VyIGtub3duLCBwcmUtYnVpbHQsIHVzdWFsbHkgdGhpcmQgcGFydHkgcHJlLXJlcXMgaW50byB0aGlzIGZlYXR1cmUgLS0+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IkN1cnJlbnQgYmFzZWRpciBkdXJpbmcgY2FsbGJhY2s6ICR7YmFzZWRpcn0iIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IkN1cnJlbnQgZGVzdGluYXRpb24udGVtcC5mb2xkZXIgZHVyaW5nIGNhbGxiYWNrOiAke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfSIgLz4KLSAgICAgICAgPGNvcHkKLSAgICAgICAgICAgIHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfSIKLSAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZW52LkJVSUxEX0hPTUV9L3ByZWJ1aWx0L2VjbGlwc2UvcGx1Z2lucy8iIGluY2x1ZGVzPSJvcmcuZWNsaXBzZS5qZW0qLyoqIiAvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5Ci0gICAgICAgICAgICB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0iCi0gICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Vudi5CVUlMRF9IT01FfS9wcmVidWlsdC9lY2xpcHNlL3BsdWdpbnMvIiBpbmNsdWRlcz0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50Ki8qKiIgLz4KLSAgICAgICAgPC9jb3B5PgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gdGhlIGRpcmVjdG9yeSBwbHVnaW5zIHdpbGwgYmUgY29sbGVjdGVkIHRvIC0tPgotCTwhLS0gIGZlYXR1cmUuZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSByZXN1bHRpbmcgZmVhdHVyZSAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQk8L3RhcmdldD4KLQotICAgIAotICAgIAotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gTm8gRGVmYXVsdCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0ibm9EZWZhdWx0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGhpcyBmaWxlIG11c3QgYmUgY2FsbGVkIHdpdGggZXhwbGljaXQgdGFyZ2V0cyIgLz4KLQk8L3RhcmdldD4KLQotICAgIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDQ4MGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDIyM2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIGNvbW1vbiBjb3JlIGZ1bmN0aW9uYWxpdHkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZmNjODUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIgdmVyc2lvbj0iMS4wLjEwMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiB2ZXJzaW9uPSIxLjAuMTAwIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50IiB2ZXJzaW9uPSIxLjYuNSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIiB2ZXJzaW9uPSIyLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmljdSIgdmVyc2lvbj0iMy40LjQuMSIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiIHZlcnNpb249IjIuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgdmVyc2lvbj0iMy4xLjEwMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vc2dpLnV0aWwiIHZlcnNpb249IjMuMS4xMDAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFiZmI0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkMGY1NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBDb3JlIERldmVsb3BlciBSZXNvdXJjZXMKLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIGNvbW1vbiBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjA1N2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUuc291cmNlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc0ZmMwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTViNDU3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI1YjBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gQ29tbW9uIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzOTI1Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjI1MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5MWZiZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NmUwMGUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgQ29tbW9uIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBjb21tb24gdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjIzZDMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBhZjdkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxMTY0Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkODdhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBjb21tb24gVUkgZnVuY3Rpb25hbGl0eS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDExMWU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiIHZlcnNpb249IjEuMC4xMDEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52IiB2ZXJzaW9uPSIxLjAuMTAxIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIHZlcnNpb249IjIuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQiIHZlcnNpb249IjEuMC4xMDAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiB2ZXJzaW9uPSIxLjIuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kcmF3MmQiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmdlZiIgdmVyc2lvbj0iMy4yLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1IiB2ZXJzaW9uPSIzLjQuNCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUiIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IiB2ZXJzaW9uPSIzLjEuMTAwIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiB2ZXJzaW9uPSIzLjIuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIiB2ZXJzaW9uPSIxLjEuMCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiIHZlcnNpb249IjMuMi4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgdmVyc2lvbj0iMS4xLjAiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIHZlcnNpb249IjEuMS4wIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIgdmVyc2lvbj0iMy4yLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Nzg1NTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnNvdXJjZSA9IG9yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MWNmYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBDb21tb24gVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBDb21tb24gVUkuCi0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDFkNWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMTRlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTU1OTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwYjczYy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBDb21tb24gVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ODk0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImplbXV0aWwiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImplbXV0aWwtbm9ud29ya2JuZWNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNjYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjU0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2U9ZmFsc2UKLW9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZT1mYWxzZQotb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWw9V0FSTklORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU0MTIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udXRpbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMyOTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxNTo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU3OWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNUdWUgSnVsIDMxIDIwOjM5OjQ4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhlMWJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBGZWIgMjEgMTA6MDk6MTkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fanZlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMAotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1qYXZhO2phdmF4O29yZztvcmcuZWNsaXBzZS53dHA7b3JnLmVjbGlwc2UuamVtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGU7b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamNtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmphdmE7b3JnLmVjbGlwc2UudmU7Y29tOwotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDZiMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI0ZyaSBNYXkgMTMgMTA6MTA6MDQgRURUIDIwMDUKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTIKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MgotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MgotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MgotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NWEzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS51dGlsOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5sczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LjEsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9QRVJGTVNSX1JFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MTI1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLW9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSBjb2RlIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGVyZm1zci5qYXIgbG9hZGVkIGFzIGJpbmFyeSBpbiB0aGlzCi1wcm9qZWN0LiBTaW5jZSB0aGlzIGlzIG9wdGlvbmFsLCB3ZSBuZWVkZWQgdG8gYmUgYWJsZSB0byBjb21waWxlIHdpdGhvdXQgdGhlIHRydWUKLXBsdWdpbiBiZWluZyBhdmFpbGFibGUuIFNvIHdlIGNyZWF0ZWQgdGhlIHN0dWIgamFyIGNvbnRhaW5pbmcganVzdCB3aGF0IHdlIG5lZWRlZC4KLQotSWYgdGhlcmUgaXMgYSBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGUgc3R1YiBqYXIsIHlvdSB3aWxsIG5lZWQgdG8gY2hlY2tvdXQKLXRoZSBmb2xkZXIgb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIuIFRoaXMgd2lsbCB0aGVuCi1iZSBhIHNlcGFyYXRlIHByb2plY3QuIFlvdSBjYW4gdGhlbiBtYWtlIHRoZSBjaGFuZ2VzIHRoZXJlLCBhbmQgdGhlbiBmb2xsb3dpbmcgdGhlCi1SRUFETUUgaW4gdGhhdCBwcm9qZWN0IHRvIGNyZWF0ZSBhbmQgY29tbWl0IHRoZSBjaGFuZ2VzLiAKLQotVGhlIGphciBpcyBpbiB0aGlzIHByb2plY3QncyBjbGFzc3BhdGgsIGJ1dCBpdCBpcyBub3QgZXhwb3J0ZWQgYW5kIGlzIG5vdCBpbgotdGhlIHBsdWdpbi54bWwgb3IgYnVpbGQucHJvcGVydGllcy4gVGhpcyBtZWFucyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgY29tcGlsYXRpb24KLWJ1dCBpdCB3b24ndCBzaG93IHVwIGluIHRoZSBydW50aW1lIHdvcmtiZW5jaC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgImEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIgImIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOGU5NGEuLjAwMDAwMDAKLS0tICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1EbyBub3QgaW5jbHVkZSBhIG5ldyBkZXBlbmRlbmN5IHBsdWdpbiB0byB0aGUgTUFOSUZFU1QgZm9yIHRoaXMgcGx1Z2luZCEhIQotCi1UaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhpcyBwbHVnaW4gaXMgYWxzbyBleGVjdXRlZCBvdXRzaWRlIG9mIEVjbGlwc2UgZnJhbWV3b3JrLCBzdWNoIElCTSBXZWJzcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIChjKSBJQk0uIFdlIGNhbm5vdCBhZGQKLW5ldyBkZXBlbmRlbmNpZXMgdG8gdGhlIHBsdWdpbiBiZWNhdXNlIHRoZSBjdXJyZW50IHNldCBpcyBjb25zaWRlcmVkIHRvIGJlIEFQSS4gQWRkaW5nIGEgbmV3IHNldCB3aXRob3V0IGNvbnN1bHRpbmcgdGhvc2UgdXNlcnMgd291bGQgYnJlYWsKLXRoZW0uCi0KLVRoZSBleHRlcm5hbCBBUEkgaXMgYW55dGhpbmcgaW4gdGhlIGplbXV0aWwtbm9ud29ya2JlbmNoIGZvbGRlci4gSWYgaXQgaXMgb25seSBmb3IgYSBjbGFzcyBpbiB0aGUgb3RoZXIgc291cmNlIGZvbGRlcihzKSBpdCBtYXkgYmUgT0sgc2luY2UgdGhleSB3b3VsZCBub3QgYmUgCi11c2luZyB0aGF0IGNvZGUuIEJ1dCBpdCB3b3VsZCBiZSBiZXN0IHRvIGNvbnN1bHQgd2l0aCB0aGVtIGZpcnN0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2NzE3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBkODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IGplbXV0aWwvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgamVtdXRpbC1ub253b3JrYm5lY2gvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1leHRyYS4uID0gLi9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL0xvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGJhZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvTG9nRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCB3aGVuIGxvZ2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggc2hvdWxkIGJlIGdyb3VwZWQgdG9nZXRoZXIuIEluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBldmVyeSB0aW1lIGl0Ci0gKiBpcyBuZWVkZWQsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHJldXNlIGl0LgotICogPHA+Ci0gKiBDdXJyZW50bHkgdGhlIG9ubHkgZmllbGRzIHRoYXQgYXJlIGxvZ2dlZCBhcmUgdGhlIHtAbGluayAjZ2V0VGV4dCgpfSBhbmQge0BsaW5rICNnZXRUYXJnZXRFeGNlcHRpb24oKX0uCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9nRW50cnkgewotCi0JcHJpdmF0ZSBpbnQgX2V4ZWN1dGlvbk1hcCA9IDA7Ci0KLQlwcml2YXRlIFRocm93YWJsZSBfY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0aWVzRmlsZU5hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxlT2ZPcmlnaW4gPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgc291cmNlSWRlbnRpZmllcjsKLQotCXByaXZhdGUgU3RyaW5nIGVsYXBzZWRUaW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKLQotCS8qKgotCSAqIFRoZSBmaWxlIG5hbWUgcGFyYW1ldGVyIG11c3QgYmUgYSBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IFJlc291cmNlQnVuZGxlIHRvIGxvYWQgdGhlIHN0cmluZyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLiBUaGUgcGFyYW1ldGVyIG11c3Qgbm90Ci0JICogYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzRmlsZU5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgTG9nRW50cnkoU3RyaW5nIHByb3BlcnRpZXNGaWxlTmFtZSkgewotCQlzZXRQcm9wZXJ0aWVzRmlsZU5hbWUocHJvcGVydGllc0ZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExvZ0VudHJ5KCkgewotCX0KLQotCS8qKgotCSAqIEdldCBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHJldHVybiBleGVjdXRpb24gbWFwCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25NYXAoKSB7Ci0JCXJldHVybiBfZXhlY3V0aW9uTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHByb3BlcnRpZXMgZmlsZSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfcHJvcGVydGllc0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCB0YXJnZXQgZXhjZXB0aW9uCi0JICogCi0JICogQHJldHVybiB0YXJnZXQgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRUYXJnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfY2F1Z2h0RXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldCBsb2NhbGUgb2Ygb3JpZ2luCi0JICogCi0JICogQHJldHVybiBsb2NhbGUgb2Ygb3JpZ2luIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGVPZk9yaWdpbigpIHsKLQkJcmV0dXJuIGxvY2FsZU9mT3JpZ2luOwotCX0KLQotCS8qKgotCSAqIEdldCBzb3VyY2UgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHNvdXJjZSBpZGVudGlmaWVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VpZGVudGlmaWVyKCkgewotCQlyZXR1cm4gc291cmNlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWxhcHNlZCB0aW1lCi0JICogCi0JICogQHJldHVybiBlbGFwc2VkIHRpbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gZWxhcHNlZFRpbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXNzYWdlIHR5cGUgaWRlbnRpZmllcgotCSAqIAotCSAqIEByZXR1cm4gbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUeXBlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZXhlY3V0aW9uIG1hcAotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25NYXAoaW50IG1hcCkgewotCQlfZXhlY3V0aW9uTWFwID0gbWFwOwotCX0KLQotCS8qKgotCSAqIFNldCBwcm9wZXJ0aWVzIGZpbGUgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmTmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNGaWxlTmFtZShTdHJpbmcgZk5hbWUpIHsKLQkJX3Byb3BlcnRpZXNGaWxlTmFtZSA9IGZOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCB0YXJnZXQgZXhjZXB0aW9uCi0JICogCi0JICogQHBhcmFtIGV4YwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjKSB7Ci0JCV9jYXVnaHRFeGNlcHRpb24gPSBleGM7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHN0YWNrdHJhY2Ugb2YgY3VycmVudCBzdGFjayAoYXQgdGhlIHRpbWUgb2YgY2FsbCB0byB0aGlzIG1ldGhvZCkgdG8gdGhlIHRleHQgYnVmZmVyLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFN0YWNrVHJhY2UoKSB7Ci0JCS8vIEdyYWIgdGhlIHN0YWNrIHRyYWNlIGZyb20gdGhlIFRocmVhZCAuLi4KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOwotCQkvLyBDYW4ndCBjYWxsIFRocmVhZC5kdW1wU3RhY2soKSBiZWNhdXNlIGl0IGRvZXNuJ3QgdGFrZSBhIHdyaXRlciBhcyBpbnB1dC4KLQkJLy8gQ29weSBpdHMgbWVjaGFuaXNtIGluc3RlYWQuCi0JCW5ldyBFeGNlcHRpb24oIlN0YWNrIHRyYWNlIikucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFdyaXRlci5mbHVzaCgpOwotCi0JCS8vIGFuZCB1cGRhdGUgdGhlIHRleHQgdG8gdGhlIExvZ0VudHJ5J3MgdGV4dC4KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRUZXh0KCkpOwotCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoYnl0ZU91dHB1dC50b1N0cmluZygpKTsKLQkJc2V0VGV4dChidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGV4dCBvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB0ZXh0Ci0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgewotCQl0ZXh0ID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldCBldmVyeSBlbnRyeSB0byB0aGUgZGVmYXVsdCB2YWx1ZSBleGNlcHQgdGhlIHByb3BlcnRpZXMgZmlsZSBuYW1lLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzZXRFeGVjdXRpb25NYXAoMCk7Ci0JCXNldFRhcmdldEV4Y2VwdGlvbihudWxsKTsKLQkJbG9jYWxlT2ZPcmlnaW4gPSBudWxsOwotCQlzb3VyY2VJZGVudGlmaWVyID0gbnVsbDsKLQkJZWxhcHNlZFRpbWUgPSBudWxsOwotCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldCBsb2NhbGUgb2Ygb3JpZ2luLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGVPZk9yaWdpbihTdHJpbmcgb3JpZ2luKSB7Ci0JCWxvY2FsZU9mT3JpZ2luID0gb3JpZ2luOwotCX0KLQotCS8qKgotCSAqIFNldCBzb3VyY2UgaWQuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlSUQoU3RyaW5nIGlkKSB7Ci0JCXNvdXJjZUlkZW50aWZpZXIgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZWxhcHNlZCB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSB0aW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxhcHNlZFRpbWUobG9uZyB0aW1lKSB7Ci0JCWVsYXBzZWRUaW1lID0gU3RyaW5nLnZhbHVlT2YodGltZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNvdXJjZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJc2V0U291cmNlSUQoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIuCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCW1lc3NhZ2VUeXBlSWRlbnRpZmllciA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkLiBTYW1lIGFzIDxjb2RlPnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllci48L2NvZGU+Ci0JICogQHBhcmFtIHN0cmluZwotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSUQoU3RyaW5nIHN0cmluZykgewotCQlzZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG9rZW5zLiAoQ3VycmVudGx5IHRoaXMgaXMgaWdub3JlZCkuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0KFN0cmluZyl9IGluc3RlYWQgYW5kIGNhbGxpbmcgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb2tlbnMoU3RyaW5nW10gc3RyaW5ncykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOwotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJcHJpbnRXcml0ZXIucHJpbnRsbih0ZXh0KTsKLQkJaWYgKF9jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJX2NhdWdodEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOwotCQl9Ci0JCXByaW50V3JpdGVyLmZsdXNoKCk7Ci0JCXJldHVybiBieXRlT3V0cHV0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFlOTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eTsKLQotLyoqCi0gKiBCYXNpYyBsb2cgcmVuZGVyZXIgaW50ZXJmYWNlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgZXh0ZW5zaW9uIDxjb2RlPklMb2dSZW5kZXJlcjIuPC9jb2RlPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nUmVuZGVyZXIgewotCi0JLyoqCi0JICogTG9nZ2VkIHRvIGNvbnNvbGUuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OU09MRV9ERVNDUklQVElPTiA9ICJjb25zb2xlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nZ2VkIHRvIHdvcmtiZW5jaC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBXT1JLQkVOQ0hfREVTQ1JJUFRJT04gPSAid29ya2JlbmNoIGxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5vdCBsb2dnZWQuCi0JICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgTk9MT0dfREVTQ1JJUFRJT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9nIGxldmVscy4gVGhlc2UgYXJlIGRlcHJlY2F0ZWQsIHVzZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT4gY29kZXMgaW5zdGVhZC4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfRVJST1IgPSAwOwotCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX1RSQUNFID0gMTsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19XQVJOSU5HID0gMjsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19JTkZPID0gMzsKLQotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRQbHVnaW5JRCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExvZyB0aGUgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpOwotCi0JLyoqCi0JICogU3RhcnQgb3Igc3RvcCB0aGUgdHJhY2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gRmxhZwotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc3RhcnQgdGhlIHRyYWNpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gRmxhZyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSUxvZ1JlbmRlcmVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE2NzBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLSAKLS8qKgotICogTG9nIHJlbmRlcmVyIHRoYXQgcHJvdmlkZXMgbW9yZSBmdW5jdGlvbi4gQmFzaWNhbGx5IGl0IGNhbiBoYW5kbGUKLSAqIHRoZSBsb2dnaW5nIG9mIHNwZWNpZmljIHR5cGVzIGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGFuIHRoZSBkZWZhdWx0Ci0gKiBjb252ZXJzaW9uIHRvIHN0cmluZyBzdXBwbGllZCBieSBMb2dnZXIuCi0gKiAKLSAqIEl0IGFsc28gdXNlcyB0aGUgTGV2ZWwgY2xhc3NlcyBmcm9tIGphdmEudXRpbC5sb2dnaW5nIGFzIHRoZSBsb2dnaW5nIGxldmVscy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ1JlbmRlcmVyMiBleHRlbmRzIElMb2dSZW5kZXJlciB7Ci0JCi0JLyoqCi0JICogV2hlbiBMb2dnZXIuc2V0TGV2ZWwoREVGQVVMVCk6IHJlc3RvcmUgdG8gd2hhdCB0aGUgZGVmYXVsdCBsZXZlbCB3YXMuCi0JICogV2hlbiBsb2coLi4uLERFRkFVTFQpOiBMb2cgYXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoZSB0eXBlIG9mIG9iamVjdC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgTGV2ZWwgREVGQVVMVCA9IG5ldyBMb2dnZXIuTG9jYWxMZXZlbCgiREVGQVVMVCIsIEludGVnZXIuTUFYX1ZBTFVFLTEpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogV2hlbiBsb2coLi4uLFRSQUNFKSA6IExvZyBvbmx5IHdoZW4gaW4gdHJhY2UgbW9kZS4KLQkgKiBEb24ndCB1c2UgaW4gTG9nZ2VyLnNldExldmVsKCkuIEhhcyBubyBtZWFuaW5nIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgTGV2ZWwgVFJBQ0UgPSBuZXcgTG9nZ2VyLkxvY2FsTGV2ZWwoIlRSQUNFIiwgSW50ZWdlci5NQVhfVkFMVUUtMik7CSAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIHRocm93YWJsZSkuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGFuIG9iamVjdCkuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGJvb2xlYW4pLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCk7CQotCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgY2hhcikuCi0JICogCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxldmVsKTsJCi0JCi0JLyoqCi0JICogTG9nIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgYnl0ZSkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxldmVsKTsKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNob3J0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgc2hvcnQpLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbGV2ZWwpOwotCQotCS8qKgotCSAqIExvZyB0aGUgaW50IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGFuIGludCkuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpOwotCi0JLyoqCi0JICogTG9nIHRoZSBsb25nIGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgbG9uZykuCi0JICogCi0JICogQHBhcmFtIGwKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKTsKLQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBmbG9hdCkuCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCk7Ci0KLQkvKioKLQkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGRvdWJsZSkuCi0JICogCi0JICogQHBhcmFtIGQKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSkRLQ29uc29sZVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjOWQ3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9KREtDb25zb2xlUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiBEZWZhdWx0IGxvZyByZW5kZXJlciB0byB1c2Ugd2hlbiBub3QgcnVubmluZyB1bmRlciBFY2xpcHNlLiBJdCBsb2dzIHRvIHN5c291dCBhbmQgc3lzZXJyLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgSkRLQ29uc29sZVJlbmRlcmVyIGltcGxlbWVudHMgSUxvZ1JlbmRlcmVyMiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdAotCi0JcHJpdmF0ZSBib29sZWFuIGZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKLQotCXByaXZhdGUgTG9nZ2VyIGZNeUxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RlciB0YWtpbmcgYSBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBKREtDb25zb2xlUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgewotCQlzdXBlcigpOwotCQlmTXlMb2dnZXIgPSBsb2dnZXI7Ci0JCWZUcmFjZU1vZGUgPSBmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQotCQlpZiAodHlwZSA9PSBJTG9nUmVuZGVyZXIuTE9HX1RSQUNFICYmICFmVHJhY2VNb2RlKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHR5cGUgPT0gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUikKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNzZXRUcmFjZU1vZGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7Ci0KLQkJaWYgKGZTZXR0aW5nVHJhY2UpCi0JCQlyZXR1cm47Ci0JCWZTZXR0aW5nVHJhY2UgPSB0cnVlOwotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJZk15TG9nZ2VyLnNldFRyYWNlTW9kZShmbGFnKTsKLQkJZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3RyaW5nIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGxldmVsCi0JICogQHJldHVybiA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nKFN0cmluZyBtc2csIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBMZXZlbC5TRVZFUkUpCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgbG9nZ2luZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwKLQkgKiAKLQkgKiBAcGFyYW0gbG9nTGV2ZWwKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGxvZ2dpbmcgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2luZyhMZXZlbCBsb2dMZXZlbCkgewotCQlyZXR1cm4gZlRyYWNlTW9kZSB8fCBmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobG9nTGV2ZWwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJvb2xlYW4sIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJ5dGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGNoYXIsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGRvdWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihkKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhmbG9hdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGYpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGludCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihpKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhsb25nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihsKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKG8pLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKHNob3J0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YocyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5TRVZFUkU7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODZhZDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgYmFzZSwgVUkgaW5kZXBlbmRlbnQgbG9nZ2VyLiAgIEl0IHdpbGwKLSAqIGNvbnN0cnVjdCBhIGNvbnNpc3RlbnQgbXNnLiBib2R5LCBhbmQgY2FsbCBhbiBlbmZpcm9ubWVudCBzcGVjaWZpYyBJTG9nUmVuZGVyZXIuCi0gKiBCeSBkZWZhdWx0LCB0aGlzIGxvZ2dlciB3aWxsIHVzZSBhIGNvbnNvbGUgYmFzZWQgSUxvZ1JlbmRlcmVyLAotICogYW5kIGEgSjJFRSBQbHVnaW4gaWRlbnRpZmljYXRpb24uCi0gKiAKLSAqIDxwPgotICogV2hlbiBydW5uaW5nIG91dHNpZGUgb2YgRWNsaXBzZSwgdGhlIHRyYWNlIGFuZCBsb2dnaW5nIGxldmVsIGNvbWUgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMKLSAqIDx1bD4KLSAqIAkJPGxpPiJkZWJ1ZyIgKD0idHJ1ZSIpIC0gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LiAKLSAqIAkJPGxpPiJsb2dMZXZlbCIgKD0ibGV2ZWwiIHdoZXJlICJsZXZlbCIgaXMgYSBsZXZlbCBzdHJpbmcsIGUuZy4gU0VWRVJFLCBXQVJOSU5HLCBldGMuIGZyb20gdGhlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiBjbGFzcykuCi0gKiAJCQlUaGUgZGVmYXVsdCBpcyAiV0FSTklORyIuCi0gKiA8L3VsPgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQkKLQkvLyBUaGlzIGlzIHVzZWQgYnkgSUxvZ1JlbmRlcmVyMiB0byBkZWZpbmUgdGhlIGRlZmF1bHQgbGV2ZWwuCi0Jc3RhdGljIGNsYXNzIExvY2FsTGV2ZWwgZXh0ZW5kcyBMZXZlbCB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI3MzM1NzA3NDc2Nzg1NDg4M0w7Ci0KLQkJcHVibGljIExvY2FsTGV2ZWwoU3RyaW5nIG5hbWUsIGludCBsZXZlbCkgewotCQkJc3VwZXIobmFtZSwgbGV2ZWwpOwotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdCAgICAgICAgICAgICAgCi0JcHJpdmF0ZSBTdHJpbmcgZlBsdWdpbklEOwotCXByaXZhdGUgSUxvZ1JlbmRlcmVyIGZSZW5kZXJlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTG9nUmVuZGVyZXIyIHJlbmRlcmVyMiA9IG51bGw7Ci0JcHVibGljIFN0cmluZyBmTGluZVNlcGVyYXRvcjsKLQlwcml2YXRlIExldmVsIGxldmVsOwotCXByaXZhdGUgTGV2ZWwgZGVmYXVsdExldmVsID0gTGV2ZWwuU0VWRVJFOwkvLyBCeSBkZWZhdWx0IG9ubHkgc2V2ZXJlIG9yIGdyZWF0ZXIgYXJlIGxvZ2dlZC4KLQlwcml2YXRlIFN0cmluZyBsb2dGaWxlTmFtZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExvZ2dlclBsdWdpbiA9IElMb2dSZW5kZXJlci5EZWZhdWx0UGx1Z2luSUQ7Ci0Jc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIExvZ2dlcnMgPSBuZXcgSGFzaHRhYmxlKCk7IC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSBMb2dnZXJzCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBMb2dNYXJrID0geyAiKioqIEVSUk9SICoqKiAiLCAvLyROT04tTkxTLTEkCi0JCSJbVHJhY2VdICIsIC8vJE5PTi1OTFMtMSQKLQkJIisrKyBXYXJuaW5nICsrKyAiLCAvLyROT04tTkxTLTEkCi0JCSJJbmZvICIgfTsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRmlsbGVyID0gIiAgICAiOyAvLyBVc2UgdGhpcyB0byBpbmRlbnQgbXNnLiBib2R5IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgTG9nZ2VyKCkgewotCQl0aGlzKElMb2dSZW5kZXJlci5EZWZhdWx0UGx1Z2luSUQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9nZ2VyKFN0cmluZyBwbHVnaW5JRCkgewotCQlmUGx1Z2luSUQgPSBwbHVnaW5JRDsKLQkJc2V0UmVuZGVyZXIobmV3IEpES0NvbnNvbGVSZW5kZXJlcih0aGlzKSk7CS8vIFNldCB1cCBkZWZhdWx0IHRvIHRoaXMuIFNvbWVvbmUgY2FuIGNoYW5nZSBpdCBsYXRlci4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0YWNrdHJhY2UgYXMgYSBwcmludCBmb3JtYXR0ZWQgc3RyaW5nLgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiB0aGUgc3RhY2t0cmFjZSBhcyBhIHN0cmluZy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4Y2VwdGlvblRvU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHN5c3RlbSBkZWZhdWx0IGxvZ2dlci4gVGhpcyBpcyB1c2VkIGZvciBjbGllbnRzIHRoYXQgZG9uJ3Qga25vdyBpZiB0aGV5Ci0JICogYXJlIHJ1bm5pbmcgaW4gRWNsaXBzZSBvciBvdXRzaWRlIG9mIGl0LiBUaGlzIHdheSB0aGV5IGhhdmUgYSBjb21tb24gbG9nZ2VyIGZvcm1hdAotCSAqIHdoaWNoIHN3aXRjaCBjb3JyZWN0bHkuCi0JICogQHJldHVybiBkZWZhdWx0IGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCUxvZ2dlciBkZWZhdWx0TG9nZ2VyID0gKExvZ2dlcikgTG9nZ2Vycy5nZXQoRGVmYXVsdExvZ2dlclBsdWdpbik7Ci0JCWlmIChkZWZhdWx0TG9nZ2VyID09IG51bGwpIHsKLQkJCWRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7Ci0JCQlkZWZhdWx0TG9nZ2VyLmluaXQoKTsKLQkJCUxvZ2dlcnMucHV0KERlZmF1bHRMb2dnZXJQbHVnaW4sIGRlZmF1bHRMb2dnZXIpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0TG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBwbHVnaW4uCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybiBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgcGx1Z2dpbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKQotCQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJTG9nZ2VyIExvZ2dlciA9IChMb2dnZXIpIExvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKExvZ2dlciA9PSBudWxsKSB7Ci0JCQlMb2dnZXIgPSBuZXcgTG9nZ2VyKHBsdWdpbklkKTsKLQkJCUxvZ2dlci5pbml0KCk7Ci0JCQlMb2dnZXJzLnB1dChwbHVnaW5JZCwgTG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gTG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGJ5IHN1YmNsYXNzIHRvIGdldCBhIGxvZ2dlciBpZiBpdCBleGlzdHMsIGJ1dCBub3QgY3JlYXRlIG9uZS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGxvZ2dlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIExvZ2dlciBnZXRMb2dnZXJJZkV4aXN0cyhTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpCi0JCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcigpOwotCQllbHNlCi0JCQlyZXR1cm4gKExvZ2dlcikgTG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIGlkIGZvciB0aGlzIGxvZ2dlci4KLQkgKiBAcmV0dXJuIHBsdWdpbmlkCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIGZQbHVnaW5JRDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0cmFjZSBtb2RlIGZvciB0aGlzIGxvZ2dlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJhY2luZyBpcyBnb2luZyBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRUcmFjZU1vZGUoKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlOwotCX0KLQkKLQkvKgotCSAqIEluZGVudCB0aGUgTXNnLiBCb2R5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQgdGhlIGxvZwotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRlbnRNc2coU3RyaW5nIG1zZywgU3RyaW5nQnVmZmVyIGxvZ01zZykgewotCQkvLyBMaW5lIHNlcGVyYXRvciBpcyBkaWZmZXJlbnQgb24gZGlmZmVyZW50IHBsYXRmb3JtLCB1bml4ID0gXG4sIHdpbmRvd3MgXHJcbiBhbmQgbWFjIFxyCi0JCVN0cmluZyBzZXAgPSBmTGluZVNlcGVyYXRvcjsKLQkJaWYgKG1zZy5pbmRleE9mKCJcclxuIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKLQkJCXNlcCA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChtc2cuaW5kZXhPZigiXG4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIGlmIChtc2cuaW5kZXhPZigiXHIiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc2VwID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtc2csIHNlcCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlsb2dNc2cuYXBwZW5kKEZpbGxlciArIHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9IGVsc2UKLQkJCQlsb2dNc2cuYXBwZW5kKGZMaW5lU2VwZXJhdG9yICsgRmlsbGVyICsgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJfQotCX0KLQkvKgotCSAqIElmIEVjbGlwc2UgaXMgc3RhcnRlZCB3aXRoIHRoZSAtWERlYnVnIG9yIC1kZWJ1ZyB0dXJuIHRyYWNlcyBvbiBmb3IgdGhpcyBMb2dnZXIKLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yMy8yMDAxIDc6Mzc6MDQgUE0pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImRlYnVnIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJZlRyYWNlTW9kZSA9IHRydWU7Ci0JCWxldmVsID0gZGVmYXVsdExldmVsID0gTGV2ZWwucGFyc2UoU3lzdGVtLmdldFByb3BlcnR5KCJsb2dMZXZlbCIsIExldmVsLldBUk5JTkcuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXRyeSB7Ci0JCQlmTGluZVNlcGVyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8gRGlmZiBvbiBXaW4vVW5peC9NYWMgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZkxpbmVTZXBlcmF0b3IgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyoKLQkgKiBHZW5lcmljIGxvZy4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8yMDAxIDE6NTU6MzQgUE0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1zZyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHR5cGUgaW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbG9nQW55KFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBsb2dNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxvZ01zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IpOwotCQlsb2dNc2cuYXBwZW5kKExvZ01hcmtbdHlwZV0pOwotCQlyZXR1cm4gcHVuY2hMb2cobG9nUmVzdChtc2csIGxvZ01zZyksIHR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRvIGJlIHVzZWQgYnkgcmVuZGVyZXJzIHRoYXQgd2FudCB0byBwdXQgYSBtc2cgb3V0Ci0JICogaW4gYSBnZW5lcmljIGZvcm1hdC4gVGhpcyBqdXN0IHJldHVybnMgdGhlIHN0cmluZyB0aGF0Ci0JICogc2hvdWxkIGJlIGxvZ2dlZC4gSXQgcHV0cyB0aGluZ3MgbGlrZSBoZWFkZXJzIG9uIGl0LgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHJldHVybiBUaGUgZ2VuZXJpYyBtZXNzYWdlIGZvciB0aGUgc3RyaW5nIGFuZCBsZXZlbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyaWNNc2coU3RyaW5nIG1zZywgTGV2ZWwgYUxldmVsKSB7Ci0JCVN0cmluZ0J1ZmZlciBnZW5Nc2cgPSBuZXcgU3RyaW5nQnVmZmVyKG1zZy5sZW5ndGgoKSsxNik7Ci0JCWdlbk1zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IpOwotCQlnZW5Nc2cuYXBwZW5kKGdldExldmVsSGVhZGVyKGFMZXZlbCkpOwotCQlnZW5Nc2cuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCWdlbk1zZy5hcHBlbmQobmV3IERhdGUoKSk7Ci0JCWluZGVudE1zZyhtc2csIGdlbk1zZyk7Ci0JCXJldHVybiBnZW5Nc2cudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBMRVZFTF9TRUFSQ0ggPSBuZXcgTGV2ZWxbXSB7Ci0JCUxldmVsLlNFVkVSRSwKLQkJTGV2ZWwuV0FSTklORywKLQkJTGV2ZWwuSU5GTywKLQkJSUxvZ1JlbmRlcmVyMi5UUkFDRQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTEVWRUxfTUFSSyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSIqKiogRVJST1IgKioqIiwgLy8kTk9OLU5MUy0xJAotCQkiKysrIFdhcm5pbmcgKysrIiwgLy8kTk9OLU5MUy0xJAotCQkiSW5mbyIsIC8vJE5PTi1OTFMtMSQKLQkJIltUcmFjZV0iIC8vJE5PTi1OTFMtMSQKLQl9OwotCQotCXByaXZhdGUgU3RyaW5nIGdldExldmVsSGVhZGVyKExldmVsIGFMZXZlbCkgewotCQlmb3IgKGludCBpPTA7IGk8TEVWRUxfU0VBUkNILmxlbmd0aDsgaSsrKQotCQkJaWYgKExFVkVMX1NFQVJDSFtpXSA9PSBhTGV2ZWwpCi0JCQkJcmV0dXJuIExFVkVMX01BUktbaV07Ci0JCXJldHVybiBhTGV2ZWwuZ2V0TmFtZSgpOwkvLyBOb3QgZm91bmQsIGp1c3QgdXNlIGxldmVsIHN0cmluZy4KLQl9Ci0JCi0JLy8gVGhlIHdyaXRlJ3MgYXJlIGhlcmUgZm9yIGhpc3RvcnkuIFdpbGwgaW1wbGVtZW50IHVzaW5nIGxvZyhvYmosIExldmVsKSBmb3IgYWxsIG9mIHRoZSB0eXBlcy4KLQotCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKExldmVsLCBFeGNlcHRpb24pCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBleAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBsb2coYUxldmVsLCBleCk7Ci0JfQotCQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUpCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoVGhyb3dhYmxlIGV4KSB7Ci0JCXJldHVybiBsb2coZXgpOwotCX0KLQkKLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coT2JqZWN0LCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGxvZ0VudHJ5Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBPYmplY3QgbG9nRW50cnkpIHsKLQkJcmV0dXJuIGxvZyhsb2dFbnRyeSwgYUxldmVsKTsKLQl9Ci0JCi0JLyoqCi0JICogZGVwcmVjYXRlZCB1c2UgbG9nKFN0cmluZywgTGV2ZWwpCi0JICogQHBhcmFtIGFMZXZlbAotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGxvZyhzdHJpbmcsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIFRocm93YWJsZSBleCkgewotCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOwotCX0KLQkvKioKLQkgKiBkZXByZWNhdGVkIHVzZSBsb2coVGhyb3dhYmxlLCBMZXZlbCkKLQkgKiBAcGFyYW0gYUxldmVsCi0JICogQHBhcmFtIGV4Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKExldmVsIGFMZXZlbCwgRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBsb2coZXgsIGFMZXZlbCk7Ci0JfQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQotCSAqIEBwYXJhbSBhTGV2ZWwKLQkgKiBAcGFyYW0gZXgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coTGV2ZWwgYUxldmVsLCBUaHJvd2FibGUgZXgpIHsKLQkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsb2dnaW5nIGxldmVsCi0JICogQHJldHVybiBsb2dnaW5nIGxldmVsCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIExldmVsIGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgbGV2ZWwgaXMgYmVpbmcgbG9nZ2VkLiAoZS5nLiBpZiBjdXJyZW50IGxldmVsIGlzIFNFVkVSRSwgdGhlbiBGSU5FIHdpbGwgbm90IGJlIGxvZ2dlZCkuCi0JICogQHBhcmFtIHJlcXVlc3RsZXZlbAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxldmVsIHdpbGwgYmUgbG9nZ2VkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9nZ2luZ0xldmVsKExldmVsIHJlcXVlc3RsZXZlbCkgewotCQlpZiAocmVxdWVzdGxldmVsID09IElMb2dSZW5kZXJlcjIuVFJBQ0UgJiYgIWdldFRyYWNlTW9kZSgpKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBhcmVuJ3QgdHJhY2luZyBidXQgcmVxdWVzdGVkIHRyYWNlLgotCQkKLQkJcmV0dXJuICEocmVxdWVzdGxldmVsLmludFZhbHVlKCkgPCBnZXRMZXZlbCgpLmludFZhbHVlKCkgfHwgZ2V0TGV2ZWwoKSA9PSBMZXZlbC5PRkYpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciBzdHJpbmcuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIGxvZyhtc2csIExldmVsLlNFVkVSRSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRocm93YWJsZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nRXJyb3IoVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBMZXZlbC5TRVZFUkUpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbiBpbmZvIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0luZm8oU3RyaW5nIG1zZykgewotCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuSU5GTyk7Ci0JfQotCQotLyoqCi0gKiBMb2cgYSB0aHJvd2FibGUgYXMgYSB3YXJuaW5nLgotICogQHBhcmFtIGUKLSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ0luZm8oVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBMZXZlbC5JTkZPKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyB0byBsb2dNc2cgYnVmZmVyIHBhc3NlZCBpbi4gQXBwZW5kIHRoZSBkYXRlIGFuZCBmb3JtYXQgdGhlCi0JICogc3RyaW5nIHdpdGggbmljZSBpbmRlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGxvZ01zZwotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBmcm9tIHRoZSBsb2dNc2cgYWZ0ZXIgbG9nZ2luZyB0aGUgcmVzdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1Jlc3QoU3RyaW5nIG1zZywgU3RyaW5nQnVmZmVyIGxvZ01zZykgewotCQlsb2dNc2cuYXBwZW5kKG5ldyBEYXRlKCkpOwotCQlpbmRlbnRNc2cobXNnLCBsb2dNc2cpOwotCQlyZXR1cm4gbG9nTXNnLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBtc2cgYXMgdHJhY2Ugb25seS4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nVHJhY2UoU3RyaW5nIG1zZykgewotCQlpZiAoZlRyYWNlTW9kZSkKLQkJCXJldHVybiBsb2cobXNnLCBJTG9nUmVuZGVyZXIyLlRSQUNFKTsKLQkJZWxzZQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5OT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHRocm93YWJsZSBhcyB0cmFjZSBvbmx5LgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nVHJhY2UoVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIGxvZyhlLCBJTG9nUmVuZGVyZXIyLlRSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIG1lc3NhZ2UgYXMgd2FybmluZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBsb2cobXNnLCBMZXZlbC5XQVJOSU5HKTsKLQl9Ci0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXMgYSB3YXJuaW5nLgotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nV2FybmluZyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIExldmVsLldBUk5JTkcpOwotCX0KLQkKLQkvKioKLQkgKiBBc2sgdGhlIFJlbmRlcmVyIHRvIHB1bmNoIHRoZSBtc2cuIGluIHRoZSBsb2cuLiBvbmUKLQkgKiBjYWxsZXIgYXQgdGhlIHRpbWUKLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8yNC8yMDAxIDk6MTk6MTcgQU0pCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1zZyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHR5cGUgaW50Ci0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgcHVuY2hMb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKLQkJcmV0dXJuIGZSZW5kZXJlci5sb2cobXNnLCB0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSByZW5kZXJlciB0byB1c2UuCi0JICogQHBhcmFtIHJlbmRlcmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVuZGVyZXIoSUxvZ1JlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCWZSZW5kZXJlciA9IHJlbmRlcmVyOwotCQlyZW5kZXJlcjIgPSAocmVuZGVyZXIgaW5zdGFuY2VvZiBJTG9nUmVuZGVyZXIyKSA/IChJTG9nUmVuZGVyZXIyKSByZW5kZXJlciA6IG51bGw7Ci0JCXJlbmRlcmVyLnNldFRyYWNlTW9kZShnZXRUcmFjZU1vZGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdHJhY2UgbW9kZS4KLQkgKiBAcGFyYW0gZmxhZyA8Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIG9uIHRyYWNpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gZmxhZykgewotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJaWYgKGZSZW5kZXJlciAhPSBudWxsKQotCQkJZlJlbmRlcmVyLnNldFRyYWNlTW9kZShmbGFnKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBsZXZlbCBjdXRvZmYgZm9yIGxvZ2dpbmcuIEFueXRoaW5nIGJlbG93IHRoaXMgbGV2ZWwgd2lsbCBub3QgbG9nLgotCSAqIERvIG5vdCBzZXQgbGV2ZWwgdG8gPGNvZGU+SUxvZ1JlbmRlcmVyMi5UUkFDRTwvY29kZT4uIEl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwgKFVzZSA8Y29kZT5JTG9nUmVuZGVyZXIyLkRFRkFVTFQ8L2NvZGU+IHRvIHJlc3RvcmUgdG8gZGVmYXVsdCBmb3IgdGhpcyBsb2dnZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWwoTGV2ZWwgbGV2ZWwpIHsKLQkJdGhpcy5sZXZlbCA9IGxldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogZGVmYXVsdExldmVsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLiBJdCB3b24ndCB0b3VjaCB0aGUgY3VycmVudCBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGV2ZWwoTGV2ZWwgbGV2ZWwpIHsKLQkJdGhpcy5kZWZhdWx0TGV2ZWwgPSBsZXZlbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBsb2cgZmlsZSBuYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9nRmlsZU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGxvZ0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbG9nIGZpbGUgbmFtZS4KLQkgKiBAcGFyYW0gbG9nRmlsZU5hbWUgVGhlIGxvZ0ZpbGVOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlTmFtZShTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJdGhpcy5sb2dGaWxlTmFtZSA9IGxvZ0ZpbGVOYW1lOwotCX0KLQkKLQkvLyBOb3cgYWxsIG9mIHRoZSBsb2coKSB0eXBlcyB0aGF0IHVzZSBhIExldmVsLgotCi0JLyoqCi0JICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgdGhyb3dhYmxlLiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbG9nKGUsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgdGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhUaHJvd2FibGUgZSwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhlLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCVN0cmluZyBzdGFja1RyYWNlID0gZXhjZXB0aW9uVG9TdHJpbmcoZSk7Ci0JCQlyZXR1cm4gbG9nQW55KHN0YWNrVHJhY2UsIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5TRVZFUkUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbykgewotCQlyZXR1cm4gbG9nKG8sIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gbwotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhvLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YobyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLy8gVGhlIGZvbGxvd2luZyBhcmUgYWRkZWQgdG8gbWF0Y2ggdXAgd2l0aCBIeWFkZXMgc28gdGhhdCBwcmltaXRpdmVzIGNhbiBiZSBsb2dnZWQgdG9vLgotCQotCS8qKgotCSAqIExvZyBhIGJvb2xlYW4gYXQgdGhlIGRlZmF1bHQgbGV2ZWwuIAotCSAqIEBwYXJhbSBiCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYikgewotCQlyZXR1cm4gbG9nKGIsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyBhIGJvb2xlYW4gYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBiCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhiLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGMKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjKSB7Ci0JCXJldHVybiBsb2coYywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhjLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGIKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiKSB7Ci0JCXJldHVybiBsb2coYiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBieXRlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gYgotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coYiwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGIpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIHMKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcykgewotCQlyZXR1cm4gbG9nKHMsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgc2hvcnQgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2cocywgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKHMpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBpbnQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGkKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coaW50IGkpIHsKLQkJcmV0dXJuIGxvZyhpLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGludCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KLQkgKiBAcGFyYW0gaQotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbG9nTGV2ZWwpIHsKLQkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhpLCBsb2dMZXZlbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KLQkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoaSksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGwKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2cobG9uZyBsKSB7Ci0JCXJldHVybiBsb2cobCwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBsb25nIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiBAcGFyYW0gbAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2cobCwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGwpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGRlZmF1bHQgbGV2ZWwuCi0JICogQHBhcmFtIGYKLQkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coZmxvYXQgZikgewotCQlyZXR1cm4gbG9nKGYsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGxldmVsLgotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxvZ0xldmVsKSB7Ci0JCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZiwgbG9nTGV2ZWwpOwotCQl9IGVsc2UgewotCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCi0JCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGYpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGRlZmF1bHQgbGV2ZWwKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCkgewotCQlyZXR1cm4gbG9nKGQsIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgZG91YmxlIGF0IHRoZSBnaXZlbiBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBkCi0JICogQHBhcmFtIGxvZ0xldmVsCi0JICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsb2dMZXZlbCkgewotCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKLQkJCXJldHVybiByZW5kZXJlcjIubG9nKGQsIGxvZ0xldmVsKTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgotCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihkKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOwotCQl9Ci0JfQkKLQkKLQkvKgotCSAqIFR1cm4gbmV3IHR5cGUgaW50byBvbGQgdHlwZS4gVGhlIGRlZmF1bHRMZXZlbCBpcyB0aGUKLQkgKiBsZXZlbCB0byB1c2UgaWYgdGhlIGluY29taW5nIGxldmVsIGlzIG1hcmtlZCBhcyBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgaW50IGdldE9sZFR5cGUoTGV2ZWwgYUxldmVsKSB7Ci0JCWlmIChhTGV2ZWwgPT0gTGV2ZWwuU0VWRVJFKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfRVJST1I7Ci0JCWVsc2UgaWYgKGFMZXZlbCA9PSBMZXZlbC5XQVJOSU5HKQotCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfV0FSTklORzsKLQkJZWxzZSBpZiAoYUxldmVsID09IExldmVsLklORk8pCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19JTkZPOwotCQllbHNlIGlmIChhTGV2ZWwgPT0gSUxvZ1JlbmRlcmVyMi5UUkFDRSkKLQkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX1RSQUNFOwotCQllbHNlCi0JCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19JTkZPOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGE0MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNCAkJCAgJCREYXRlOiAyMDA1LzA2LzE2IDIwOjE0OjI3ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IElOU1RBTkNFOwotCQotCXN0YXRpYyB7Ci0JCUlOU1RBTkNFID0gY3JlYXRlRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCXByaXZhdGUgZmluYWwgQ2xhc3MgQ09OVFJJQlVUT1JfQ0xBU1MgPSBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLmNsYXNzOwotCXByb3RlY3RlZCBNYXAgZW1mQ29udGV4dENhY2hlID0gbmV3IFdlYWtIYXNoTWFwKCk7Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2UoKSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5SW5zdGFuY2VGcm9tRXh0ZW5zaW9uKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlmYWN0b3J5ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KCk7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBjcmVhdGVGYWN0b3J5SW5zdGFuY2VGcm9tRXh0ZW5zaW9uKCkgewotCQlmaW5hbCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeVtdIGZhY3RvcnlIb2xkZXIgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlbMV07Ci0JCVJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBSZWdpc3RyeVJlYWRlcihKRU1VdGlsUGx1Z2luLklELCAiaW50ZXJuYWxXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSIpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJmYWN0b3J5Q2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJZmFjdG9yeUhvbGRlclswXSA9IChFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9CQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmVhZGVyLnJlYWRSZWdpc3RyeSgpOwotCQlyZXR1cm4gZmFjdG9yeUhvbGRlclswXTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRU1GTmF0dXJlRmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNhY2hlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCAmJiBlbWZDb250ZXh0ICE9IG51bGwpCi0JCQllbWZDb250ZXh0Q2FjaGUucHV0KGFQcm9qZWN0LCBlbWZDb250ZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0Q2FjaGVkRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCkKLQkJCXJldHVybiAoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UpIGVtZkNvbnRleHRDYWNoZS5nZXQoYVByb2plY3QpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5hUHJvamVjdDwvY29kZT4gaXMgZWl0aGVyIGJlaW5nIGNsb3NlZCBvciBkZWxldGVkIHNvIHdlIG5lZWQgdG8gY2xlYW51cCBvdXIgY2FjaGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2FjaGVkUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlpZiAoYVByb2plY3QgIT0gbnVsbCkgCi0JCQllbWZDb250ZXh0Q2FjaGUucmVtb3ZlKGFQcm9qZWN0KTsgCi0JCQotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgb3IgZXhpc3RpbmcgRU1GTmF0dXJlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4gQWxsb3cgdGhlIDxjb2RlPmNvbnRyaWJ1dG9yPC9jb2RlPgotCSAqIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIG5ldyBvciBleGlzdGluZyBuYXR1cmUgcHJpb3IgdG8gcmV0dXJuaW5nLgotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0LCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yKSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiW0VNRldvcmtiZW5jaENvbnRleHRCYXNlXSIgKyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKCFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIltFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV0iICsgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMSIsIG5ldyBPYmplY3RbXXthUHJvamVjdC5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjb250ZXh0ID0gZ2V0Q2FjaGVkRU1GQ29udGV4dChhUHJvamVjdCk7Ci0JCWJvb2xlYW4gY29udHJpYnV0b3JGb3VuZCA9IGZhbHNlOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQljb250ZXh0ID0gcHJpbUNyZWF0ZUVNRkNvbnRleHQoYVByb2plY3QpOwotCQkJY2FjaGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250ZXh0KTsKLQkJCWNvbnRyaWJ1dG9yRm91bmQgPSBpbml0aWFsaXplRU1GQ29udGV4dEZyb21Db250cmlidXRvcnMoYVByb2plY3QsIGNvbnRleHQsIGNvbnRyaWJ1dG9yKTsKLQkJfQotCQlpZiAoY29udHJpYnV0b3IgIT0gbnVsbCAmJiBjb250ZXh0ICE9IG51bGwgJiYgIWNvbnRyaWJ1dG9yRm91bmQpCi0JCQljb250cmlidXRvci5wcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChjb250ZXh0KTsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVFTUZDb250ZXh0RnJvbUNvbnRyaWJ1dG9ycyhJUHJvamVjdCBhUHJvamVjdCwgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgewotCQlib29sZWFuIGNvbnRyaWJ1dG9yRm91bmQgPSBmYWxzZTsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgZW1mQ29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGNvbnRyaWJ1dG9yRm91bmQ7Ci0JCUxpc3QgcnVudGltZXMgPSBFTUZOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzKGFQcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3ROYXR1cmUgbmF0dXJlID0gKElQcm9qZWN0TmF0dXJlKSBydW50aW1lcy5nZXQoaSk7Ci0JCQlpZiAobmF0dXJlICE9IG51bGwgJiYgQ09OVFJJQlVUT1JfQ0xBU1MuaXNJbnN0YW5jZShuYXR1cmUpKSB7Ci0JCQkJaWYgKG5hdHVyZSA9PSBjb250cmlidXRvcikKLQkJCQkJY29udHJpYnV0b3JGb3VuZCA9IHRydWU7Ci0JCQkJKChJRU1GQ29udGV4dENvbnRyaWJ1dG9yKSBuYXR1cmUpLnByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KGVtZkNvbnRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250cmlidXRvckZvdW5kOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmF0dXJlRW5hYmxlZChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYVByb2plY3QuaXNOYXR1cmVFbmFibGVkKG5hdHVyZUlkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TmF0dXJlSWRzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIGFQcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdE5hdHVyZSBnZXROYXR1cmUoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIGFQcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZShhUHJvamVjdCk7Ci0JfQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzdGluZyBFTUZOYXR1cmUgb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcihhUmVzb3VyY2VTZXQsIGFQcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyZGIyNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMTEuMi4xICQkICAkJERhdGU6IDIwMDcvMTAvMDIgMTI6NTk6MzMgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsIGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIGltcGxlbWVudHMgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgewotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1vZHVsZVVSSSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVQl9QUk9UT0NPTF9JTkRYID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9OQU1FX0lORFggPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfTkFNRV9JTkRYID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9UWVBFX0lORFggPSAzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGVhc2luZyA9IGZhbHNlOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldEltcGwoKSB7Ci0JCXNldFVSSVJlc291cmNlTWFwKG5ldyBIYXNoTWFwKDEwKSk7CS8vIFRlbGwgaXQgdG8gY2FjaGUgdXJpLT5yZXNvdXJjZSBhY2Nlc3MuCi0JCWdldExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfUEFSU0VSX1BPT0wsIEVNRk5hdHVyZS5TSEFSRURfUEFSU0VSX1BPT0wpOwotCX0KLQlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0SW1wbChJUHJvamVjdCBhUHJvamVjdCkgewotCQl0aGlzKCk7Ci0JCXNldFByb2plY3QoYVByb2plY3QpOwotCQlpbml0aWFsaXplU2hhcmVkQ2FjaGVMaXN0ZW5lcigpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2hhcmVkQ2FjaGVMaXN0ZW5lcigpIHsKLQkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLmJlZ2luTGlzdGVuaW5nKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGVhc2luZygpIHsKLQkJcmV0dXJuIGlzUmVsZWFzaW5nOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRlbGVnYXRlZEdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCVJlc291cmNlIHJlcyA9IHN1cGVyLmRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJcmVzID0gZ2V0UmVzb3VyY2VGcm9tSGFuZGxlcnModXJpKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJLy9DaGVjayB0aGUgbWFwIGZpcnN0IHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGFuZCBkbyBub3QKLQkJLy9ub3JtYWxpemUgaWYgYSB2YWx1ZSBpcyBmb3VuZC4KLQkJYm9vbGVhbiBpc01hcHBlZCA9IGRldGVjdFVSSU1hcHBpbmcodXJpKTsKLQkJYm9vbGVhbiBoYXNDb250ZW50VHlwZSA9IChnZXRDb250ZW50VHlwZU5hbWUodXJpKSAhPSBudWxsKTsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQkJaWYgKCFpc01hcHBlZCkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQllbHNlIGlmIChoYXNDb250ZW50VHlwZSkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQkKLQkJUmVzb3VyY2UgcmVzdWx0ID0gY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoY29udmVydGVkKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCSAgICBSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IGdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeSh1cmkpOwotCQkgICAgaWYgKHJlc291cmNlRmFjdG9yeSAhPSBudWxsKQotCQkgICAgey8vV2UgZ290IHRoZSByaWdodCBmYWN0b3J5LCBub3cgdXNlIHRoZSByaWdodCBVUkkKLQkJICAgICAgcmVzdWx0ID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKGNvbnZlcnRlZCk7Ci0JCSAgICAgIGdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQkgICAgfQotCQl9Ci0JCQkKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBkZXRlY3RVUklNYXBwaW5nKFVSSSB1cmkpIHsKLQkJcmV0dXJuICEoKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClnZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKHVyaSkuZXF1YWxzKHVyaSkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIGZvciB0aGUgPGNvZGU+dXJpPC9jb2RlPiB3aXRoaW4gdGhlIFdvcmtzcGFjZS4gVGhpcyBVUkkgaXMgYXNzdW1lZCB0byBiZQotCSAqIGFic29sdXRlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uLgotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0UGxhdGZvcm1GaWxlKFVSSSB1cmkpIHsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgewotCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOwotCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJLy9DaGVjayB0aGUgbWFwIGZpcnN0IHdoZW4gY3JlYXRpbmcgdGhlIHJlc291cmNlIGFuZCBkbyBub3QKLQkJLy9ub3JtYWxpemUgaWYgYSB2YWx1ZSBpcyBmb3VuZC4KLQkJYm9vbGVhbiBpc01hcHBlZCA9IGRldGVjdFVSSU1hcHBpbmcodXJpKTsKLQkJYm9vbGVhbiBoYXNDb250ZW50VHlwZSA9IChnZXRDb250ZW50VHlwZU5hbWUodXJpKSAhPSBudWxsKTsKLQkJVVJJIGNvbnZlcnRlZCA9IHVyaTsKLQkJaWYgKCFpc01hcHBlZCkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQllbHNlIGlmIChoYXNDb250ZW50VHlwZSkKLQkJCWNvbnZlcnRlZCA9IGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpOwotCQlSZXNvdXJjZSByZXN1bHQgPSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhjb252ZXJ0ZWQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQotCQkgICAgaWYgKHJlc291cmNlRmFjdG9yeSAhPSBudWxsKQotCQkgICAgewotCQkgICAgICByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoY29udmVydGVkKTsKLQkJICAgICAgZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7Ci0JCSAgICAgIGdldFVSSVJlc291cmNlTWFwKCkucHV0KHVyaSwgcmVzdWx0KTsKLQkJICAgICAgcmV0dXJuIHJlc3VsdDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0JCSAgCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kTG9hZChSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZW1hbmRMb2FkKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWlzUmVsZWFzaW5nKQotCQkJc3VwZXIuZGVtYW5kTG9hZChyZXNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIFNlZSBpZiBhbnkgcmVzb3VyY2UgaGFuZGxlcnMgZnJvbSB0aGUgV29ya2JlbmNoQ29udGV4dAotCSAqIGRlY2lkZSB0byBjcmVhdGUgdGhlIFJlc291cmNlIGluIGFub3RoZXIgbWFubmVyLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWhhbmRsZXIgPSAoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKTsKLQkJCXJlc291cmNlID0gaGFuZGxlci5jcmVhdGVSZXNvdXJjZSh0aGlzLCB1cmkpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgUmVzb3VyY2UgZnJvbSBhIDxjb2RlPnVyaTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoUmVzb3VyY2VIYW5kbGVyKSByZXNvdXJjZUhhbmRsZXJzLmdldChpKSkuZ2V0UmVzb3VyY2UodGhpcywgdXJpKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gU2VuZCBvdXQgbm90aWZpY2F0aW9uIG9mIHJlbGVhc2UuCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFLCBudWxsLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgsIGZhbHNlKSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmVJRChqYXZhLmxhbmcuQ2xhc3MpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBnZXRGZWF0dXJlSUQoQ2xhc3MgZXhwZWN0ZWRDbGFzcykgewotCQkJCQlyZXR1cm4gUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQ7Ci0JCQkJfQotCQkJCQotCQkJCS8qIChub24tSmF2YWRvYykKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JCQkJICovCi0JCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJCQkJcmV0dXJuIFByb2plY3RSZXNvdXJjZVNldEltcGwudGhpczsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlzZXRJc1JlbGVhc2luZyh0cnVlKTsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJc3luY2hyb25pemVyID0gbnVsbDsKLQkJcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCk7Ci0JCXJlc291cmNlSGFuZGxlcnMgPSBudWxsOwotCQllQWRhcHRlcnMoKS5jbGVhcigpOwotCQlzZXRQcm9qZWN0KG51bGwpOwotCQlKRU1VdGlsUGx1Z2luLmdldFNoYXJlZENhY2hlKCkuc3RvcExpc3RlbmluZyh0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5kVW5sb2FkQWxsUmVzb3VyY2VzKCkgewotCQlib29sZWFuIGNhdWdodEV4Y2VwdGlvbiA9IGZhbHNlOwotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSByZXR1cm47Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZ2V0UmVzb3VyY2VzKCkpOwotCQlnZXRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQlSZXNvdXJjZSByZXM7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlyZXMudW5sb2FkKCk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQljYXVnaHRFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChjYXVnaHRFeGNlcHRpb24pCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uKHMpIHVubG9hZGluZyByZXNvdXJjZXMgLSBjaGVjayBsb2cgZmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc1JlbGVhc2luZyhib29sZWFuIGFCb29sZWFuKSB7Ci0JCWlzUmVsZWFzaW5nID0gYUJvb2xlYW47Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHByb2plY3QuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHVyaS50cmltRnJhZ21lbnQoKSwgbG9hZE9uRGVtYW5kKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJcmVzdWx0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGdldEVPYmplY3RGcm9tSGFuZGxlcnModXJpLCBsb2FkT25EZW1hbmQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKLQkgKiBjYW4gcmV0dXJuIGEgRU9iamVjdCBmcm9tIGEgPGNvZGU+dXJpPC9jb2RlPiBhZnRlcgotCSAqIGZhaWxpbmcgdG8gZmluZCBpdCB1c2luZyB0aGUgbm9ybWFsIG1lY2hhbmlzbXMuCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEZyb21IYW5kbGVycyhVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlFT2JqZWN0IG9iaiA9IG51bGw7Ci0JCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7Ci0JCQlvYmogPSBoYW5kbGVyLmdldEVPYmplY3RGYWlsZWQodGhpcywgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLmFkZChyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJlc291cmNlSGFuZGxlcnMuYWRkKDAsIHJlc291cmNlSGFuZGxlcik7Ci0JfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKSB7Ci0JCXJldHVybiByZXNvdXJjZUhhbmRsZXJzLnJlbW92ZShyZXNvdXJjZUhhbmRsZXIpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6ZXIuCi0JICogQHJldHVybiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBzeW5jaHJvbml6ZXI7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHN5bmNocm9uaXplci4KLQkgKiBAcGFyYW0gc3luY2hyb25pemVyIFRoZSBzeW5jaHJvbml6ZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5IGZhY3RvcnlSZWcpIHsKLQkJaWYgKHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwgJiYgZmFjdG9yeVJlZyAhPSBudWxsKSB7Ci0JCQlwcmVzZXJ2ZUVudHJpZXMoZmFjdG9yeVJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkpOwotCQkJcHJlc2VydmVFbnRyaWVzKGZhY3RvcnlSZWcuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSwgcmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKSk7Ci0JCX0KLQkJc3VwZXIuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoZmFjdG9yeVJlZyk7Ci0JfQotCS8qCi0JICogUHJlc2VydmUgdGhlIGVudHJpZXMgZnJvbSBtYXAyIGluIG1hcDEgaWYgbm8gY29sbGlzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZXNlcnZlRW50cmllcyhNYXAgbWFwMSwgTWFwIG1hcDIpIHsKLQkJaWYgKG1hcDIuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IG1hcDIuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAuRW50cnkgZW50cnk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJaWYgKCFtYXAxLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkKLQkJCQltYXAxLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKLQotCSAgICBNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKLQkgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXAuZ2V0KHVyaSk7Ci0JICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZGVtYW5kTG9hZEhlbHBlcihyZXNvdXJjZSk7Ci0JICAgICAgICB9ICAgICAgICAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFVSSUNvbnZlcnRlciB0aGVVUklDb252ZXJ0ZXIgPSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkgICAgVVJJIG5vcm1hbGl6ZWRVUkkgPSB0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBnZXRSZXNvdXJjZXMoKSkKLQkgICAgewotCSAgICAgIGlmICh0aGVVUklDb252ZXJ0ZXIubm9ybWFsaXplKHJlc291cmNlLmdldFVSSSgpKS5lcXVhbHMobm9ybWFsaXplZFVSSSkpIHsKLQkgICAgCQkgIAotCSAgICAJaWYgKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpID09IG51bGwpIHsgLy8gbG9hZGluZyBmcm9tIGxlZ2FjeSBhcmNoaXZlIGFwaSBvciBub24tdHlwZWQgcmVzb3VyY2UKLQkJICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOwotCQkgICAgICAgIH0KLQkJICAgICAgICAKLQkJICAgICAgICBpZiAobWFwICE9IG51bGwpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJICAgICAgICB9IAotCQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgCX0gZWxzZSAgey8vIGNvbnRlbnQgdHlwZSBpcyBrbm93bgotCSAgICAJCWlmKCghbWFwLmNvbnRhaW5zVmFsdWUocmVzb3VyY2UpIHx8ICgobWFwLmdldCh1cmkpICE9IG51bGwpICYmIG1hcC5nZXQodXJpKS5lcXVhbHMocmVzb3VyY2UpKSkgLy8gZXhpc3RpbmcgcmVzb3VyY2UgIHdpdGggYWx0ZXJuYXRlIG1hcHBpbmcgZG9lc24ndCBleGlzdCBpbiBtYXAKLQkgICAgCQkJfHwgZ2V0Q29udGVudFR5cGVOYW1lKGZpbmRLZXkocmVzb3VyY2UpKSA9PSBudWxsIHx8ICgoZ2V0Q29udGVudFR5cGVOYW1lKHJlc291cmNlKSAhPSBudWxsICYmIGdldENvbnRlbnRUeXBlTmFtZShyZXNvdXJjZSkuZXF1YWxzKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpKSkpKSB7Ci0JICAgIAkJaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgCi0JCSAgICAgICAgaWYgKG1hcCAhPSBudWxsICYmIChtYXAuZ2V0KHVyaSkgPT0gbnVsbCkpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgbWFwLnB1dCh1cmksIHJlc291cmNlKTsKLQkJICAgICAgICB9IAotCQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgCQl9Ci0JICAgIAl9IC8vcmV0dXJuIG51bGw7ICAvLyBSZXR1cm5pbmcgbnVsbCBiZWNhdXNlIFdlIGNhbid0IGhhbmRsZSBtdWx0aXBsZSByZXNvdXJjZXMgYmFzZWQgb24gdGhlIHNhbWUgRE9NIG1vZGVsCi0JICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICBSZXNvdXJjZSBkZWxlZ2F0ZWRSZXNvdXJjZSA9IGRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkgICAgaWYgKGRlbGVnYXRlZFJlc291cmNlICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAobWFwICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgbWFwLnB1dCh1cmksIGRlbGVnYXRlZFJlc291cmNlKTsKLQkgICAgICB9Ci0JICAgICAgcmV0dXJuIGRlbGVnYXRlZFJlc291cmNlOwotCSAgICB9Ci0KLQkgICAgaWYgKGxvYWRPbkRlbWFuZCkKLQkgICAgewotCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZGVtYW5kQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlc291cmNlIGZvciAnIiArIHVyaSArICInOyBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmFjdG9yeSBpcyBuZWVkZWQiKTsKLQkgICAgICB9Ci0KLQkgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgcmVzb3VyY2UpOwotCSAgICAgIH0gICAgICAKLQkgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gbnVsbDsKLQkgIAotCX0KLQlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShSZXNvdXJjZSByZXMpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzLmdldFVSSSgpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKHJlcy5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJVVJJIGNvbnZlcnRlZFVyaSA9IGNvbnZlcnRlci5ub3JtYWxpemUocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoIXJlcy5nZXRVUkkoKS5lcXVhbHMoY29udmVydGVkVXJpKSkKLQkJCQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShjb252ZXJ0ZWRVcmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZU5hbWUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZXNjID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjLmdldENvbnRlbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBVUkkgZmluZEtleShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNYXAgYU1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JCVNldCBrZXlzID0gYU1hcC5rZXlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJVVJJIG5hbWUgPSAoVVJJKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYU1hcC5nZXQobmFtZSkuZXF1YWxzKHJlc291cmNlKSkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVOYW1lKFVSSSB1cmkpIHsKLQkJCi0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkgfHwgIWlzVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSSh1cmkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkZW50aWZpZXIgPSAodXJpLnNlZ21lbnRDb3VudCgpID4gMyA/IHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkgOiBudWxsKTsKLQkJaWYgKGNvbnRlbnRUeXBlSWRlbnRpZmllciAhPSBudWxsICYmIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHVyaS5zZWdtZW50KE1vZHVsZVVSSS5DT05URU5UX1RZUEVfSU5EWCkpICE9IG51bGwpCi0JCQlyZXR1cm4gY29udGVudFR5cGVJZGVudGlmaWVyOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShVUkkgYU1vZHVsZVVSSSkgewotCQlpZiAoYU1vZHVsZVVSSS5zZWdtZW50Q291bnQoKSA8IDMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQsIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KSB7Ci0JCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7Ci0JCQotCi0JICAgIE1hcDxVUkksIFJlc291cmNlPiBtYXAgPSBnZXRVUklSZXNvdXJjZU1hcCgpOwotCSAgICBpZiAobWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG1hcC5nZXQodXJpKTsKLQkgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkgICAgICAgIH0gICAgICAgIAotCSAgICAgICAgcmV0dXJuIHJlc291cmNlOwotCSAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgVVJJQ29udmVydGVyIHRoZVVSSUNvbnZlcnRlciA9IGdldFVSSUNvbnZlcnRlcigpOwotCSAgICBVUkkgbm9ybWFsaXplZFVSSSA9IHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUodXJpKTsKLQkgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGdldFJlc291cmNlcygpKQotCSAgICB7Ci0JICAgICAgaWYgKHRoZVVSSUNvbnZlcnRlci5ub3JtYWxpemUocmVzb3VyY2UuZ2V0VVJJKCkpLmVxdWFscyhub3JtYWxpemVkVVJJKSkKLQkgICAgICB7Ci0JICAgICAgICBpZiAobG9hZE9uRGVtYW5kICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQkgICAgICAgIH0KLQkgICAgICAgIAotCSAgICAgICAgaWYgKG1hcCAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBtYXAucHV0KHVyaSwgcmVzb3VyY2UpOwotCSAgICAgICAgfSAKLQkgICAgICAgIHJldHVybiByZXNvdXJjZTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIFJlc291cmNlIGRlbGVnYXRlZFJlc291cmNlID0gZGVsZWdhdGVkR2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOwotCSAgICBpZiAoZGVsZWdhdGVkUmVzb3VyY2UgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgZGVsZWdhdGVkUmVzb3VyY2UpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gZGVsZWdhdGVkUmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICBpZiAobG9hZE9uRGVtYW5kKQotCSAgICB7Ci0JICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZW1hbmRDcmVhdGVSZXNvdXJjZSh1cmkscmVzb3VyY2VGYWN0b3J5KTsKLQkgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlc291cmNlIGZvciAnIiArIHVyaSArICInOyBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmFjdG9yeSBpcyBuZWVkZWQiKTsKLQkgICAgICB9Ci0KLQkgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKLQotCSAgICAgIGlmIChtYXAgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBtYXAucHV0KHVyaSwgcmVzb3VyY2UpOwotCSAgICAgIH0gICAgICAKLQkgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0JICAgIH0KLQotCSAgICByZXR1cm4gbnVsbDsKLQkgIAotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0I3Jlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpIHsKLQkJaWYgKGdldFVSSVJlc291cmNlTWFwKCkgIT0gbnVsbCkKLQkJCWdldFVSSVJlc291cmNlTWFwKCkuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGRlbWFuZENyZWF0ZVJlc291cmNlKFVSSSB1cmksIEZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSxyZXNvdXJjZUZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzNDEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byByZWRpcmVjdCwgaWYgbmVjZXNzYXJ5LCB0byBhbm90aGVyIAotICogUmVzb3VyY2VTZXQuICBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlcgotICogc28gdGhhdCB0aGUgVVJJcyBwYXNzZWQgd2lsbCB1c2UgdGhlIHBsYXRmb3JtIHByb3RvY29sLiAgQW55dGhpbmcgZWxzZSB3aWxsIGJlIGNvbnNpZGVyZWQKLSAqIHRvIGJlIGFtYmlndW91cyBhbmQgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byByZWRpcmVjdC4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlciBpbXBsZW1lbnRzIFJlc291cmNlSGFuZGxlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKgotCSogQHNlZSBJUmVzb3VyY2VIYW5kbGVyI2dldFJlc291cmNlKFJlc291cmNlU2V0LCBVUkkpCi0JKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcmV0dXJuIGdldFJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlVUkkgbWFwcGVkVVJJID0gKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClvcmlnaW5hdGluZ1Jlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKLQkJaWYgKGlzR2xvYmFsUGx1Z2luTG9hZChtYXBwZWRVUkkpKQotCQkJcmV0dXJuIGdldFJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSA8Y29kZT51cmk8L2NvZGU+LgotCSAqIFRoZSA8Y29kZT51cmk8L2NvZGU+IHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgcGxhdGZvcm06L3Jlc291cmNlL1twcm9qZWN0IG5hbWVdLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKLQkJCWlmIChvcmlnaW5hdGluZ1Jlc291cmNlU2V0ICE9IHNldCkKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkJICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgcHJvamVjdCBuYW1lIGluIHRoZSA8Y29kZT51cmk8L2NvZGU+LgotCQkgKiBUaGUgPGNvZGU+dXJpPC9jb2RlPiB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9bcHJvamVjdCBuYW1lXS4KLQkJICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCQkKLQkJUmVzb3VyY2VTZXQgc2V0ID0gSkVNVXRpbFBsdWdpbi5nZXRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBzZXQpOwotCQl9Ci0JcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHJlZGlyZWN0ZWRSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gcmVkaXJlY3RlZFJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JfQotCS8qKgotCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGZpbGUgbmFtZS4KLQkgKiBUaGlzIGlzIGZvciBjb21wYXRhYmlsaXR5IHB1cnBvc2VzIGZvciBwZW9wbGUgdXNpbmcgdGhlIHBsYXRmb3JtOi9yZXNvdXJjZSBwcm90b2NvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gdXJpLnNlZ21lbnQoMSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlSZXNvdXJjZVNldCBzZXQgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCQlpZiAob3JpZ2luYXRpbmdSZXNvdXJjZVNldCAhPSBzZXQpCi0JCQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JCSAqIFJlZGlyZWN0IHRvIHRoZSBjb3JyZWN0IHByb2plY3QgYmFzZWQgb24gdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGZpbGUgbmFtZS4KLQkJICogVGhpcyBpcyBmb3IgY29tcGF0YWJpbGl0eSBwdXJwb3NlcyBmb3IgcGVvcGxlIHVzaW5nIHRoZSBwbGF0Zm9ybTovcmVzb3VyY2UgcHJvdG9jb2wuCi0JCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUGx1Z2luUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQkJCi0JCVJlc291cmNlU2V0IHNldCA9IEpFTVV0aWxQbHVnaW4uZ2V0UGx1Z2luUmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgc2V0KTsKLQkJCQotCX0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2VTZXQgcmVkaXJlY3RlZFJlc291cmNlU2V0KSB7Ci0JCXJldHVybiByZWRpcmVjdGVkUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlXb3Jrc3BhY2Ugd3MgPSBnZXRXb3Jrc3BhY2UoKTsKLQkJaWYgKHdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQcm9qZWN0KHJlc291cmNlU2V0KTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZXNvdXJjZUhhbmRsZXIjY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQsIFVSSSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlVUkkgbWFwcGVkVVJJID0gKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcClvcmlnaW5hdGluZ1Jlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKLQkJaWYgKGlzR2xvYmFsUGx1Z2luTG9hZChtYXBwZWRVUkkpKQotCQkJcmV0dXJuIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCB1cmkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZXNvdXJjZUhhbmRsZXIjZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCwgVVJJLCBib29sZWFuKQotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3RGYWlsZWQoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzR2xvYmFsUGx1Z2luTG9hZChVUkkgYVVSSSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShhVVJJKSkgewotCQkJU3RyaW5nW10gZ2xvYmFsUGx1Z2lucyA9IEpFTVV0aWxQbHVnaW4uZ2V0R2xvYmFsTG9hZGluZ1BsdWdpbk5hbWVzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxnbG9iYWxQbHVnaW5zLmxlbmd0aDtpKyspIHsKLQkJCQlpZiAoYVVSSS5zZWdtZW50KDEpLnN0YXJ0c1dpdGgoZ2xvYmFsUGx1Z2luc1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTBhZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmllckltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY2FwdHVyZSBhbGwgQUREIGFuZCBSRU1PVkUgbm90aWZpY2F0aW9ucyBmcm9tIGVhY2ggUHJvamVjdFJlc291cmNlU2V0Ci0gKiBhbmQgZm9yd2FyZCBpdCBvbiB0byBhbnkgaW50ZXJyZXN0ZWQgbGlzdGVuZXJzLiAgVGhpcyBpcyB0byBhbGxvdyB5b3UgdG8gbGlzdGVuIHRvIG9uZSBvYmplY3QKLSAqIHRvIGdhaW4gYWxsIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbnMgZm9yIGVhY2ggUmVzb3VyY2VTZXQgd2l0aGluIHRoZSBzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGV4dGVuZHMgTm90aWZpZXJJbXBsIHsKLQlwcm90ZWN0ZWQgQWRhcHRlciBwcm9qZWN0QWRhcHRlciA9IG5ldyBXb3Jrc3BhY2VSZXNvdXJjZUNhY2hlQWRhcHRlcigpOwotCi0JY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VDYWNoZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qKgotCQkgKiBGb3J3YXJkIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJZU5vdGlmeShtc2cpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBXb3Jrc3BhY2VSZXNvdXJjZUNhY2hlLgotCSAqLwotCXB1YmxpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbkxpc3RlbmluZyhQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWlmIChhUmVzb3VyY2VTZXQgIT0gbnVsbCkgeyAKLQkJCWlmIChhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkgPT0gbnVsbCB8fCAgCi0JCQkhYVJlc291cmNlU2V0LmVBZGFwdGVycygpLmNvbnRhaW5zKHByb2plY3RBZGFwdGVyKSkKLQkJCWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5hZGQocHJvamVjdEFkYXB0ZXIpOwotCQl9Ci0JfQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGEgUHJvamVjdFJlc291cmNlU2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmcoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwpCi0JCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKHByb2plY3RBZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVmN2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmVSZWdpc3RyeS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFTUZOYXR1cmVSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX1JFR0lTVFJBVElPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbC5uYXR1cmVfcmVnaXN0cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkUgID0gIm5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEVNRk5hdHVyZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlyZWFkUmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRU1GTmF0dXJlUmVnaXN0cnkgc2luZ2xldG9uOwotCQotCXB1YmxpYyBmaW5hbCBTZXQgUkVHSVNURVJFRF9OQVRVUkVfSURTID0gbmV3IEhhc2hTZXQoKTsKLQkKLQlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZVJlZ2lzdHJ5IHNpbmdsZXRvbigpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotCQkJc2luZ2xldG9uID0gbmV3IEVNRk5hdHVyZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkvLyByZWdpc3RlciBOYXR1cmUgSURzIGZvciB0aGUgSjJFRU5hdHVyZXMKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHIgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZSA9IHIuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE5BVFVSRV9SRUdJU1RSQVRJT05fUE9JTlQpOwotCQlTdHJpbmcgbmF0dXJlSWQ7Ci0JCWZvciAoaW50IGk9MDsgaTxjZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNlW2ldLmdldE5hbWUoKS5lcXVhbHMoTkFUVVJFKSkgewotCQkJCW5hdHVyZUlkID0gY2VbaV0uZ2V0QXR0cmlidXRlKFNUQVRJQ19JRCk7Ci0JCQkJaWYgKG5hdHVyZUlkICE9IG51bGwpCi0JCQkJCXJlZ2lzdGVyTmF0dXJlSUQobmF0dXJlSWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCWlmICghUkVHSVNURVJFRF9OQVRVUkVfSURTLmNvbnRhaW5zKG5hdHVyZUlkKSkKLQkJCVJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSWQpOwotCQllbHNlCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GTmF0dXJlUmVnaXN0cnlfRVJST1JfMCIsIG5ldyBPYmplY3RbXSB7bmF0dXJlSWR9KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhOGU0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5sczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZW1md29ya2JlbmNoIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQl0cnkge3JldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge3JldHVybiBnZXRTdHJpbmcoa2V5KTt9Ci0KLX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzLCBpbnQgeCkgewotCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL0NoYXJhY3RlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MmIwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlVURjE2OwotIAotCi0vKioKLSAqIFN0YXRpYyBoZWxwZXIgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW4gdGhlIG5ldyBVVEYgbXVsdGktY2hhciBmb3JtYXQuCi0gKiBJdCBpcyBuZWVkZWQgYmVjYXVzZSBJQ1U0SiBjdXJyZW50bHkgZG9lc24ndCBoYW5kbGUgc29tZSBjb3JyZWN0bHkgeWV0IHRoYXQgd2UKLSAqIG5lZWQgdG8gaGF2ZSB3b3JraW5nLiBBcyBJQ1U0SiBnZXRzIHRoZW0gd29ya2luZywgdGhlIG1ldGhvZHMgaGVyZSB3aWxsIGJlY29tZQotICogZGVwcmVjYXRlZC4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJVdGlsIHsKLQotCXByaXZhdGUgQ2hhcmFjdGVyVXRpbCgpIHsKLQkJCi0JfQotCQotCQotCS8qKgotCSAqIFRPRE8gU28gdW50aWwgSUNVNEogZG9lcyB3b3JrIGNvcnJlY3RseSB0aGlzIHV0aWwgd2lsbCBiZSBuZWVkZWQuIEl0IHdpbGwKLQkgKiBzdGF5IGFyb3VuZCBiZWNhdXNlIGl0IGlzIEFQSSwgYnV0IGF0IHRoYXQgdGltZSBpdCB3aWxsIGJlIG1hcmtlZCBkZXByZWNhdGVkLiBJdCBzaG91bGQKLQkgKiBhbHNvIHRoZW4gcmVyb3V0ZSB0byBJQ1U0SiBpbnN0ZWFkIG9mIGRvaW5nIHRoZSBtZXRob2QgcmVmbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQsIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVDsKLQkKLQlzdGF0aWMgewotCQkvLyBUcnkgdG8gZ2V0IHRoZSBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllcihpbnQpIG1ldGhvZC4gSWYgdGhlcmUsIHRoZW4gd2UgYXJlIGluIDEuNSBvciBhYm92ZS4gRWxzZSB1c2UgdGhlIGNoYXIgZm9ybS4KLQkJdHJ5IHsKLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgPSBDaGFyYWN0ZXIuY2xhc3MuZ2V0TWV0aG9kKCJpc0phdmFJZGVudGlmaWVyU3RhcnQiLCBuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gbnVsbDsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gQ2hhcmFjdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNKYXZhSWRlbnRpZmllclBhcnQiLCBuZXcgQ2xhc3NbXSB7SW50ZWdlci5UWVBFfSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCi0JCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBudWxsOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gRGVmYXVsdCB0byB1c2UgKGNoYXIpIHR5cGUgaW5zdGVhZC4KLQkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IG51bGw7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIElzIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBpbnRDaGFyIGludCBjaGFyYWN0ZXIgKFVURiBtdWx0aS1jaGFyIGlzIHZhbGlkKQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBzZWUgQ2hhcmFjdGVyI2lzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyKQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZGVudGlmaWVyU3RhcnQoaW50IGludENoYXIpIHsKLQkJaWYgKE1FVEhPRF9KQVZBX0lERU5USUZJRVJfU1RBUlQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChCb29sZWFuKSBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJULmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge25ldyBJbnRlZ2VyKGludENoYXIpfSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoKGNoYXIpIGludENoYXIpOwotCX0KLQkKLQkvKioKLQkgKiBJcyBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIKLQkgKiBAcGFyYW0gaW50Q2hhciBpbnQgY2hhcmFjdGVyIChVVEYgbXVsdGktY2hhciBpcyB2YWxpZCkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAc2VlIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhcikKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclBhcnQoaW50IGludENoYXIpIHsKLQkJaWYgKE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEJvb2xlYW4pIE1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbnRDaGFyKX0pKS5ib29sZWFuVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoKGNoYXIpIGludENoYXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hhckl0ZXJhdG9yIHsKLQotCQkKLQkJcHJvdGVjdGVkIGZpbmFsIENoYXJTZXF1ZW5jZSBjaGFyU2VxOwotCQlwcml2YXRlIGludCBwb3MgPSAwOwotCQlwcml2YXRlIGludCBsYXN0Q2hhckluZGV4ID0gMDsKLQotCQkvKioKLQkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCi0JCSAqIEBwYXJhbSBjaGFyU2VxCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdENoYXJJdGVyYXRvcihDaGFyU2VxdWVuY2UgY2hhclNlcSkgewotCQkJdGhpcy5jaGFyU2VxID0gY2hhclNlcTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgbmV4dCBjaGFyIGluZGV4LgotCQkgKiBAcGFyYW0gaW5kZXgKLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0JCQlwb3MgPSBpbmRleDsKLQkJfQotCi0JCS8qKgotCQkgKiBIYXMgYW5vdGhlciBjaGFyLgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGFub3RoZXIgY2hhciB0byByZXR1cm4uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gcG9zIDwgY2hhclNlcS5sZW5ndGgoKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEhhcyBhbm90aGVyIGNoYXIgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBEb2luZyBwcmV2aW91cwotCQkgKiB3aWxsIHJldHVybiB0aGUgY2hhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHBvcyA+IDA7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gbmV4dCBjaGFyIGZyb20gdGhlIG9uZSB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgotCQkgKiBAcmV0dXJuIG5leHQgY2hhci4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBuZXh0KCkgewotCQkJaWYgKCFoYXNOZXh0KCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCi0JCQlpbnQgbmV4dCA9IHV0ZkNoYXJBdChwb3MpOwotCQkJbGFzdENoYXJJbmRleCA9IHBvczsKLQkJCXBvcyArPSBVVEYxNi5nZXRDaGFyQ291bnQobmV4dCk7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgVVRGLTMyIGNoYXIgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgotCQkgKiBAcGFyYW0gcG9zCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCB1dGZDaGFyQXQoaW50IHBvcyk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgZnJvbSB0aGUgb25lIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBwcmV2aW91cygpIHsKLQkJCWlmICghaGFzUHJldmlvdXMoKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0KLQkJCWludCBuZXh0OwotCQkJaWYgKFVURjE2LmlzVHJhaWxTdXJyb2dhdGUoY2hhclNlcS5jaGFyQXQoLS1wb3MpKSkgewotCQkJCWlmIChwb3MgPiAwKQotCQkJCQluZXh0ID0gdXRmQ2hhckF0KC0tcG9zKTsKLQkJCQllbHNlCi0JCQkJCW5leHQgPSBjaGFyU2VxLmNoYXJBdChwb3MpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0ID0gY2hhclNlcS5jaGFyQXQocG9zKTsKLQkJCX0KLQkJCWxhc3RDaGFySW5kZXggPSBwb3M7Ci0JCQlyZXR1cm4gbmV4dDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgVVRGMTYgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBjaGFyIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQgZnJvbSBlaXRoZXIKLQkJICogcHJldmlvdXMgb3IgbmV4dC4KLQkJICogVGhpcyBpcyB0aGUgKGNoYXIpIHBvc2l0aW9uIG5vdCB0aGUKLQkJICogcG9zaXRpb24gb2YgbG9naWNhbCBpbnQgY2hhcnMgcmV0dXJuZWQuIEZvciBleGFtcGxlIGEgc3RhbmRhcmQgc3RyaW5nIG9mCi0JCSAqIDxjb2RlPiJhYmMiPC9jb2RlPiB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXIgJ2InIGlzIDEuIEJ1dCB0YWtlIHRoZSBzdHJpbmcKLQkJICogPGNvZGU+ImFiMWIyYyI8L2NvZGU+IHdoZXJlICJiMWIyIiBpcyBvbmUgVVRGLTMyIGNoYXIsIHRoZW4gdGhlIHBvc2l0aW9uCi0JCSAqIG9mICdjJyBpcyAzLiBJdCB3b3VsZCBub3QgYmUgMiwgd2hpY2ggaXMgd2hhdCB0aGUgbG9naWNhbCBjaGFyIHBvc2l0aW9uCi0JCSAqIHdvdWxkIGJlIGlmIHRha2luZyBVRlQzMiBpbnRvIGFjY291bnQuCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjIuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJCXJldHVybiBsYXN0Q2hhckluZGV4OwotCQl9Ci0JCi0JfQotCQotCS8qKgotCSAqIFNwZWNpYWwgY2hhciBpdGVyYXRvciB0aGF0IHJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGNoYXJzIGZvcgotCSAqIHdhbGtpbmcgc3RyaW5ncyB0aGF0IGNhbiBjb250YWluIFVURiBtdWx0aS1jaGFycy4gVGhpcyBpcwotCSAqIGEgbGltaXRlZCB2ZXJzaW9uIG9mIHtAbGluayBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3J9LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7Ci0JCQotCi0JCS8qKgotCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KLQkJICogQHBhcmFtIHN0cgotCQkgKiAKLQkJICogQHNpbmNlIDEuMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nSXRlcmF0b3IoU3RyaW5nIHN0cikgewotCQkJc3VwZXIoc3RyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuQWJzdHJhY3RDaGFySXRlcmF0b3IjdXRmQ2hhckF0KGludCkKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgdXRmQ2hhckF0KGludCBwb3MpIHsKLQkJCXJldHVybiBVVEYxNi5jaGFyQXQoKFN0cmluZykgY2hhclNlcSwgcG9zKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBjaGFyIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBpbnRzIGluc3RlYWQgb2YgY2hhcnMgZm9yCi0JICogd2Fsa2luZyBzdHJpbmdzIHRoYXQgY2FuIGNvbnRhaW4gVVRGIG11bHRpLWNoYXJzLiBUaGlzIGlzCi0JICogYSBsaW1pdGVkIHZlcnNpb24gb2Yge0BsaW5rIGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcn0uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdCdWZmZXJJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0Q2hhckl0ZXJhdG9yIHsKLQkJCi0KLQkJLyoqCi0JCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgotCQkgKiBAcGFyYW0gc3RyQnVmZmVyCi0JCSAqIAotCQkgKiBAc2luY2UgMS4yLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmdCdWZmZXJJdGVyYXRvcihTdHJpbmdCdWZmZXIgc3RyQnVmZmVyKSB7Ci0JCQlzdXBlcihzdHJCdWZmZXIpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuQ2hhcmFjdGVyVXRpbC5BYnN0cmFjdENoYXJJdGVyYXRvciN1dGZDaGFyQXQoaW50KQotCQkgKi8KLQkJcHJvdGVjdGVkIGludCB1dGZDaGFyQXQoaW50IHBvcykgewotCQkJcmV0dXJuIFVURjE2LmNoYXJBdCgoU3RyaW5nQnVmZmVyKSBjaGFyU2VxLCBwb3MpOwotCQl9Ci0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhZjJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjMgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKLSAqLwotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnN0YW50aWF0aW9uIHRvIHVzZSBpZiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBwbHVnaW4gaXMgbm90IGluc3RhbGxlZC4gSXQgYmFzaWNhbGx5IGRvZXMgbm90aGluZy4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7Ci0KLQkvKgotCSAqIE9ubHkgaW5zdGFudGlhdGVkIGZyb20gdGhpcyBwYWNrYWdlLgotCSAqLwotCU5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCX0KLQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmYzYTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLklQZXJmb3JtYW5jZU1vbml0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgd3JhcHBlciB0byB0aGUgSVBlcmZvcm1hbmNlTW9uaXRvciB0aGF0IGhpZGVzIGl0IHNvIHRoYXQgdGhlIGFjdHVhbCBwbHVnaW4gY2FuIGJlIG9wdGlvbmFsIGFuZCBub3QgcmVxdWlyZWQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCS8qKgotCSAqIEV2ZW50IGZvciBQZXJmb3JtYW5jZUxpc3RlbmVyIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcmZvcm1hbmNlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2ODAwNzE0NjI3NTAxODAzMzlMOwotCi0JCVBlcmZvcm1hbmNlRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHN0ZXApIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlzbmFwc2hvd1dpdGhUeXBlcyA9IGZhbHNlOwotCQkJdGhpcy5zdGVwID0gc3RlcDsKLQkJCXRoaXMudHlwZXMgPSAwOwkvLyBOb3Qgc2V0LgotCQl9Ci0JCQotCQlQZXJmb3JtYW5jZUV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBzdGVwLCBpbnQgdHlwZXMpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlzbmFwc2hvd1dpdGhUeXBlcyA9IHRydWU7Ci0JCQl0aGlzLnN0ZXAgPSBzdGVwOwotCQkJdGhpcy50eXBlcyA9IHR5cGVzOwotCQl9Ci0KLQkJCi0JCS8qKgotCQkgKiBTbmFwc2hvdCB3aXRoIHR5cGVzIGlmIDxjb2RlPnRydWU8L2NvZGU+LgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBib29sZWFuIHNuYXBzaG93V2l0aFR5cGVzOwotCi0JCS8qKgotCQkgKiBTdGVwIG9mIHNuYXBzaG90Ci0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIGZpbmFsIGludCBzdGVwOwotCQkKLQkJLyoqCi0JCSAqIHR5cGVzIG9mIHNuYXBzaG90LgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXB1YmxpYyBmaW5hbCBpbnQgdHlwZXM7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1hbmNlIExpc3RlbmVyIGludGVyZmFjZQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgUGVyZm9ybWFuY2VMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBTbmFwc2hvdCB3YXMgY2FsbGVkLgotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc25hcHNob3QoUGVyZm9ybWFuY2VFdmVudCBldmVudCk7Ci0JfQotCQotCXByaXZhdGUgUGVyZm9ybWFuY2VMaXN0ZW5lcltdIGxpc3RlbmVyczsKLQotCXB1YmxpYyBpbnRlcmZhY2UgVHlwZXMgewotCi0JCS8qKgotCQkgKiAxIC0gV3JpdGUgb3V0IHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGVzZSBpbmNsdWRlIHdvcmtpbmcgc2V0LCBwZWFrIHdvcmtpbmcgc2V0LCBlbGFwc2VkIHRpbWUsIHVzZXIgdGltZSwgYW5kCi0JCSAqIGtlcm5lbCB0aW1lLgotCQkgKi8KLQkJaW50IE9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5PcGVyYXRpbmdTeXN0ZW1Db3VudGVyczsKLQotCQkvKioKLQkJICogMiAtIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIGluZm8uIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdGhlIHRvdGFsIGNvbW1pdHRlZCBtZW1vcnkgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgotCQkgKiAKLQkJICogVGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBHZXRQZXJmb3JtYW5jZUluZm8oKSBmdW5jdGlvbiBiZWluZyBhdmFpbGFibGUgaW4gdGhlIFdpbmRvd3MgcHNhcGkuZGxsLiBUaGlzIGlzIGF2YWlsYWJsZSBpbiBYUCBidXQgaXMgdXN1YWxseQotCQkgKiBub3QgYXZhaWxhYmxlIGluIFdpbi8yMDAwLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCi0JCSAqLwotCQlpbnQgR2xvYmFsU3lzdGVtQ291bnRlcnMgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkdsb2JhbFN5c3RlbUNvdW50ZXJzOwotCi0JCS8qKgotCQkgKiA0IC0gV3JpdGUgb3V0IHRoZSBzaXplIG9mIHRoZSBKYXZhIEhlYXAuCi0JCSAqLwotCQlpbnQgSmF2YUhlYXBTaXplID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5KYXZhSGVhcFNpemU7Ci0KLQkJLyoqCi0JCSAqIDggLSBXcml0ZSBvdXQgaG93IG11Y2ggb2YgdGhlIEphdmEgaGVhcCBpcyBiZWluZyB1c2VkLiBUaGlzIGNhbGxzIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBzbyBpdCBtYXkgc2tldyB0aW1pbmcgcmVzdWx0cy4KLQkJICovCi0JCWludCBKYXZhSGVhcFVzZWQgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkphdmFIZWFwVXNlZDsKLQotCQkvKioKLQkJICogMTYgLSBUaGUgcGx1Z2luIHN0YXJ0dXAgYW5kIHNpemUgaW5mb3JtYXRpb24uCi0JCSAqLwotCQlpbnQgUGx1Z2luSW5mbyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuUGx1Z2luSW5mbzsKLQotCQkvKiogMHhmZmZmIC0gRXZlcnl0aGluZy4gKi8KLQkJaW50IEFsbCA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuQWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgc2hhcmVkTW9uaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCBnZXRNb25pdG9yKCkgewotCQlpZiAoc2hhcmVkTW9uaXRvciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUNsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5QZXJmTXNyQ29yZVBsdWdpbiIpOyAvLyBUaGlzIGp1c3QgdGVzdHMgaWYgdGhlIHBlcmZvcm1hbmNlIHBsdWdpbiBpcyBhdmFpbGFibGUuIFRocm93cyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJCQkJIC8vIGV4Y2VwdGlvbiBvdGhlcndpc2UuCi0JCQkJQ2xhc3MgcHJlc2VudENsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuamVtLnV0aWwuUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciIpOyAvLyBHZXQgdGhlIGNsYXNzIHdlIHVzZSB3cmFwcGVyIGl0LiAvLyROT04tTkxTLTEkCi0JCQkJc2hhcmVkTW9uaXRvciA9IChQZXJmb3JtYW5jZU1vbml0b3JVdGlsKSBwcmVzZW50Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQlpZiAoIXNoYXJlZE1vbml0b3IuaXNWYWxpZCgpKQotCQkJCQlzaGFyZWRNb25pdG9yID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGFueSBydW50aW1lIGV4Y2VwdGlvbiwganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGNsYXNzIG5vdCBmb3VuZCwgdGhlbiBwbHVnaW4gbm90IGF2YWlsYWJsZSwgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIFByb2JsZW0gaW5zdGFudGlhdGluZywgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCS8vIFNvbWUgaWxsZWdhbCBhY2Nlc3MsIHNvIGp1c3QgdXNlIHRoZSBub3QgcHJlc2VudCBvbmUuCi0JCQl9Ci0JCQlpZiAoc2hhcmVkTW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJLy8gQ291bGRuJ3QgZ2V0IHRoZSBwZXJmb3JtYW5jZSBvbmUgZm9yIHNvbWUgcmVhc29uLiBVc2Ugbm90IHByZXNlbnQgb25lIGluc3RlYWQuCi0JCQkJc2hhcmVkTW9uaXRvciA9IG5ldyBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNoYXJlZE1vbml0b3I7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFyaWF0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3QuCi0JICogCi0JICogQHBhcmFtIHZhcgotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG9mIHZhcmlhdGlvbiBudW1iZXJzCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpOwotCi0JLyoqCi0JICogVGFrZSBhIHNuYXBzaG90IG9mIHNvbWUgZGVmYXVsdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHN0ZXAKLQkgKiAgICAgICAgICAgIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzbmFwc2hvdChpbnQgc3RlcCkgewotCQlkb1NuYXBzaG90KHN0ZXApOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCi0JCQlub3RpZnlTbmFwc2hvdChuZXcgUGVyZm9ybWFuY2VFdmVudCh0aGlzLCBzdGVwKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlTbmFwc2hvdChQZXJmb3JtYW5jZUV2ZW50IGV2ZW50KSB7Ci0JCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBsaXN0ID0gbGlzdGVuZXJzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RbaV0uc25hcHNob3QoZXZlbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERvIHRoZSBhY3R1YWwgc25hcHNob3QKLQkgKiBAcGFyYW0gc3RlcAotCSAqIAotCSAqIEBzZWUgI3NuYXBzaG90KGludCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKTsKLQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VsZWN0ZWQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwCi0JICogICAgICAgICAgICB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICogCi0JICogQHBhcmFtIHR5cGVzCi0JICogICAgICAgICAgICBUaGlzIGNvbnRyb2xzIHdoaWNoIG1lYXN1cmVtZW50cyBhcmUgc2VsZWN0ZWQuIEl0IGlzIGFuIG9yJ2QgdG9nZXRoZXIgbGlzdCBvZiB0aGUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcyBjb25zdGFudHMuCi0JICogCi0JICogQHNlZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgc25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgewotCQlkb1NuYXBzaG90KHN0ZXAsIHR5cGVzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJbm90aWZ5U25hcHNob3QobmV3IFBlcmZvcm1hbmNlRXZlbnQodGhpcywgc3RlcCwgdHlwZXMpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBEbyB0aGUgYWN0dWFsIHNuYXBzaG90Ci0JICogQHBhcmFtIHN0ZXAKLQkgKiAKLQkgKiBAc2VlICNzbmFwc2hvdChpbnQsIGludCkKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpOwkKLQkKLQkvKioKLQkgKiBBZGQgbGlzdGVuZXIgdG8gbGlzdC4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQZXJmb3JtYW5jZUxpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZpbmRMaXN0ZW5lcihsaXN0ZW5lcikgIT0gLTEpCi0JCQlyZXR1cm47Ci0JCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBuZXdMaXN0ID0gbmV3IFBlcmZvcm1hbmNlTGlzdGVuZXJbbGlzdGVuZXJzICE9IG51bGwgPyBsaXN0ZW5lcnMubGVuZ3RoKzEgOiAxXTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKQotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIG5ld0xpc3QsIDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCQluZXdMaXN0W25ld0xpc3QubGVuZ3RoLTFdID0gbGlzdGVuZXI7Ci0JCWxpc3RlbmVycyA9IG5ld0xpc3Q7Ci0JfQotCQotCXByaXZhdGUgaW50IGZpbmRMaXN0ZW5lcihQZXJmb3JtYW5jZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKQotCQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJmb3JtYW5jZUxpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaW50IGluZGV4ID0gZmluZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQZXJmb3JtYW5jZUxpc3RlbmVyW10gbmV3TGlzdCA9IG5ldyBQZXJmb3JtYW5jZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdCwgMCwgaW5kZXgpOwotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIGluZGV4KzEsIG5ld0xpc3QsIGluZGV4LCBuZXdMaXN0Lmxlbmd0aC1pbmRleCk7Ci0JCQlsaXN0ZW5lcnMgPSBuZXdMaXN0OwotCQl9Ci0JfQotCS8qKgotCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHVwbG9hZGhvc3QsIHVwbG9hZHBvcnQgYW5kIHVwbG9hZHVzZXJpZAotCSAqIGhhdmUgYmVlbiBjb25maWd1cmVkIGJlZm9yZSBoYW5kLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbil7cmV0dXJuIGZhbHNlO30KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDIxY2Q1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuSVBlcmZvcm1hbmNlTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgdmVyc2lvbiB1c2VkIHdoZW4gdGhlIHBlcmZvcm1hbmNlIHBsdWdpbiBpcyBhdmFpbGFibGUuCi0gKiAKLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvciBleHRlbmRzIFBlcmZvcm1hbmNlTW9uaXRvclV0aWwgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCN1cGxvYWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiBtb25pdG9yLnVwbG9hZChkZXNjcmlwdGlvbikuc3VjY2VzczsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGVyZm9ybWFuY2VNb25pdG9yIG1vbml0b3I7Ci0KLQkvKgotCSAqIFNvIHRoYXQgb25seSBpbnN0YW50aWF0ZWQgYnkgdGhpcyBwYWNrYWdlLgotCSAqLwotCVByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKSB7Ci0JCW1vbml0b3IgPSBQZXJmTXNyQ29yZVBsdWdpbi5nZXRQZXJmb3JtYW5jZU1vbml0b3IodHJ1ZSk7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjaXNWYWxpZCgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuIG1vbml0b3IgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjc2V0VmFyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpIHsKLQkJbW9uaXRvci5zZXRWYXIodmFyKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXApIHsKLQkJbW9uaXRvci5zbmFwc2hvdChzdGVwKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2RvU25hcHNob3QoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKSB7Ci0JCW1vbml0b3Iuc25hcHNob3Qoc3RlcCwgdHlwZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlODI3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZWdpc3RyeVJlYWRlci5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIENsYXNzIHRvIHJlYWQgYSByZWdpc3RyeS4gSXQgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCB0byBwcm92aWRlIHNwZWNpZmljIGZ1bmN0aW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCVN0cmluZyBwbHVnaW5JZDsKLQotCVN0cmluZyBleHRlbnNpb25Qb2ludElkOwotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIHN5c3RlbUJ1bmRsZTsKLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcGx1Z2luIGlkIG9mIGEgY29uZmlndWF0aW9uIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKiBAcmV0dXJuIHBsdWdpbiBpZCBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKLQotCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotCQkJCXBsdWdpbklkID0gZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZWdpc3RyeVJlYWRlciB0YWtpbmcgYSByZWdpc3RyeSwgcGx1Z2luIGlkLCBhbmQgZXh0ZW5zaW9uIHBvaW50IGlkLgotCSAqIAotCSAqIEBwYXJhbSByZWdpc3RyeQotCSAqIEBwYXJhbSBwbHVnaW5JRAotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSBSZWdpc3RyeVJlYWRlcihwbHVnaW4sIGV4dGVuc2lvblBvaW50KSBpbnN0ZWFkLiBUaGUgcmVnaXN0cnkgcGFzc2VkIGluIGlzIGlnbm9yZWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UmVhZGVyKElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJdGhpcyhwbHVnaW5JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZWdpc3RyeVJlYWRlciB0YWtpbmcgdGhlIHBsdWdpbiBpZCBhbmQgZXh0ZW5zaW9uIHBvaW50IGlkLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW5JRAotCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSUQ7Ci0JCWV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlib29sZWFuIHJlY29nbml6ZWQgPSB0aGlzLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotCQlpZiAoIXJlY29nbml6ZWQpIHsKLQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJFcnJvciBwcm9jZXNzaW5nIGV4dGVuc2lvbjogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSBkZXNrdG9wIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogTG9ncyBhIHZlcnkgY29tbW9uIHJlZ2lzdHJ5IGVycm9yIHdoZW4gYSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMgbWlzc2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiUmVxdWlyZWQgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInIG5vdCBkZWZpbmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qCi0JICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlYWQgZWxlbWVudCBhdHRyaWJ1dGVzLiBJZiB0aGlzIGVsZW1lbnQgaGFzIHN1YmVsZW1lbnRzLCB0aGUgcmVhZGVyIHdpbGwgcmVjdXJzaXZlbHkgY3ljbGUgdGhyb3VnaCB0aGVtIGFuZCBjYWxsIHRoaXMKLQkgKiBtZXRob2Qgc28gZG9uJ3QgZG8gaXQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBleHRlbnNpb24gcG9pbnQgYW5kIHBhcnNlIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRvIHNlZSBpZiBpdCBpcyB2YWxpZCBhdCB0aGlzIHBvaW50IGluIHRpbWUgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLiBBIHZhbGlkIHJlYXNvbiBub3QgdG8gd291bGQgYmUgdGhhdCB0aGUgd29ya3NwYWNlIGlzCi0JICogc2h1dHRpbmcgZG9udy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgdmFsaWQgcG9pbnQgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChQbGF0Zm9ybS5pc1J1bm5pbmcoKSAmJiBnZXRTeXN0ZW1CdW5kbGUoKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5TVE9QUElORykKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzeXN0ZW0gYnVuZGxlCi0JICogCi0JICogQHJldHVybiBzeXN0ZW0gYnVuZGxlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnVuZGxlIGdldFN5c3RlbUJ1bmRsZSgpIHsKLQkJaWYgKHN5c3RlbUJ1bmRsZSA9PSBudWxsKQotCQkJc3lzdGVtQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN5c3RlbUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyNGY3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4yCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lclRlc3RzIHsKLQotCS8qKgotCSAqIERlZmF1bHQgVGltZXJUZXN0cyBjbGFzcyB0byB1c2Ugd2hlbiBub3QgdXNpbmcgeW91ciBvd24uIEl0J3MgYSBnbG9iYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUaW1lclRlc3RzIGJhc2ljVGVzdCA9IG5ldyBUaW1lclRlc3RzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1BBUkVOVF9JRCA9ICJjdXJyZW50IHBhcmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRQYXJlbnRJZCA9IG51bGw7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGltZXJTdGVwIHsKLQkJc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RPUCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfQ1VNVUxBVElWRSA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgU1RPUF9DVU1VTEFUSVZFID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBTVEFSVF9BQ0NVTVVMQVRJTkcgPSA0OwotCQlzdGF0aWMgZmluYWwgaW50IFNUT1BfQUNDVU1VTEFUSU5HID0gNTsKLQkJcHJvdGVjdGVkIFN0cmluZyBpZDsKLQkJcHJvdGVjdGVkIGludCB0eXBlOwotCQlwcm90ZWN0ZWQgbG9uZyBjdXJyZW50VGltZTsKLQkJcHJvdGVjdGVkIGludCB0aHJlYWRJZDsKLX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRlc3RPbiA9IGZhbHNlOwotCXByb3RlY3RlZCBMaXN0IHN0ZXBzOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlUaW1lclN0ZXAgc3RlcCA9IGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUKTsKLQkJcmV0dXJuIHN0ZXAgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGltZXJTdGVwIGNyZWF0ZVRpbWVyU3RlcChTdHJpbmcgaWQsIGludCBzdGVwVHlwZSkgewotCQlUaW1lclN0ZXAgbmV3U3RlcCA9IG5ldyBUaW1lclN0ZXAoKTsKLQkJbmV3U3RlcC50aHJlYWRJZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaGFzaENvZGUoKTsKLQkJbmV3U3RlcC5pZCA9IGlkOwotCQluZXdTdGVwLnR5cGUgPSBzdGVwVHlwZTsKLQkJbmV3U3RlcC5jdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlzdGVwcy5hZGQobmV3U3RlcCk7Ci0KLQkJcmV0dXJuIG5ld1N0ZXA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTdGVwKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCQlUaW1lclN0ZXAgc3RlcCA9IGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1ApOwotCQlyZXR1cm4gc3RlcCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydEFjY3VtdWxhdGluZyhTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlRfQUNDVU1VTEFUSU5HKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wQWNjdW11bGF0aW5nKFN0cmluZyBpZCkgewotCQlpZiAoIXRlc3RPbikKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVE9QX0FDQ1VNVUxBVElORykgIT0gbnVsbDsKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoU3RyaW5nIGlkKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUQVJUX0NVTVVMQVRJVkUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BDdW11bGF0aXZlU3RlcChTdHJpbmcgaWQpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1BfQ1VNVUxBVElWRSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdGVzdHMgc28gdGhhdCB5b3UgY2FuIHJlc3RhcnQgYW5kIGRvIHNvbWUgbW9yZSB0ZXN0cy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUZXN0cygpIHsKLQkJaWYgKCF0ZXN0T24pCi0JCQlyZXR1cm47Ci0JCXN0ZXBzLmNsZWFyKCk7Ci0JCWN1cnJlbnRQYXJlbnRJZCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVHVybiB0aGlzIHRlc3Qgb24uIElmIG5vdCB0dXJuZWQgb24gdGhlbiBhbGwgY2FsbHMgd2lsbCBxdWlja2x5IHJldHVybiB3aXRoIG5vIGVycm9ycy4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdG8gc3RheSBpbiBwbGFjZSBldmVuIHdoZW4gbm90Ci0JICogZGVidWdnaW5nLgotCSAqIDxwPgotCSAqIFdoZW4gdHVybmVkIG9mZiwgaXQgd2lsbCBjbGVhciB0aGUgdGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdGVzdFN0YXRlKGJvb2xlYW4gb24pIHsKLQkJaWYgKG9uID09IHRlc3RPbikKLQkJCXJldHVybjsKLQkJaWYgKG9uKSB7Ci0JCQl0ZXN0T24gPSB0cnVlOwotCQkJaWYgKHN0ZXBzID09IG51bGwpCi0JCQkJc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXN0T24gPSBmYWxzZTsKLQkJCXN0ZXBzID0gbnVsbDsKLQkJfQotCQljdXJyZW50UGFyZW50SWQgPSBudWxsOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDdW11bGF0aXZlSW5mb3JtYXRpb24gewotCQlwdWJsaWMgVGltZXJTdGVwIGN1cnJlbnRDdW11bGF0aXZlU3RlcDsKLQkJcHVibGljIGxvbmcgY3VtVGltZTsKLQkJcHVibGljIGludCBjdW1Db3VudDsKLQkJcHVibGljIGludCBjdW1Db3VudE5vblplcm87Ci0JCXB1YmxpYyBsb25nIG1heFRpbWU7Ci0JCXB1YmxpYyBsb25nIG1pblRpbWUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJcHVibGljIGxvbmcgbWluVGltZU5vblplcm8gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHByaW50SXQoKSB7Ci0JCWlmICghdGVzdE9uKQotCQkJcmV0dXJuOwotCQlpZiAoc3RlcHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTWFwIHN0ZXBJbmZvQnlUaHJlYWRJZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBpbmRlbnRzQnlUaHJlYWRJZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBjdW1TdGVwczsKLQkJVGltZXJTdGVwIHByZXZTdGVwID0gbnVsbDsKLQkJVGltZXJTdGVwIHN0YXJ0U3RlcDsKLQkJTnVtYmVyRm9ybWF0IHBlcmNlbnRGb3JtYXR0ZXIgPSBOdW1iZXJGb3JtYXQuZ2V0UGVyY2VudEluc3RhbmNlKCk7Ci0JCWRvdWJsZSB0b3RhbFRpbWUgPSAwOwotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTUwKTsKLQkJaWYgKHN0ZXBzLnNpemUoKSA+IDIpewotCQkJdG90YWxUaW1lID0gKChUaW1lclN0ZXApc3RlcHMuZ2V0KHN0ZXBzLnNpemUoKS0xKSkuY3VycmVudFRpbWUgLSAoKFRpbWVyU3RlcClzdGVwcy5nZXQoMCkpLmN1cnJlbnRUaW1lOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCVRpbWVyU3RlcCBzdGVwID0gKFRpbWVyU3RlcCkgc3RlcHMuZ2V0KGkpOwotCQkJSW50ZWdlciB0aHJlYWRJZCA9IG5ldyBJbnRlZ2VyKHN0ZXAudGhyZWFkSWQpOwotCQkJc3dpdGNoIChzdGVwLnR5cGUpIHsKLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVDoKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QOgotCQkJCQlJbnRlZ2VyIHRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpbnQgaW5kZW50ID0gMDsKLQkJCQkJaWYgKHN0ZXAudHlwZSA9PSBUaW1lclN0ZXAuU1RBUlQpIHsKLQkJCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKSArIDE7Ci0JCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIG5ldyBJbnRlZ2VyKGluZGVudCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOwotCQkJCQkJaWYgKGluZGVudCA+IDApCi0JCQkJCQkJaW5kZW50c0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBuZXcgSW50ZWdlcihpbmRlbnQgLSAxKSk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5yZW1vdmUodGhyZWFkSWQpOwotCQkJCQkJCWluZGVudCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7Ci0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOwotCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7Ci0JCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN3aXRjaCAoc3RlcC50eXBlKSB7Ci0JCQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVDoKLQkJCQkJCQlzdHJiLmFwcGVuZCgiU3RhcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCi0JCQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QOgotCQkJCQkJCXN0cmIuYXBwZW5kKCJTdG9wICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNYXAgc3RhcnRTdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoc3RhcnRTdGVwcyA9PSBudWxsKQotCQkJCQkJc3RlcEluZm9CeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgc3RhcnRTdGVwcyA9IG5ldyBIYXNoTWFwKCkpOwotCQkJCQlpZiAoc3RlcC50eXBlID09IFRpbWVyU3RlcC5TVEFSVCkgewotCQkJCQkJLy8gU3RvcmUgdGhlIHN0YXJ0IHN0ZXAgZm9yIGxhdGVyIGxvb2t1cCB3aGVuIGNhbHVsYXRpbmcgdGhlIHRvdGFsIHRpbWUKLQkJCQkJCXN0YXJ0U3RlcHMucHV0KHN0ZXAuaWQsIHN0ZXApOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gVGhpcyBpcyB0aGUgc3RvcCB0aW1lIGZvciBhIHN0ZXAuIFdlIG5lZWQgdG8gZmluZAotCQkJCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgdGltZSBhbmQgY2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lLgotCQkJCQkJT2JqZWN0IGl0ZW0gPSBzdGFydFN0ZXBzLnJlbW92ZShzdGVwLmlkKTsKLQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVGltZXJTdGVwKSB7Ci0JCQkJCQkJc3RhcnRTdGVwID0gKFRpbWVyU3RlcCkgaXRlbTsKLQkJCQkJCQlpZiAoc3RhcnRTdGVwICE9IG51bGwpIHsKLQkJCQkJCQkJaW50IGFkZGNoYXJzID0gMTAwIC0gc3RyYi5sZW5ndGgoKTsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhZGRjaGFyczsgaisrKSB7Ci0JCQkJCQkJCQlzdHJiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJbG9uZyBkZWx0YSA9IHN0ZXAuY3VycmVudFRpbWUgLSBzdGFydFN0ZXAuY3VycmVudFRpbWU7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgVG90YWwgPSAiICsgZGVsdGEgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlpZiAodG90YWxUaW1lID4gMCkKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAiICsgcGVyY2VudEZvcm1hdHRlci5mb3JtYXQoZGVsdGEvdG90YWxUaW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgIC0tLT4gQ291bGRuJ3QgZmluZCBTdGFydGluZyBwb2ludCBmb3IgXCIiICsgc3RlcC5pZCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlwcmV2U3RlcCA9IHN0ZXA7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIFRpbWVyU3RlcC5TVEFSVF9BQ0NVTVVMQVRJTkc6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyA9PSBudWxsKQotCQkJCQkJc3RlcEluZm9CeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgY3VtU3RlcHMgPSBuZXcgSGFzaE1hcCgpKTsKLQkJCQkJY3VtU3RlcHMucHV0KHN0ZXAuaWQsIG5ldyBDdW11bGF0aXZlSW5mb3JtYXRpb24oKSk7Ci0JCQkJCXRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpbmRlbnQgPSAwOwotCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCi0JCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKLQkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7Ci0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOwotCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7Ci0JCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXN0cmIuYXBwZW5kKCJTdGFydCBBY2N1bXVsYXRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7Ci0JCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXByZXZTdGVwID0gc3RlcDsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUX0NVTVVMQVRJVkU6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKLQkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKQotCQkJCQkJCSgoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvKS5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgPSBzdGVwOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCQkKLQkJCQljYXNlIFRpbWVyU3RlcC5TVE9QX0NVTVVMQVRJVkU6Ci0JCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7Ci0JCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKLQkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSB7Ci0JCQkJCQkJQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIGN1bUluZm8gPSAoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvOwotCQkJCQkJCWlmIChjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcCAhPSBudWxsKSB7Ci0JCQkJCQkJCWN1bUluZm8uY3VtQ291bnQrKzsKLQkJCQkJCQkJbG9uZyBkZWx0YSA9IHN0ZXAuY3VycmVudFRpbWUgLSBjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcC5jdXJyZW50VGltZTsKLQkJCQkJCQkJY3VtSW5mby5jdW1UaW1lICs9IGRlbHRhOwotCQkJCQkJCQlpZiAoY3VtSW5mby5tYXhUaW1lIDwgZGVsdGEpCi0JCQkJCQkJCQljdW1JbmZvLm1heFRpbWUgPSBkZWx0YTsKLQkJCQkJCQkJaWYgKGRlbHRhIDwgY3VtSW5mby5taW5UaW1lKQotCQkJCQkJCQkJY3VtSW5mby5taW5UaW1lID0gZGVsdGE7Ci0JCQkJCQkJCWlmIChkZWx0YSAhPSAwKSB7Ci0JCQkJCQkJCQljdW1JbmZvLmN1bUNvdW50Tm9uWmVybysrOwotCQkJCQkJCQkJaWYgKGRlbHRhIDwgY3VtSW5mby5taW5UaW1lTm9uWmVybykKLQkJCQkJCQkJCQljdW1JbmZvLm1pblRpbWVOb25aZXJvID0gZGVsdGE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJCQotCQkJCWNhc2UgVGltZXJTdGVwLlNUT1BfQUNDVU1VTEFUSU5HOgotCQkJCQl0aHJlYWRJbmRlbnQgPSAoSW50ZWdlcikgaW5kZW50c0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKLQkJCQkJaW5kZW50ID0gMDsKLQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQotCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7Ci0JCQkJCXN0cmIuc2V0TGVuZ3RoKDApOwotCQkJCQlzdHJiLmFwcGVuZChzdGVwLmN1cnJlbnRUaW1lKTsKLQkJCQkJc3RyYi5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgewotCQkJCQkJc3RyYi5hcHBlbmQoIiAgICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzdHJiLmFwcGVuZCgiU3RvcCAgQWNjdW11bGF0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyYi5hcHBlbmQoIiBcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0cmIuYXBwZW5kKHN0ZXAuaWQpOwotCQkJCQlzdHJiLmFwcGVuZCgiXCIgICBpZCgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHJiLmFwcGVuZChzdGVwLnRocmVhZElkKTsKLQkJCQkJc3RyYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljdW1TdGVwcyA9IChNYXApIHN0ZXBJbmZvQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOwotCQkJCQlpZiAoY3VtU3RlcHMgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGluZm8gPSBjdW1TdGVwcy5nZXQoc3RlcC5pZCk7Ci0JCQkJCQlpZiAoaW5mbyBpbnN0YW5jZW9mIEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgewotCQkJCQkJCUN1bXVsYXRpdmVJbmZvcm1hdGlvbiBjdW1JbmZvID0gKEN1bXVsYXRpdmVJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQkJCQlpZiAoY3VtSW5mby5jdXJyZW50Q3VtdWxhdGl2ZVN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgY3VtdWxhdGl2ZSB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtVGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBjdW11bGF0aXZlIGNvdW50PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8uY3VtQ291bnQpOwotCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWF4IHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5tYXhUaW1lKTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1pbiB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWluVGltZSk7Ci0JCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBhdmcgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlzdHJiLmFwcGVuZCgoKGRvdWJsZSkgY3VtSW5mby5jdW1UaW1lKS9jdW1JbmZvLmN1bUNvdW50KTsKLQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIE5vblplcm8gdGltZXM6IGN1bXVsYXRpdmUgfjAgY291bnQ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1Db3VudE5vblplcm8pOwotCQkJCQkJCQlpZiAoY3VtSW5mby5jdW1Db3VudE5vblplcm8gIT0gMCkgewotCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIG1pbiB+MCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1pblRpbWVOb25aZXJvKTsKLQkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBhdmcgfjAgdGltZT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJc3RyYi5hcHBlbmQoKChkb3VibGUpIGN1bUluZm8uY3VtVGltZSkgLyBjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcHJldlN0ZXAgPSBzdGVwOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTU4ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFVJQ29udGV4dERldGVybWluYXRpb24uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDcvMDQvMTAgMDE6MDk6MzYgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciBVSUNvbnRleHQgZGV0ZXJtaW5hdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUNvbnRleHREZXRlcm1pbmF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMTAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRExFU1NfQ09OVEVYVF9MSVRFUkFMID0gIkhlYWRsZXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9MSVRFUkFMID0gIlVJIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBRExFU1NfQ09OVEVYVCA9IDEwMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJX0NPTlRFWFQgPSAxMDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY2FjaGVkRXh0ZW5zaW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY3VycmVudENvbnRleHQgPSBVTktOT1dOOwotCi0JcHJpdmF0ZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyBiYXNlZCBvbiB0aGUgVUkgb3IgSGVhZGxlc3MgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBuZXcgY2xhc3MgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUga2V5IGlzIGludmFsaWQgKGUuZy4gbm8gZXh0ZW5zaW9uIGlzIGZvdW5kIGZvciB0aGUga2V5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUluc3RhbmNlKFN0cmluZyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpCi0JCQlpbml0RXh0ZW5zaW9ucygpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29udGV4dFNlbnNpdGl2ZUNsYXNzID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY2FjaGVkRXh0ZW5zaW9ucy5nZXQoa2V5KTsKLQkJdHJ5IHsKLQkJCWlmIChjb250ZXh0U2Vuc2l0aXZlQ2xhc3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLQkJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlci5VSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NMQVNTTkFNRV9BVFRSKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlByb2JsZW0gbG9hZGluZyBleHRlbnNpb24gbm90IGZvdW5kIGZvciBrZXkgXCIiICsga2V5ICsgIlwiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkV4dGVuc2lvbiBub3QgZm91bmQgZm9yIGtleSBcIiIgKyBrZXkgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGV4dCAtLSBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBpZiBuZWNlc3NhcnkuCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IGNvbnRleHQKLQkgKiBAc2VlICNIRUFETEVTU19DT05URVhUCi0JICogQHNlZSAjVUlfQ09OVEVYVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEN1cnJlbnRDb250ZXh0KCkgewotCQlpZiAoY3VycmVudENvbnRleHQgPT0gVU5LTk9XTikgewotCQkJY3VycmVudENvbnRleHQgPSBIRUFETEVTU19DT05URVhUOwotCQkJbmV3IFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudENvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiBJbnZva2VzIHRoZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIgdG8gY2FjaGUgYWxsIG9mIHRoZSBleHRlbnNpb25zLCBpZiBuZWNlc3NhcnkuCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChjYWNoZWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCWNhY2hlZEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbmV3IFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gb25lIG9mIFVJX0NPTlRFWFQgb3IgSEVBRExFU1NfQ09OVEVYVC4gRGVmYXVsdHMgdG8gSEVBRExFU1Mgb24gaW52YWxpZCBpbnB1dAotCSAqIAotCSAqIEBwYXJhbSBsaXRlcmFsIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29udmVydExpdGVyYWwoU3RyaW5nIGxpdGVyYWwpIHsKLQkJcmV0dXJuIChVSV9DT05URVhUX0xJVEVSQUwuZXF1YWxzKGxpdGVyYWwpKSA/IFVJX0NPTlRFWFQgOiBIRUFETEVTU19DT05URVhUOwotCX0KLQotCS8qCi0JICogUmVhZHMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBVSSBDb250ZXh0LXNlbnNpdGl2ZSBjbGFzcyBleHRlbnNpb25zIGFuZCBpbml0aWFsaXplcyB0aGUgY2FjaGUgb2YgdGhlIFVJQ29udGV4dERldGVybWluYXRpb24gb2JqZWN0LgotCSAqIAotCSAqIEBhdXRob3IgbWRlbGRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQgPSAidWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUiA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DTEFTU05BTUVfQVRUUiA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DT05URVhUX0FUVFIgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoSkVNVXRpbFBsdWdpbi5QTFVHSU5fSUQsIEpFTVV0aWxQbHVnaW4uVUlfQ09OVEVYVF9FWFRFTlNJT05fUE9JTlQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfRUxFTUVOVCkpIHsKLQotCQkJCVN0cmluZyBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0tFWV9BVFRSKTsKLQkJCQlTdHJpbmcgY29udGV4dCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ09OVEVYVF9BVFRSKTsKLQotCQkJCWlmICghY2FjaGVkRXh0ZW5zaW9ucy5jb250YWluc0tleShrZXkpIHx8IGdldEN1cnJlbnRDb250ZXh0KCkgPT0gY29udmVydExpdGVyYWwoY29udGV4dCkpCi0JCQkJCWNhY2hlZEV4dGVuc2lvbnMucHV0KGtleSwgZWxlbWVudCk7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJlYWRzIHRoZSB1aVRlc3RlciBleHRlbnNpb24gYW5kIGluc3RhbnRpYXRlIHRoZSBhbnkgb2YgdGhlIFVJVGVzdGVyIGNsYXNzZXMgaXQgZmluZHMuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdCBpZiBtdWx0aXBsZSBVSVRlc3RlcnMgYXJlIHJlZ2lzdGVyZWQsIGFueSBvZiB0aGVtIGNhbiB0cmlwIHRoZSBjdXJyZW50Q29udGV4dCBpbnRvIHRoZSBVSV9DT05URVhUCi0JICogc3RhdGUuCi0JICogCi0JICogQGF1dGhvciBtZGVsZGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9URVNURVJfRUxFTUVOVCA9ICJ1aVRlc3RlciI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9URVNURVJfQ0xBU1NOQU1FX0FUVFIgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBVSVRlc3RlclJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoSkVNVXRpbFBsdWdpbi5QTFVHSU5fSUQsIEpFTVV0aWxQbHVnaW4uVUlfVEVTVEVSX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhVSV9URVNURVJfRUxFTUVOVCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCS8vIERvbid0IGJvdGhlciBydW5uaW5nIHRlc3RlciBpdCBpZiB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBvbmUgZXh0ZW5zaW9uIHRoYXQgcmV0dXJuZWQgdHJ1ZS4KLQkJCQkJaWYgKGN1cnJlbnRDb250ZXh0ICE9IFVJX0NPTlRFWFQgJiYgY2FuQ3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihlbGVtZW50KSkgewotCQkJCQkJVUlUZXN0ZXIgdGVzdGVyID0gKFVJVGVzdGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oVUlfVEVTVEVSX0NMQVNTTkFNRV9BVFRSKTsKLQkJCQkJCWlmICh0ZXN0ZXIuaXNDdXJyZW50Q29udGV4dFVJKCkpCi0JCQkJCQkJY3VycmVudENvbnRleHQgPSBVSV9DT05URVhUOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiBpcyBwcm9jZWVkaW5nIGluIEhFQURMRVNTIG1vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJVGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1MTdlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFVJVGVzdGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBVSVRlc3Rlci4gVGhlICJjbGFzc25hbWUiIGF0dHJpYnV0ZSBvbiB0aGUgInVpVGVzdGVyIiBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBVSVRlc3RlciB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhbiBVSSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gVUkgY29udGV4dC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZmY2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIENvbnRleHRCYXNlIGZvciBFTUZXb3JrYmVuY2guCi0gKiAKLSAqIDxwPgotICogVGhpcyBpcyBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGFzIG5lZWRlZCBmb3IgYWRkaXRpb25hbCBvciBvdmVycmlkZSBmdW5jdGlvbi4gSXQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgZGVmYXVsdC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSB7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWlmIChhUHJvamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8xIikpOyAvLyROT04tTkxTLTEkCi0JCXByb2plY3QgPSBhUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoZSBjb250ZXh0IGJhc2UuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpCi0JCQlyZXNvdXJjZVNldC5yZWxlYXNlKCk7Ci0JCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJcHJvamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IHRoaXMgY29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IChjcmVhdGluZyBpZiBuZWVkZWQpIGZvciBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJlc291cmNlU2V0ID0gY3JlYXRlUmVzb3VyY2VTZXQoKTsKLQkJCWluaXRpYWxpemVSZXNvdXJjZVNldChyZXNvdXJjZVNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbjsgYW5zd2VyIHdoZXRoZXIgYSByZXNvdXJjZVNldCBoYXMgYmVlbiBjcmVhdGVkCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJlc291cmNlIHNldCBoYXMgYmVlbiBjcmVhdGVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Jlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VTZXQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldChQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWNyZWF0ZVJlc291cmNlU2V0U3luY2hyb25pemVyKGFSZXNvdXJjZVNldCk7Ci0JCWFSZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY3JlYXRlVVJJQ29udmVydGVyKGFSZXNvdXJjZVNldCkpOwotCQlhUmVzb3VyY2VTZXQuYWRkKG5ldyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIoKSk7Ci0JCUpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmFkZEV4dGVuZGVkUmVzb3VyY2VIYW5kbGVycyhhUmVzb3VyY2VTZXQpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSByZXNvdXJjZSBzZXQuIEJ5IGRlZmF1bHQgaXQgaXMgYSBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLgotCSAqIAotCSAqIEByZXR1cm4gcHJvamVjdCdzIG5ldyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldCgpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFByb2plY3RSZXNvdXJjZVNldEltcGwocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgVVJJQ29udmVydGVyIGZvciB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuIGEgdXJpIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGNyZWF0ZVVSSUNvbnZlcnRlcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChnZXRQcm9qZWN0KCksIGFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHdvcmtiZW5jaCBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBzZXQgd29ya2JlbmNoIHN5bmNocm9uaXplci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlUmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlU3luY2hyb25pemVyKGFSZXNvdXJjZVNldCwgZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHJlc291cmNlIGZyb20gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCWRlbGV0ZUZpbGUoYVJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVGaWxlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8wIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHJlc291cmNlICh3aXRoIHRoZSBnaXZlbiBVUkkpIGZyb20gdGhlIHByb2plY3QgcmVzb3VyY2Ugc2V0LiBMb2FkIGl0IGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBmb3IgdGhlIHVyaSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL0ZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjMxZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQgZXh0ZW5kcyBQcm9qZWN0UmVzb3VyY2VTZXQgewotCQotCQotCS8qKgotCSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgcmVzb2x2ZWQgYnkgdGhlIFVSSS4KLQkgICAqIDxwPgotCSAgICogQSByZXNvdXJjZSBzZXQgaXMgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgCi0JICAgKiBpbiBvcmRlciB0byByZXNvbHZlIHRoZSBnaXZlbiBVUkkgdG8gYSByZXNvdXJjZS4KLQkgICAqIEZpcnN0IGl0IHVzZXMgaXQncyB7QGxpbmsgI2dldFVSSUNvbnZlcnRlciBVUkkgY29udmVydGVyfSB0byB7QGxpbmsgVVJJQ29udmVydGVyI25vcm1hbGl6ZSBub3JtYWxpemV9IHRoZSBVUkkgCi0JICAgKiBhbmQgdGhlbiB0byBjb21wYXJlIGl0IHdpdGggdGhlIG5vcm1hbGl6ZWQgVVJJIG9mIGVhY2ggcmVzb3VyY2U7Ci0JICAgKiBpZiBpdCBmaW5kcyBhIG1hdGNoLCAKLQkgICAqIHRoYXQgcmVzb3VyY2UgYmVjb21lcyB0aGUgcmVzdWx0LgotCSAgICogRmFpbGluZyB0aGF0LAotCSAgICogaXQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZWxlZ2F0ZWRHZXRSZXNvdXJjZSBkZWxlZ2F0ZXN9IAotCSAgICogdG8gYWxsb3cgdGhlIFVSSSB0byBiZSByZXNvbHZlZCBlbHNld2hlcmUuCi0JICAgKiBGb3IgZXhhbXBsZSwgCi0JICAgKiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSNJTlNUQU5DRSBwYWNrYWdlIHJlZ2lzdHJ5fQotCSAgICogaXMgdXNlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5I2dldEVQYWNrYWdlIHJlc29sdmV9IAotCSAgICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UgbmFtZXNwYWNlIFVSSX0gb2YgYSBwYWNrYWdlCi0JICAgKiB0byB0aGUgc3RhdGljIGluc3RhbmNlIG9mIHRoYXQgcGFja2FnZS4KLQkgICAqIFNvIHRoZSBpbXBvcnRhbnQgcG9pbnQgaXMgdGhhdCBhbiBhcmJpdHJhcnkgaW1wbGVtZW50YXRpb24gbWF5IHJlc29sdmUgdGhlIFVSSSB0byBhbnkgcmVzb3VyY2UsCi0JICAgKiBub3QgbmVjZXNzYXJpbHkgdG8gb25lIGNvbnRhaW5lZCBieSB0aGlzIHBhcnRpY3VsYXIgcmVzb3VyY2Ugc2V0LgotCSAgICogSWYgdGhlIGRlbGVnYXRpb24gc3RlcCBmYWlscyB0byBwcm92aWRlIGEgcmVzdWx0LAotCSAgICogYW5kIGlmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICAgKiBhIHJlc291cmNlIGlzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVtYW5kQ3JlYXRlUmVzb3VyY2UgY3JlYXRlZH0gCi0JICAgKiBhbmQgdGhhdCByZXNvdXJjZSBiZWNvbWVzIHRoZSByZXN1bHQuCi0JICAgKiBJZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICAgKiBhbmQgdGhlIHJlc3VsdCByZXNvdXJjZSBpcyBub3Qge0BsaW5rIFJlc291cmNlI2lzTG9hZGVkIGxvYWRlZH0sIAotCSAgICogaXQgd2lsbCBiZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQgbG9hZGVkfSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuCi0JICAgKiA8L3A+Ci0JICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gcmVzb2x2ZS4KLQkgICAqIEBwYXJhbSBsb2FkT25EZW1hbmQgd2hldGhlciB0byBjcmVhdGUgYW5kIGxvYWQgdGhlIHJlc291cmNlLCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3RzLgotCSAgICogQHBhcmFtIHJlZ2lzdGVyZWRGYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgcmVzb3VyY2UgaWYgbmVlZGVkIAotCSAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgcmVzb2x2ZWQgYnkgdGhlIFVSSSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXNuJ3Qgb25lIGFuZCBpdCdzIG5vdCBiZWluZyBkZW1hbmQgbG9hZGVkLgotCSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGEgcmVzb3VyY2UgY2FuJ3QgYmUgZGVtYW5kIGNyZWF0ZWQuCi0JICAgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGRlbWFuZCBsb2FkLgotCSAgICogQHNpbmNlIDIuMQotCSAgICovCi0JCi0JUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQsIEZhY3RvcnkgcmVnaXN0ZXJlZEZhY3RvcnkpOwotCQotCS8qKgotCSAgICogQ3JlYXRlcyBhIG5ldyByZXNvdXJjZSwgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUsIGFuZCByZXR1cm5zIGl0LgotCSAgICogPHA+Ci0JICAgKiBJdCBkZWxlZ2F0ZXMgdG8gdGhlIHJlc291cmNlIGZhY3Rvcnkge0BsaW5rICNnZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeX0gCi0JICAgKiB0byBkZXRlcm1pbmUgdGhlIHtAbGluayBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5I2dldEZhY3RvcnkgY29ycmVjdH0gZmFjdG9yeSwKLQkgICAqIGFuZCB0aGVuIGl0IHVzZXMgdGhhdCBmYWN0b3J5IHRvIHtAbGluayBSZXNvdXJjZS5GYWN0b3J5I2NyZWF0ZVJlc291cmNlIGNyZWF0ZX0gdGhlIHJlc291cmNlCi0JICAgKiBhbmQgYWRkIGl0IHRvIHRoZSB7QGxpbmsgI2dldFJlc291cmNlcyBjb250ZW50c30uCi0JICAgKiBJZiB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGZhY3RvcnksIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQ7Ci0JICAgKiB3aGVuIHJ1bm5pbmcgd2l0aGluIEVjbGlwc2UsCi0JICAgKiBhIGRlZmF1bHQgWE1JIGZhY3Rvcnkgd2lsbCBiZSByZWdpc3RlcmVkLAotCSAgICogYW5kIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICAgKiA8L3A+Ci0JICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIHJlc291cmNlIHRvIGNyZWF0ZS4KLQkgICAqIEBwYXJhbSByZXNvdXJjZUZhY3RvcnkgCi0JICAgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBmYWN0b3J5IGlzIHJlZ2lzdGVyZWQuCi0JICAgKi8KLQkKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWQ3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotLyoqCi0gKiBFTUYgQ29udGV4dCBDb250cmlidXRvciBpbnRlcmZhY2UuIEltcGxpbWVudGVycyBhcmUgY2FsbGVkIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRleHQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvcikKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFTUZDb250ZXh0Q29udHJpYnV0b3IgewotCi0JLyoqCi0JICogVGhpcyBpcyB5b3VyIG9wcG9ydHVuaXR5IHRvIGFkZCBhIHByaW1hcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyIHRvCi0JICogY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgeW91ciBvcHBvcnR1bml0eSB0byBhZGQgYSBzZWNvbmRhcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyCi0JICogdG8gY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBzZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZGQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBJbXBsaW1lbnRlcnMgYWxsb3dzIGNsaWVudHMsIGVnIHtAbGluayBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRk5hdHVyZUNvbnRyaWJ1dG9yfSwgdG8gZXh0ZW5kIHRoZSBiZWhhdmlvciBvZiB0aGUKLSAqIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIjYWRkRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyKQotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN5bmNocm9uaXplckV4dGVuZGVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHByb2plY3QgaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0Jdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSk7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHByb2plY3RDbG9zZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk3Njk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICQkUkNTZmlsZTogUHJvamVjdFJlc291cmNlU2V0LmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA3LzA4LzMwIDAyOjM3OjA1ICQkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi0vKioKLSAqIEEgUmVzb3VyY2VTZXQgZm9yIGFuIGVudGlyZSBwcm9qZWN0LiBJdCBhbGxvd3Mgc2hhcmluZyBvZiByZXNvdXJjZXMgZnJvbSBtdWx0aXBsZSBlZGl0b3JzL3ZpZXdlcnMgZm9yIGEgcHJvamVjdC4KLSAqIDxwPgotICogQW4gYWRkaXRpb25hbCBOb3RpZmljYXRpb24gdHlwZSBpcyBzZW50IG91dCBieSBQcm9qZWN0UmVzb3VyY2VTZXQncyBvZiBwcm9qZWN0IHJlc291cmNlIHNldCBhYm91dCB0byBiZSByZWxlYXNlZC4gQSByZWxlYXNlIGlzCi0gKiBjYWxsZWQgd2hlbiBwcm9qZWN0cyBhcmUgYWJvdXQgdG8gYmUgY2xvc2VkLiBUaGV5IHJlbGVhc2UgYWxsIG9mIHRoZSByZXNvdXJjZXMgYW5kIHVubG9hZCB0aGVtLiBUaGlzIG5vdGlmaWNhdGlvbiBjYW4gYmUgdXNlZCAKLSAqIHRvIGtub3cgdGhhdCB0aGlzIGlzIGFib3V0IHRvIGhhcHBlbiBhbmQgdG8gZG8gc29tZXRoaW5nIGJlZm9yZSB0aGUgcmVzb3VyY2VzIGJlY29tZSBpbnZhbGlkLiBJdCB3aWxsIGJlIHNlbnQgb3V0IGp1c3QgYmVmb3JlIHRoZQotICogcmVzb3VyY2Ugc2V0IHdpbGwgYmUgcmVsZWFzZWQuIAotICogCi0gKiBAc2VlIFByb2plY3RSZXNvdXJjZVNldCNTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFCi0gKiBAc2VlIFByb2plY3RSZXNvdXJjZVNldCNQUk9KRUNUUkVTT1VSQ0VTRVRfQUJPVVRfVE9fUkVMRUFTRV9JRCAKLSAqIEBzaW5jZSAxLjAuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXQgewotCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0eXBlIGluIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgUHJvamVjdFJlc291cmNlU2V0IGZvcgotCSAqIHNwZWNpYWwgbm90aWZpY2F0aW9ucywgYW5kIG5vdCB0aGUgc3RhbmRhcmQgb25lcyBmcm9tIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uI2dldEV2ZW50VHlwZSgpCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0Jc3RhdGljIGludCBTUEVDSUFMX05PVElGSUNBVElPTl9UWVBFID0gTm90aWZpY2F0aW9uLkVWRU5UX1RZUEVfQ09VTlQrNDsKLQkKLQkvKioKLQkgKiBOb3RpZmljYXRpb24gRmVhdHVyZSBJRCBmb3IgcmVzb3VyY2Ugc2V0IGFib3V0IHRvIGJlIHJlbGVhc2VkLgotCSAqIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uI2dldEZlYXR1cmVJRChqYXZhLmxhbmcuQ2xhc3MpfSB0bwotCSAqIGdldCB0aGlzIGlkLiBUaGUgZ2V0RmVhdHVyZSgpIG9uIG5vdGlmaWNhdGlvbiB3aWxsIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXN0YXRpYyBpbnQgUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQgPSAxMDAwOwotCi0JLyoqCi0JICogQ2FsbCB3aGVuIHRoZSBSZXNvdXJjZVNldCBpcyBubyBsb25nZXIgdG8gYmUgdXNlZC4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgotCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgotCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgd2FzIGFkZGVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gYWRkKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogQWRkIHRoZSA8Y29kZT5yZXNvdXJjZUhhbmRsZXI8L2NvZGU+IHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKLQkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIGFkZEZpcnN0KFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSA8Y29kZT5yZXNvdXJjZUhhbmRsZXI8L2NvZGU+IGZyb20gdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCi0JICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCi0JICogQHJldHVybiBib29sZWFuIFJldHVybiB0cnVlIGlmIGl0IHdhcyByZW1vdmVkLgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gcmVtb3ZlKFJlc291cmNlSGFuZGxlciByZXNvdXJjZUhhbmRsZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZVNldCBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplIHRoZSBSZXNvdXJjZVNldCB3aXRoIGNoYW5nZXMgZnJvbSB0aGUgV29ya2JlbmNoLgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgUmVzb3VyY2VTZXQgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgUmVzb3VyY2VTZXQgd2l0aCBjaGFuZ2VzIGZyb20gdGhlIFdvcmtiZW5jaC4KLQkgKiAKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHNldFN5bmNocm9uaXplcihSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKTsKLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBjbGllbnRzIHdoZW5ldmVyIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2plY3QgY2hhbmdlcyBzdWNoIHRoYXQgYW55IGNhY2hlZCBVUklzIHdpbGwgYmUgaW52YWxpZC4gRm9yIGV4YW1wbGUsIGlmIHRoZQotCSAqIHNvdXJjZSBmb2xkZXJzIHdpdGhpbiB0aGUgVVJJQ29udmVydGVyIGNoYW5nZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHJlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzOWQ4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBQcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNCAkJCAgJCREYXRlOiAyMDA1LzA1LzExIDE5OjAxOjI0ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKLQotCi0vKioKLSAqIEVNRiBXb3JrYmVuY2ggUHJvamVjdCBVdGlsaXRpZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIFByb2plY3QgY29udHJvbCBmaWxlIG5hbWUgaW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfUFJPSkVDVCA9ICIucHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENsYXNzcGF0aCBjb250cm9sIGZpbGUgbmFtZSBpbiBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERPVF9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcm9qZWN0VXRpbGl0aWVzKCkgewotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmF0dXJlIGlkIHRvIHRoZSBwcm9qZWN0IGFoZWFkIG9mIGFsbCBvdGhlciBuYXR1cmUgaWRzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hdHVyZSBpZCBhZnRlciBhbGwgb2YgdGhlIG90aGVyIG5hdHVyZSBpZHMgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qCi0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdExhc3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG5hdHVyZSBpZCBmcm9tIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hdHVyZUlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hdHVyZUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpbnQgc2l6ZSA9IHByZXZOYXR1cmVzLmxlbmd0aDsKLQkJaW50IG5ld3NpemUgPSAwOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJYm9vbGVhbiBtYXRjaGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocHJldk5hdHVyZXNbaV0uZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCW1hdGNoZm91bmQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJbmV3TmF0dXJlc1tuZXdzaXplKytdID0gcHJldk5hdHVyZXNbaV07Ci0JCX0KLQkJaWYgKCFtYXRjaGZvdW5kKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKRU1VdGlsUGx1Z2luLklELCAwLAotCQkJCQkiVGhlIG5hdHVyZSBpZCAiICsgbmF0dXJlSWQgKyAiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQllbHNlIHsKLQkJCVN0cmluZ1tdIHRlbXAgPSBuZXdOYXR1cmVzOwotCQkJbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbbmV3c2l6ZV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIG5ld05hdHVyZXMsIDAsIG5ld3NpemUpOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGxpc3Qgb2YgcHJvamVjdHMgdG8gZW5kIG9mIHRoZSAicmVmZXJlbmNlZCBwcm9qZWN0cyIgbGlzdCBmcm9tIHRoZSBwcm9qZWN0J3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdG9CZUFkZGVkUHJvamVjdHNMaXN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIExpc3QgdG9CZUFkZGVkUHJvamVjdHNMaXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCi0JCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvQmVBZGRlZFByb2plY3RzTGlzdC5zaXplKCk7IGkrKykgewotCQkJcHJvamVjdHNMaXN0LmFkZCh0b0JlQWRkZWRQcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc2luZ2xlIHByb2plY3QgdG8gdGhlIGVuZCBvZiB0aGUgInJlZmVyZW5jZWQgcHJvamVjdHMiIGxpc3QgZnJvbSB0aGUgcHJvamVjdCdzIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3RUb0JlQWRkZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQmVBZGRlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJfQotCi0JCXByb2plY3RzTGlzdC5hZGQocHJvamVjdFRvQmVBZGRlZCk7Ci0KLQkJSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0c0xpc3Quc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWZQcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgKHByb2plY3RzTGlzdC5nZXQoaSkpOwotCQl9Ci0KLQkJZGVzY3JpcHRpb24uc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZlByb2plY3RzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRm9yY2UgYSBhbiBpbW1lZGlhdGUgYnVpbGQgb2YgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlQXV0b0J1aWxkKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9SZXZpc2l0OiBOZWVkIHRvIHVzZSBhIExvZ2dlcgotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlmIGF1dG8gYnVpbGQgaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXV0byBidWlsZCBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEN1cnJlbnRBdXRvQnVpbGRTZXR0aW5nKCkgewotCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIHdkLmlzQXV0b0J1aWxkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIG1heSBiZSBhbiA8Y29kZT5JUHJvamVjdCwgSVJlc291cmNlLCBJQWRhcHRhYmxlICh0byBhbiBJUHJvamVjdCksIEVPYmplY3QgKGdldHMgSVByb2plY3QgaWYgb2JqZWN0IGlzIGluIGEgUHJvamVjdFJlc291cmNlU2V0PC9jb2RlPi4KLQkgKiBAcGFyYW0gbmF0dXJlSWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gcmV0dXJucyBwcm9qZWN0LiBJZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiByZXR1cm5zIHByb2plY3Qgb25seSBpZiBwcm9qZWN0IGhhcyB0aGlzIG5hdHVyZSBpZC4KLQkgKiBAcmV0dXJuIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gZ2V0UHJvamVjdChvYmplY3QpOwotCQlpZiAobmF0dXJlSWQgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuaXNBY2Nlc3NpYmxlKCkgJiYgbmF0dXJlSWQgIT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc3VsdC5oYXNOYXR1cmUobmF0dXJlSWQpKQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgbWF5IGJlIGFuIDxjb2RlPklQcm9qZWN0LCBJUmVzb3VyY2UsIElBZGFwdGFibGUgKHRvIGFuIElQcm9qZWN0KSwgRU9iamVjdCAoZ2V0cyBJUHJvamVjdCBpZiBvYmplY3QgaXMgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQ8L2NvZGU+LgotCSAqIEByZXR1cm4gcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpIG9iamVjdDsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzdWx0ID0gKChJUmVzb3VyY2UpIG9iamVjdCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXN1bHQgPSBnZXRQcm9qZWN0KChFT2JqZWN0KSBvYmplY3QpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gRU9iamVjdC4gKElmIGluIGEgUHJvamVjdFJlc291cmNlU2V0LCB0aGVuIHRoZSBwcm9qZWN0IGZyb20gdGhhdCByZXNvdXJjZSBzZXQpLgotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogQHJldHVybiBwcm9qZWN0IGlmIGFzc29jaWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBhUmVmT2JqZWN0LmVSZXNvdXJjZSgpOwotCQkJcmV0dXJuIGdldFByb2plY3QocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFJlc291cmNlLiAoSWYgaW4gYSBQcm9qZWN0UmVzb3VyY2VTZXQsIHRoZW4gdGhlIHByb2plY3QgZnJvbSB0aGF0IHJlc291cmNlIHNldCkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBwcm9qZWN0IGlmIGFzc29jaWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCBzZXQgPSByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQlyZXR1cm4gKChQcm9qZWN0UmVzb3VyY2VTZXQpIHNldCkuZ2V0UHJvamVjdCgpOwotCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gc2V0ID09IG51bGwgPyBudWxsIDogc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyIGluc3RhbmNlb2YgV29ya2JlbmNoVVJJQ29udmVydGVyICYmICgoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252ZXJ0ZXIpLmdldE91dHB1dENvbnRhaW5lcigpICE9IG51bGwpCi0JCQlyZXR1cm4gKChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnZlcnRlcikuZ2V0T3V0cHV0Q29udGFpbmVyKCkuZ2V0UHJvamVjdCgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGxpc3Qgb2YgcHJvamVjdHMgZnJvbSB0aGUgbGlzdCBvZiAicmVmZXJlbmNlZCBwcm9qZWN0cyIgaW4gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSB0b0JlUmVtb3ZlZFByb2plY3RMaXN0Ci0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRvQmVSZW1vdmVkUHJvamVjdExpc3QpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQotCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0JlUmVtb3ZlZFByb2plY3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QucmVtb3ZlKHRvQmVSZW1vdmVkUHJvamVjdExpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBsaXN0IG9mICJyZWZlcmVuY2VkIHByb2plY3RzIiBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHRvQmVSZW1vdmVkUHJvamVjdAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgdG9CZVJlbW92ZWRQcm9qZWN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0KLQkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c0xpc3QuYWRkKChwcm9qZWN0c1tpXSkpOwotCQl9Ci0KLQkJcHJvamVjdHNMaXN0LnJlbW92ZSh0b0JlUmVtb3ZlZFByb2plY3QpOwotCi0JCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKLQkJfQotCi0JCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFR1cm4gYXV0by1idWlsZGluZyBvZmYuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPZmYoKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQkJd2Quc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFR1cm4gYXV0by1idWlsZGluZyBvbi4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYXV0by1idWlsZGluZyBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUJvb2xlYW4KLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gYXV0by1idWlsZGluZyBvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKGJvb2xlYW4gYUJvb2xlYW4pIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcoYUJvb2xlYW4pOwotCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgYnVpbGRlciB0byB0aGUgYnVpbGQgc3BlYyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkZXJJRAotCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBQcm9qZWN0IHRvIGFkZCB0by4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKGJ1aWxkZXJJRCwgbnVsbCwgcHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgYnVpbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRlcklECi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCi0JICogQHBhcmFtIHN1Y2Nlc3NvcklECi0JICogICAgICAgICAgICBUaGUgaWQgdG8gcHV0IHRoZSBidWlsZGVyIGJlZm9yZS4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKFN0cmluZyBidWlsZGVySUQsIFN0cmluZyBzdWNjZXNzb3JJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgewotCQkJYm9vbGVhbiBzdWNjZXNzb3JGb3VuZCA9IGZhbHNlOwotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGRlc2NyaXB0aW9uLm5ld0NvbW1hbmQoKTsKLQkJCWNvbW1hbmQuc2V0QnVpbGRlck5hbWUoYnVpbGRlcklEKTsKLQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07Ci0JCQlmb3IgKGludCBqID0gMCwgaW5kZXggPSAwOyBqIDwgY29tbWFuZHMubGVuZ3RoOyBqKyssIGluZGV4KyspIHsKLQkJCQlpZiAoc3VjY2Vzc29ySUQgIT0gbnVsbCAmJiBjb21tYW5kc1tqXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhzdWNjZXNzb3JJRCkpIHsKLQkJCQkJc3VjY2Vzc29yRm91bmQgPSB0cnVlOwotCQkJCQluZXdDb21tYW5kc1tpbmRleCsrXSA9IGNvbW1hbmQ7Ci0JCQkJfQotCQkJCW5ld0NvbW1hbmRzW2luZGV4XSA9IGNvbW1hbmRzW2pdOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzb3JGb3VuZCkKLQkJCQluZXdDb21tYW5kc1tuZXdDb21tYW5kcy5sZW5ndGggLSAxXSA9IGNvbW1hbmQ7Ci0JCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuICFmb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGJ1aWxkZXIgZnJvbSB0aGUgYnVpbGQgc3BlYy4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRlcklECi0JICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFByb2plY3QgdG8gcmVtb3ZlIGZyb20uCi0JICogQHJldHVybiBib29sZWFuIGlmIHRoZSBidWlsZGVyIGlkIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZCkgewotCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggLSAxXTsKLQkJCWludCBuZXdDb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJaWYgKCEoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkpIHsKLQkJCQkJLy9BZGQgdGhlIGV4aXN0bmcgdG8gdGhlIG5ldyBhcnJheQotCQkJCQluZXdDb21tYW5kc1tuZXdDb3VudF0gPSBjb21tYW5kc1tpXTsKLQkJCQkJbmV3Q291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQotCX0KLQotCS8qKgotCSAqIEVuc3VyZSB0aGUgY29udGFpbmVyIGlzIG5vdCByZWFkLW9ubHkuCi0JICogPHA+Ci0JICogRm9yIExpbnV4LCBhIFJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkIGluIGEgUmVhZE9ubHkgZm9sZGVyLiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBuZXcgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZXhpc3RzKCkpIHsgLy9pdCBtdXN0IGJlIG5ldwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJd2hpbGUgKGF0dHIgIT0gbnVsbCAmJiAhYXR0ci5pc1JlYWRPbmx5KCkpIHsKLQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGF0dHIgIT0gbnVsbCkKLQkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwcm9qZWN0cyBmcm9tIHByaW1hcnkgbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBuYXR1cmVJRAotCSAqIEByZXR1cm4gQWxsIHByb2plY3RzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gbmF0dXJlIGlkIGFzIHRoZSBmaXJzdCBuYXR1cmUgaWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFByb2plY3RzRm9yUHJpbWFyeU5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0c1dpdGhOYXR1cmUgPSBuZXcgSVByb2plY3RbXSB7fTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNQcm9qZWN0UHJpbWFyeU5hdHVyZShwcm9qZWN0c1tpXSwgbmF0dXJlSUQpKQotCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkocHJvamVjdHNXaXRoTmF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB3b3Jrc3BhY2UgcHJvamVjdHMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBuYXR1cmUgaWQgdGhlIHByaW1hcnkgbmF0dXJlIGlkIGZvciB0aGUgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIG5hdHVyZUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaXJzdCBuYXR1cmUgaWQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RQcmltYXJ5TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJRCkgewotCQlTdHJpbmdbXSBuYXR1cmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCXJldHVybiAobmF0dXJlcyAhPSBudWxsICYmIG5hdHVyZXMubGVuZ3RoID4gMCAmJiBuYXR1cmVzWzBdLmVxdWFscyhuYXR1cmVJRCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggY3JlYXRlUGF0aChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHAuZ2V0TmFtZSgpKTsKLQkJcGF0aCA9IHBhdGguYXBwZW5kKGRlZmF1bHRTb3VyY2VOYW1lKTsKLQkJcGF0aCA9IHBhdGgubWFrZUFic29sdXRlKCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGV4aXN0aW5nIGZpbGVzIHdoaWNoIHdpbGwgYmUgbW9kaWZpZWQgaWYgdGhlIGNsYXNzcGF0aCBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcHJvZWplY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWZmZWN0ZWQgZmlsZXMuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEZpbGVzQWZmZWN0ZWRCeUNsYXNzcGF0aENoYW5nZShJUHJvamVjdCBwKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJYWRkRmlsZUlmRXhpc3RzKHAsIHJlc3VsdCwgRE9UX0NMQVNTUEFUSCk7Ci0JCWFkZEZpbGVJZkV4aXN0cyhwLCByZXN1bHQsIERPVF9QUk9KRUNUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkRmlsZUlmRXhpc3RzKElQcm9qZWN0IHAsIExpc3QgYUxpc3QsIFN0cmluZyBmaWxlbmFtZSkgewotCQlJRmlsZSBhRmlsZSA9IHAuZ2V0RmlsZShmaWxlbmFtZSk7Ci0JCWlmIChhRmlsZSAhPSBudWxsICYmIGFGaWxlLmV4aXN0cygpKQotCQkJYUxpc3QuYWRkKGFGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCBvZmYgYSBsZWFkaW5nICIvIiBmcm9tIGVhY2ggcHJvamVjdCBuYW1lIGluIHRoZSBhcnJheSwgaWYgaXQgaGFzIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjTmFtZXMKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHByb2plY3QgbmFtZXMgd2l0aCBhbGwgbGVhZGluZyAnLycgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2plY3ROYW1lc1dpdGhvdXRGb3J3YXJkU2xhc2goU3RyaW5nW10gcHJvamVjTmFtZXMpIHsKLQkJU3RyaW5nW10gcHJvak5hbWVzID0gbmV3IFN0cmluZ1twcm9qZWNOYW1lcy5sZW5ndGhdOwotCQlMaXN0IHRlbXAgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChwcm9qZWNOYW1lcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSAodGVtcC5nZXQoaSkpOwotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9qTmFtZXNbaV0gPSBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvak5hbWVzW2ldID0gbmFtZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvak5hbWVzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVVJMIGNyZWF0ZUZpbGVVUkwoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZmlyc3QgbmV3T2JqZWN0IHRoYXQgaXMgbm90IGluIHRoZSBvbGRPYmplY3RzIGFycmF5ICh1c2luZyAiPT0iKS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqZWN0cwotCSAqIEBwYXJhbSBuZXdPYmplY3RzCi0JICogQHJldHVybiBmaXJzdCBuZXdPYmplY3Qgbm90IGZvdW5kIGluIG9sZE9iamVjdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBmb3VuZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXROZXdPYmplY3QoT2JqZWN0W10gb2xkT2JqZWN0cywgT2JqZWN0W10gbmV3T2JqZWN0cykgewotCQlpZiAob2xkT2JqZWN0cyAhPSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBvbGRPYmplY3RzLmxlbmd0aCA8IG5ld09iamVjdHMubGVuZ3RoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IG5ld09iamVjdHNbaV07Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRPYmplY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChvbGRPYmplY3RzW2pdID09IG9iamVjdCkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkKLQkJCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZiAob2xkT2JqZWN0cyA9PSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBuZXdPYmplY3RzLmxlbmd0aCA9PSAxKQotCQkJcmV0dXJuIG5ld09iamVjdHNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExpc3Qgb2YgYWxsIGZpbGVzIGluIHRoZSBwcm9qZWN0LgotCSAqIDxwPgotCSAqIE5vdGU6IEEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlIHtAbGluayBJUmVzb3VyY2UjYWNjZXB0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvciwgaW50KX0KLQkgKiAKLQkgKiBAcGFyYW0gMS4wLjAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAc2VlIElSZXNvdXJjZSNhY2NlcHQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yLCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2plY3RGaWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGNvbGxlY3RGaWxlcyhwcm9qZWN0Lm1lbWJlcnMoKSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RGaWxlcyhJUmVzb3VyY2VbXSBtZW1iZXJzLCBMaXN0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyByZWN1cnNpdmVseSBjb2xsZWN0IGZpbGVzIGZvciB0aGUgZ2l2ZW4gbWVtYmVycwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOwotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQljb2xsZWN0RmlsZXMoKChJRm9sZGVyKSByZXMpLm1lbWJlcnMoKSwgcmVzdWx0KTsKLQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXN1bHQuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHJldHVybiBhIElQcm9qZWN0IGdpdmVuIHRoZSBwcm9qZWN0TmFtZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGJ1aWxkZXIgbmFtZSBpcyBhdHRhY2hlZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBidWlsZGVyTmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVpbGRlciBuYW1lIGlzIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyTmFtZSkgewotCQl0cnkgewotCQkJSUNvbW1hbmRbXSBidWlsZGVycyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRCdWlsZFNwZWMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29tbWFuZCBidWlsZGVyID0gYnVpbGRlcnNbaV07Ci0JCQkJaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoYnVpbGRlci5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVyTmFtZSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcwNzgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBSZXNvdXJjZUhhbmRsZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHByb3ZpZGUgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBvbiByZXNvdXJjZSBzZXQuIFN1Y2ggYXMgbG9va2luZyBvciBjcmVhdGluZyBpbiBvdGhlciByZXNvdXJjZSBzZXRzIGZvciBhCi0gKiByZXNvdXJjZSBvciBhbiBFT2JqZWN0LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0I2FkZChSZXNvdXJjZUhhbmRsZXIpCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUhhbmRsZXIgewotCi0JLyoqCi0JICogRWFjaCBSZXNvdXJjZUhhbmRsZXIgZm9yIGEgV29ya2JlbmNoQ29udGV4dCAod2hpY2ggaG9sZHMgYSBQcm9qZWN0UmVzb3VyY2VTZXQpIHdpbGwgZ2V0IGFuIG9wb3J0dW5pdHkgdG8gZ2V0IHRoZSBSZXNvdXJjZSBnaXZlbiB0aGUgdXJpU3RyaW5nCi0JICogcHJpb3IgdG8gdGhlIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgZ2V0dGluZyBpdCBpbiB0aGUgbm9ybWFsIG1hbm5lci4KLQkgKiAKLQkgKiBJZiB0aGlzIGhhbmRsZXIgbG9hZGVkIGEgUmVzb3VyY2UgaW4gaXRzIGNyZWF0ZShSZXNvdXJjZVNldCwgdXJpU3RyaW5nKSB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiBpdCBhcyB3ZWxsLgotCSAqIAotCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0Ci0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UgaWYgZm91bmQgb3IgPGNvZGU+bnVsbGwvY29kZT4gaWYgdGhpcyBoYW5kbGVyIGRpZG4ndCBmaW5kIGl0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpOwotCi0JLyoqCi0JICogR2V0IHRoZSBFT2JqZWN0IGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBpdCBjYW4uIExvYWQgdGhlIHJlc291cmNlIGlmIGxvYWRPbkRlbWFuZCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHVyaSBvZiBFT2JqZWN0IGJlaW5nIHJlcXVlc3RlZAotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlc291cmNlIHNob3VsZCBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIGVvYmplY3QgaWYgZm91bmQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90LgotCSAqLwotCUVPYmplY3QgZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlc291cmNlIHBvaW50ZWQgdG8gYmUgdGhlIFVSSSBpZiB0aGlzIGhhbmRsZXIgd2lsbCBoYW5kbGUgaXQuCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBpZiBjcmVhdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBoYW5kbGVyIGRvZXNuJ3QgaGFuZGxlIHRoaXMgdHlwZS4KLQkgKi8KLQlSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlYzU5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEsdiAkJAotICogICQkUmV2aXNpb246IDEuNCAkJCAgJCREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjQ1ICQkIAotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBTeW5jaHJvbml6ZXIgb24gdGhlIHdvcmtiZW5jaC4gSXQgbGlzdGVucyBmb3IgdGhlIHByb2plY3QgdG8gc2VlIGlmIGl0IGlzIGNsb3NlZCBvciBkZWxldGVkLiBJZiBpdCBkb2VzIGl0IG5vdGlmaWVzIHRoaXMgb3V0LgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQkvKiogRXh0ZW5kZXJzIHRoYXQgd2lsbCBiZSBub3RpZmllZCBhZnRlciBhIHByZSBidWlsZCByZXNvdXJjZSBjaGFuZ2UgKi8KLQlwcm90ZWN0ZWQgTGlzdCBleHRlbmRlcnM7Ci0KLQkvKiogVGhlIGRlbHRhIGZvciB0aGlzIHByb2plY3QgdGhhdCB3aWxsIGJlIGJyb2FkY2FzdCB0byB0aGUgZXh0ZW5kZXJzICovCi0JcHJvdGVjdGVkIElSZXNvdXJjZURlbHRhIGN1cnJlbnRQcm9qZWN0RGVsdGE7Ci0KLQlwcml2YXRlIGludCBjdXJyZW50RXZlbnRUeXBlID0gLTE7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYSByZXNvdXJjZSBzZXQgYW5kIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJlc291cmNlU2V0ID0gYVJlc291cmNlU2V0OwotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JCWlmIChhUmVzb3VyY2VTZXQgIT0gbnVsbCAmJiBhUmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCi0JCQkoKFByb2plY3RSZXNvdXJjZVNldCkgYVJlc291cmNlU2V0KS5zZXRTeW5jaHJvbml6ZXIodGhpcyk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb2plY3QgZm9yIHRoaXMgc3luY2hyb25pemVyCi0JICogCi0JICogQHJldHVybiBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWN1cnJlbnRFdmVudFR5cGUgPSBldmVudC5nZXRUeXBlKCk7Ci0JCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBudWxsOwotCQlpZiAoKGN1cnJlbnRFdmVudFR5cGUgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHx8IGN1cnJlbnRFdmVudFR5cGUgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkKLQkJCQkmJiBldmVudC5nZXRSZXNvdXJjZSgpLmVxdWFscyhnZXRQcm9qZWN0KCkpKSB7Ci0JCQlub3RpZnlFeHRlbmRlcnNPZkNsb3NlKCk7Ci0JCQlyZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUV4dGVuZGVyc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAoY3VycmVudEV2ZW50VHlwZSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8fCBleHRlbmRlcnMgPT0gbnVsbCB8fCBjdXJyZW50UHJvamVjdERlbHRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJU3luY2hyb25pemVyRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVN5bmNocm9uaXplckV4dGVuZGVyKSBleHRlbmRlcnMuZ2V0KGkpOwotCQkJZXh0ZW5kZXIucHJvamVjdENoYW5nZWQoY3VycmVudFByb2plY3REZWx0YSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFeHRlbmRlcnNPZkNsb3NlKCkgewotCQlpZiAoZXh0ZW5kZXJzICE9IG51bGwgJiYgIWV4dGVuZGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyID0gKElTeW5jaHJvbml6ZXJFeHRlbmRlcikgZXh0ZW5kZXJzLmdldChpKTsKLQkJCQlleHRlbmRlci5wcm9qZWN0Q2xvc2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLAotCQkJCUlSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiB0aGUgc3luY2hyb25pemVyLiBDYWxsZWQgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByb2plY3QgaXMgZ29pbmcgYXdheSBzbyB3ZSBuZWVkIHRvIGNsZWFudXAgb3Vyc2VsZiBhbmQgdGhlIFJlc291cmNlU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChKRU1VdGlsUGx1Z2luLmlzQWN0aXZhdGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQotCQkJCQkoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLnJlbGVhc2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UucmVtb3ZlQ2FjaGVkUHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQkJCWRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBleHRlbmRlciB0byBiZSBub3RpZmllZCBvZiBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGV4dGVuZGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyKSB7Ci0JCWlmIChleHRlbmRlcnMgPT0gbnVsbCkKLQkJCWV4dGVuZGVycyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCWV4dGVuZGVycy5hZGQoZXh0ZW5kZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBleHRlbmRlciBmcm9tIG5vdGlmaWNhdGlvbiBvZiBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGV4dGVuZGVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRXh0ZW5kZXIoSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyKSB7Ci0JCWlmIChleHRlbmRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZXh0ZW5kZXJzLnJlbW92ZShleHRlbmRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnKCcgKyAoKGdldFByb2plY3QoKSAhPSBudWxsKSA/IGdldFByb2plY3QoKS5nZXROYW1lKCkgOiAibnVsbCIpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVsbCBTeW5jaHJvbml6ZXIgdGhhdCBhIGZpbGUgaXMgYWJvdXQgdG8gYmUgc2F2ZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGFuIEVNRiByZXNvdXJjZS4KLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGRvZXMgbm90aGluZywgYnV0IHN1YmNsYXNzZXMgY2FuIGRvIHNvbWV0aGluZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogICAgICAgICAgICBmaWxlIGFib3V0IHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHByZVNhdmUoSUZpbGUgYUZpbGUpIHsKLQkJLy9EZWZhdWx0IGlzIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzJmNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotCi0vKioKLSAqIEJ5dGVBcnJheSBPdXRwdXRTdHJlYW0gZm9yIHRoZSBXb3JrYmVuY2guIEl0IHdvcmtzIHdpdGggdGhlIHN5bmNocm9uaXplciB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcn10bwotICogbm90aWZ5IG9mIGEgc2F2ZS4gSXQgYWxzbyBjaGFuZ2VzIGFsbCBvZiB0aGUgbGluZSBzZXBhcmF0b3JzIHRvIHRoZSBjdXJyZW50IHN5c3RlbSBsaW5lIHNlcGFyYXRvciwgaS5lLiBpZiB0aGVyZSBhcmUgc29tZSAnXHInIGFuZCB3ZSBhcmUgb24KLSAqIFdpbmRvd3MoUikgdGhlbiB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvICdcblxyJyksIGlmIHRoZSBzZXR0aW5nIGZvciB0aGUgc3RyZWFtIGlzIHRvIGRvIGVvbCBjb252ZXJzaW9uLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwuUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0wgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSUZpbGUgYUZpbGUpIHsKLQkJdGhpcyhhRmlsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYSBJRmlsZSBhbmQgYSBzeW5jaHJvbml6ZXIuIFRoaXMgd2F5IHN5bmNocm9uaXplciB3aWxsIGtub3cgd2hlbiBmaWxlIGlzIGFib3V0IHRvIGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShJRmlsZSBhRmlsZSwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlzdXBlcihhRmlsZSwgZmFsc2UsIHRydWUsIG51bGwpOwotCQlzeW5jaHJvbml6ZXIgPSBhU3luY2hyb25pemVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsLlBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0jZmx1c2goKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQotCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7Ci0JCXN1cGVyLmZsdXNoKCk7Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0IHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLgotCSAqLwotCXByaXZhdGUgaW50IGNvbnZlcnRFT0woYnl0ZVtdIGRhdGEpIHsKLQkJLy8gQWxnb3JpdGhtOgotCQkvLyBSZW1vdmUgYWxsICdccicgY2hhcnMKLQkJLy8gUmVwbGFjZSBhbGwgJ1xuJyBjaGFycyB3aXRoIGxpbmUgc2VwZXJhdG9yIGNoYXJzCi0KLQkJU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJYnl0ZVtdIEVPTEJ5dGVzID0gRU9MLmdldEJ5dGVzKCk7Ci0KLQkJaW50IG91dCA9IDA7Ci0KLQkJZm9yIChpbnQgaW4gPSAwOyBpbiA8IGRhdGEubGVuZ3RoOyBpbisrKSB7Ci0JCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykgewotCQkJCS8vIGRvbid0IG91dHB1dCAoaWUsIHRocm93IHRoZSBjaGFyIGF3YXkpCi0JCQl9IGVsc2UgaWYgKGRhdGFbaW5dID09ICdcbicpIHsKLQkJCQkvLyBUaGUgY29kZSBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIGV4cGFuZGluZyB0aGUgYXJyYXkKLQkJCQlpZiAoKGluIC0gb3V0ICsgMSkgPCBFT0xCeXRlcy5sZW5ndGgpCi0JCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOiBFeHBhbmRpbmcgRU9MIGNoYXJzIG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVPTEJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWRhdGFbb3V0KytdID0gRU9MQnl0ZXNbaV07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBKdXN0IGNvcHkgdGhlIGRhdGEKLQkJCQlkYXRhW291dCsrXSA9IGRhdGFbaW5dOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG91dDsKLQl9Ci0KLQkvKioKLQkgKiBJcyBFT0wgY29udmVyc2lvbiB0dXJuZWQgb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgY29udmVyc2lvbiBpcyB0dXJuZWQgb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb252ZXJ0RU9MQ2hhcnMoKSB7Ci0JCXJldHVybiBmQ29udmVydEVPTDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIEVPTCBjb252ZXJzaW9uIGZsYWcuCi0JICogCi0JICogQHBhcmFtIHNldAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgRU9MIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gY3VycmVudCBsaW5lIHNlcGFyYXRvci4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ2hhcnMoYm9vbGVhbiBzZXQpIHsKLQkJZkNvbnZlcnRFT0wgPSBzZXQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN0b0J5dGVBcnJheSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0JCWJ5dGVbXSBjb250ZW50cyA9IHN1cGVyLnRvQnl0ZUFycmF5KCk7Ci0JCWlmIChpc0NvbnZlcnRFT0xDaGFycygpKQotCQkJY29udmVydEVPTChjb250ZW50cyk7Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdiYjhmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5qYXZhLHYgJCQKLSAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNi8wOC8wOSAxNTo0MDoyMiAkJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBXb3JrYmVuY2ggcmVzb3VyY2UgaGVscGVyCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlIHsKLQotCS8qKgotCSAqIEV2ZXJ5dGhpbmcgaXMgc3RhdGljLCBkb24ndCBrbm93IHdoeSB0aGVyZSBpcyBhbiBpbnN0YW5jZSBoZXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlIElOU1RBTkNFID0gbmV3IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIgd29ya3NwYWNlVVJJTG9hZGVyID0gbmV3IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVDb250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUxpc3QgY29udGFpbmVkID0gcmVmT2JqZWN0LmVDb250ZW50cygpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSBjb250YWluZWQuZ2V0KGkpOwotCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhFT2JqZWN0IHJlZk9iamVjdCkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIHJlZmVyZW5jZXMuZ2V0KGkpOwotCQkJaWYgKCFyZWZlcmVuY2UuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IHZhbHVlID0gKExpc3QpIHJlZk9iamVjdC5lR2V0KHJlZmVyZW5jZSk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmFsdWUuc2l6ZSgpOyBqKyspCi0JCQkJCQl2YWx1ZS5nZXQoaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIHByb3hpZXMgd2l0aCA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdG8gYmUgcmVzb2x2ZWQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlMaXN0IHRvcExldmVscyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9wTGV2ZWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIHRvcExldmVscy5nZXQoaSk7Ci0JCQkJcmVzb2x2ZVByb3hpZXMobW9mT2JqZWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgcHJveGllcyB0aGF0IGFyZSBjb250YWluZWQgYnkgdGhlIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcHJveGllcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2F0aGVyUHJveGllcyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJaW50IHNpemUgPSB0b3BMZXZlbHMuc2l6ZSgpOwotCQlFT2JqZWN0IG1vZk9iamVjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCW1vZk9iamVjdCA9IChFT2JqZWN0KSB0b3BMZXZlbHMuZ2V0KGkpOwotCQkJZ2F0aGVyUHJveGllcygoSW50ZXJuYWxFT2JqZWN0KSBtb2ZPYmplY3QsIGxpc3QpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnYXRoZXJQcm94aWVzKEludGVybmFsRU9iamVjdCByZWZPYmplY3QsIExpc3QgcHJveGllcykgewotCQlpZiAocmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3QgY29udGFpbnMgPSByZWZPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpOwotCQlpZiAoY29udGFpbnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjb250YWlucy5zaXplKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGNvbnRhaW5zLmdldChpKTsKLQkJCQlnYXRoZXJQcm94aWVzKHJlZk9iamVjdCwgc2YsIHByb3hpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdhdGhlclByb3hpZXMoSW50ZXJuYWxFT2JqZWN0IHJlZk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmLCBMaXN0IHByb3hpZXMpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gbnVsbDsKLQkJaWYgKHNmLmlzTWFueSgpIHx8IHJlZk9iamVjdC5lSXNTZXQoc2YpKSB7Ci0JCQl2YWx1ZSA9IHJlZk9iamVjdC5lR2V0KHNmLCBmYWxzZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWlmIChzZi5pc01hbnkoKSkgewotCQkJCQlJdGVyYXRvciBqID0gKChJbnRlcm5hbEVMaXN0KSB2YWx1ZSkuYmFzaWNJdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoai5oYXNOZXh0KCkpIHsKLQkJCQkJCXByb3h5ID0gKEludGVybmFsRU9iamVjdCkgai5uZXh0KCk7Ci0JCQkJCQlpZiAocHJveHkuZUlzUHJveHkoKSkKLQkJCQkJCQlwcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCgoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZSkuZUlzUHJveHkoKSkKLQkJCQkJcHJveGllcy5hZGQodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCWlmIChyZWZPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzb2x2ZU5vbkNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKLQkJCXJlc29sdmVDb250YWluZWRQcm94aWVzKHJlZk9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc3RpbmcgY29udGV4dCBiYXNlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5nZXRFTUZDb250ZXh0KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZXNvdXJjZSBmcm9tIHRoZSBVUkkuIFRoZSBVUkkgbXVzdCBjb250YWluIHRoZSBwcm9qZWN0IG5hbWUsIGVpdGhlciBhcyB0aGUgZmlyc3Qgc2VnbWVudCwgb3IgaWYgaW4gcGxhdGZvcm0gcmVzb3VyY2UgdXJsIHByb3RvY29sLgotCSAqIHtAbGluayAjZ2V0UmVzb3VyY2VTZXQoVVJJKX0KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBhIG5ldyByZXNvdXJjZSBmb3IgdGhlIHVyaSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwcm9qZWN0IHVyaQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCh1cmkpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZvciBhIGNhY2hlZCBSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgbm9uZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IFJlc291cmNlIGZvciB3aXRoIHRoZSBVUkkgYWdhaW5zdCB0aGUgcHJvcGVyIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgdXJpLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KHVyaSkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIElGaWxlIGZvciB0aGUgVVJJLiBUaGUgVVJJIG11c3QgYmUgYSB3b3JrYmVuY2ggcHJvamVjdCBzdHlsZSBVUkkuIAotCSAqIEBwYXJhbSB1cmkgVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHRoZSBJRmlsZSBpZiB0aGUgVVJJIGlzIGEgcHJvamVjdCBmb3JtLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwcm9qZWN0IGZvcm0sIE9SIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QuIFRoZSBJRmlsZSByZXR1cm5lZCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGV4aXN0LiBVc2Uge0BsaW5rIElGaWxlI2V4aXN0cygpfSB0byB0ZXN0IHRoYXQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRJRmlsZShVUkkgdXJpKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHVyaSk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGg7Ci0JCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKLQkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcGF0aCBhbmQgcmVtb3ZlIHRoZSBmaXJzdCB0d28gc2VnbWVudHMgKC9yZXNvdXJjZS9wcm9qZWN0IG5hbWUvKS4KLQkJCQlwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gTmVlZCB0byBnZXQgdGhlIHBhdGggYW5kIHJlbW92ZSB0aGUgZmlyc3Qgc2VnbWVudCAoL3Byb2plY3QgbmFtZS8pLgotCQkJCXBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJfQotCQkJcmV0dXJuIHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYSBjYWNoZWQgUmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBVUkksIGlmIG5vbmUgaXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBSZXNvdXJjZSBmb3Igd2l0aCB0aGUgVVJJIGFnYWluc3QgdGhlIGdpdmVuIFJlc291cmNlU2V0LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgCi0JICogQHBhcmFtIHNldAotCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgc2V0IHdhcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJaWYgKHNldCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmVzID0gc2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBvciBleGlzdGluZyBjb250ZXh0IGJhc2Ugb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LiBBbGxvdyB0aGUgPGNvZGU+Y29udHJpYnV0b3I8L2NvZGU+IHRvIGNvbnRyaWJ1dGUgdG8gdGhlIG5ldyBvciBleGlzdGluZwotCSAqIG5hdHVyZSBwcmlvciB0byByZXR1cm5pbmcuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIGNvbnRyaWJ1dG9yCi0JICogQHJldHVybiB0aGUgY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZUVNRkNvbnRleHQoYVByb2plY3QsIGNvbnRyaWJ1dG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIHRoZSBwYXNzZWQgVVJJIGhhdmUgdGhlIGZvcm0gcGxhdGZvcm06L3Jlc291cmNlLy4uLiA/Ci0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgYSBwbGF0Zm9ybSByZXNvdXJjZSBwcm90b2NvbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybVJlc291cmNlVVJJKFVSSSB1cmkpIHsKLQkJcmV0dXJuIEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUFJPVE9DT0wuZXF1YWxzKHVyaS5zY2hlbWUoKSkgJiYgSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXBpIG1heSBiZSB1c2VkIHRvIGNhY2hlIGEgUmVzb3VyY2UgaWYgaXQgaGFzIGEgVVJJIHRoYXQgaXMgV29ya3NwYWNlIHJlbGF0aXZlLiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBjYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgd2FzIHN1Y2Nlc3NmdWwgdG8gY2FjaGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2VTZXQoYVJlc291cmNlLmdldFVSSSgpKTsKLQkJCWlmIChzZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2V0LmdldFJlc291cmNlcygpLmFkZChhUmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFwaSBpcyB1c2VkIGlmIHlvdSBjcmVhdGUgYSBuZXcgTU9GIHJlc291cmNlIGFuZCB5b3Ugd2FudCB0byBhZGQgaXQgdG8gdGhlIGNvcnJlY3QgUmVzb3VyY2VTZXQuIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWQgdGhlIElQcm9qZWN0Ci0JICogdGhhdCB5b3Ugd2FudCBhUmVzb3VyY2UgdG8gYmUgY2FjaGVkIHdpdGhpbiBhcyB3ZWxsIGFzIHRoZSBJUGF0aCB3aGljaCBpcyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV3IFJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlc291cmNlIHdhcyBjYWNoZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlUmVzb3VyY2UoSVByb2plY3QgYVByb2plY3QsIFJlc291cmNlIGFSZXNvdXJjZSwgSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgYVJlc291cmNlID09IG51bGwgfHwgIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldChhUHJvamVjdCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJVVJJIGNvbnZlcnRlZCA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoYVJlc291cmNlLmdldFVSSSgpKTsKLQkJCWlmIChjb252ZXJ0ZWQgIT0gYVJlc291cmNlLmdldFVSSSgpKQotCQkJCWFSZXNvdXJjZS5zZXRVUkkoY29udmVydGVkKTsKLQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGF0aCBvZiB0aGUgcHJvamVjdCByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9yIHJlbGF0aXZlIHRvIHRoZSBsaXN0IG9mIGNvbnRhaW5lcnMgaW4gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3R1YWxQcm9qZWN0UmVsYXRpdmVVUkkoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwgfHwgIWFSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IGdldFBhdGhJblByb2plY3QocHJvamVjdCwgYVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQlyZXR1cm4gcGF0aC5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJUGF0aCB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgYSBSZXNvdXJjZSB1c2luZyB0aGUgPGNvZGU+ZnVsbFBhdGg8L2NvZGU+LiBUaGlzIHdpbGwgYmUgYSBwcm9qZWN0IHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFBhdGhJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZnVsbFBhdGgpIHsKLQkJTGlzdCBjb250YWluZXJzID0gZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWlmICghY29udGFpbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZ2V0UGF0aEZyb21Db250YWluZXJzKGNvbnRhaW5lcnMsIGZ1bGxQYXRoKTsKLQkJcmV0dXJuIGZ1bGxQYXRoOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIG5hdHVyZSA9IGNyZWF0ZUVNRkNvbnRleHQocHJvamVjdCwgbnVsbCk7Ci0JCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIGNvbnYgPSAoV29ya2JlbmNoVVJJQ29udmVydGVyKSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ICE9IG51bGwpCi0JCQkJcmV0dXJuIGNvbnYuZ2V0SW5wdXRDb250YWluZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBwYXRoIGlzIGNvbnRhaW5lZCB3aXRoaW4gb25lIG9mIHRoZSBsaXN0ZWQgY29udGFpbmVycywgdGhlbiByZXR1cm4gdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVycwotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gcGF0aCByZWxhdGl2ZSB0byBhIGNvbnRhaW5lciwgb3IgdW5jaGFuZ2VkIHBhdGggaWYgbm90IGluIGEgY29udGFpbmVyLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGF0aEZyb21Db250YWluZXJzKExpc3QgY29udGFpbmVycywgSVBhdGggZnVsbFBhdGgpIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQlJUGF0aCByZXN1bHQ7Ci0JCWludCBzaXplID0gY29udGFpbmVycy5zaXplKCk7Ci0JCWludCBtYXRjaGluZyA9IC0xOwotCQlJUGF0aCBjb250YWluZXJQYXRoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29udGFpbmVyID0gKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpOwotCQkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQkJbWF0Y2hpbmcgPSBmdWxsUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoY29udGFpbmVyUGF0aCk7Ci0JCQlpZiAobWF0Y2hpbmcgPiAwICYmIG1hdGNoaW5nID09IGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkpIHsKLQkJCQlyZXN1bHQgPSBmdWxsUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoaW5nKTsKLQkJCQlyZXN1bHQgPSByZXN1bHQubWFrZVJlbGF0aXZlKCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZnVsbFBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIDxjb2RlPnVyaTwvY29kZT4gaGFzIGl0cyBjb250YWluZXIgc2VnbWVudHMgdmlzaWJsZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXJzIGZvciB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXJpIGlzIHZpc2libGUgZnJvbSB0aGUgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udGFpbmVyU3RydWN0dXJlKElQcm9qZWN0IHByb2plY3QsIFVSSSB1cmkpIHsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaS50b1N0cmluZygpKTsKLQkJCUxpc3QgY29udGFpbmVycyA9IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKHByb2plY3QpOwotCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCQlJUGF0aCBjb250YWluZXJQYXRoID0gc2VnbWVudENvdW50ID4gMSA/IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpIDogbnVsbDsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVycy5zaXplKCk7IGkrKykgewotCQkJCWNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBjb250YWluZXJzLmdldChpKTsKLQkJCQlpZiAoIWNvbnRhaW5lci5pc0FjY2Vzc2libGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHNlZ21lbnRDb3VudCA9PSAxKSB7Ci0JCQkJCWlmIChjb250YWluZXIgPT0gcHJvamVjdCkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY29udGFpbmVyUGF0aCAhPSBudWxsKSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlcihjb250YWluZXJQYXRoKTsKLQkJCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIGZvbGRlci5pc0FjY2Vzc2libGUoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhlIHVyaS4gVGhlIFVSSSBNVVNUIGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4uIiB0eXBlIFVSSSBvciBpdAotCSAqIG11c3QgYmUgb2YgdHlwZSAicHJvamVjdC1uYW1lLy4uLiIuIFRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gcmVzb3VyY2VzIHRoYXQgYXJlIHdvcmtiZW5jaCBwcm9qZWN0IHJlc291cmNlcy4KLQkgKiBBbnkgb3RoZXIgdHlwZSBvZiBVUkkgd2lsbCBjYXVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byBiZSByZXR1cm5lZC4gSXQgd2lsbCBiZSBsb2FkZWQgaWYgbm90IGFscmVhZHkgbG9hZGVkLiBJZiBpdCBpcyBub3QgdG8KLQkgKiBiZSBsb2FkZWQgaWYgbm90IGxvYWRlZCB1c2Uge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfSBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkgbXVzdCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uIiBmb3JtIG9yIGl0IG11c3QgYmUgInByb2plY3QtbmFtZS8uLi4iLiBBbnkgb3RoZXIgZm9ybSB3aWxsIGJlIGludmFsaWQuCi0JICogQHJldHVybiByZXNvdXJjZSBpZiB1cmkgaXMgZm9yIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdCBub3QgZm91bmQgb3Igbm90IGEgdmFsaWQgcHJvamVjdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFdyYXBwZWRFeGNlcHRpb24gaWYgdmFsaWQgcHJvamVjdCBmb3JtYXQgVVJJIGJ1dCBmaWxlIG5vdCBmb3VuZCBvciBzb21lIG90aGVyIGVycm9yIG9uIGxvYWQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUgd2l0aG91dCBmb3JjaW5nIGEgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoYUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlLCBmb3JjaW5nIGEgbG9hZCBpZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IHNheXMgc28uCi0JICogCi0JICogQHBhcmFtIGFGaWxlCi0JICogQHBhcmFtIGxvYWRPbkRlbWFuZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBmb3JjZSBhIGxvYWQgb2YgcmVzb3VyY2UgaWYgbm90IGxvYWRlZC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJRmlsZSBhRmlsZSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGFGaWxlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSB3aXRob3V0IGEgbG9hZCBpZiBub3QgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGxvYWQoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKGFGaWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGUgdXJpLiBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0Ci0JICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgotCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSB1cmkgbXVzdCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uIiBmb3JtIG9yIGl0IG11c3QgYmUgInByb2plY3QtbmFtZS8uLi4iLiBBbnkgb3RoZXIgZm9ybSB3aWxsIGJlIGludmFsaWQuCi0JICogQHBhcmFtIGxvYWRPbkRlbWFuZCA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGNhdXNlIHJlc291cmNlIHRvIGJlIGxvYWRlZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuCi0JICogQHJldHVybiByZXNvdXJjZSBpZiB1cmkgaXMgZm9yIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2plY3Qgbm90IGZvdW5kLCBvciBub3QgYSB2YWxpZCBwcm9qZWN0IHJlc291cmNlIHVyaS4KLQkgKiAKLQkgKiBAdGhyb3dzIFdyYXBwZWRFeGNlcHRpb24gaWYgdmFsaWQgcHJvamVjdCBmb3JtYXQgVVJJIGJ1dCBmaWxlIG5vdCBmb3VuZCBvciBzb21lIG90aGVyIGVycm9yIG9uIGxvYWQgaWYgbG9hZE9uRGVtYW5kIGlzIHRydWUuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldCh1cmkpOwotCQlpZiAoc2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gc2V0LmdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgUmVzb3VyY2VTZXQgZm9yIHRoZSBwYXNzZWQgVVJJLiBUaGUgVVJJIHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0IHBsYXRmb3JtOi9yZXNvdXJjZS97cHJvamVjdCBuYW1lfS8uLi4gb3Ige3Byb2plY3QgbmFtZX0vLi4uIGZvciB0aGlzCi0JICogYXBpIHRvIHdvcmsuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgb2YgY29ycmVjdCBmb3JtIG9yIHByb2plY3QgZG9lc24ndCBoYXZlIGEgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoVVJJIHVyaSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCh1cmkpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQocHJvamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEdldCB0aGUgcHJvamVjdCBmb3IgdGhlIHVyaSBpZiB0aGUgdXJpIGlzIGEgdmFsaWQgd29ya2JlbmNoIHByb2plY3QgZm9ybWF0IHVyaS4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChVUkkgdXJpKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZTsKLQkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKQotCQkJcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKLQkJZWxzZSBpZiAodXJpLnNjaGVtZSgpID09IG51bGwpIHsKLQkJCXByb2plY3ROYW1lID0gbmV3IFBhdGgodXJpLnBhdGgoKSkuc2VnbWVudCgwKTsgLy9hc3N1bWUgcHJvamVjdCBuYW1lIGlzIGZpcnN0IGluIHRoZSBVUkkKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFVSSS5kZWNvZGUocHJvamVjdE5hbWUpKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgZm9yIHRoZSBwYXNzZWQgSVByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHJlc291cmNlIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBuYXQgPSBjcmVhdGVFTUZDb250ZXh0KHByb2plY3QsIG51bGwpOwotCQlpZiAobmF0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmF0LmdldFJlc291cmNlU2V0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd29ya3NwYWNlLiAoanVzdCB1c2Uge0BsaW5rIFJlc291cmNlc1BsdWdpbiNnZXRXb3Jrc3BhY2UoKX0pLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gc2V0Ci0JICogQHJldHVybiBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHJlc291cmNlIHNldCBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChzZXQgIT0gbnVsbCkgewotCQkJaWYgKHNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkgewotCQkJCVByb2plY3RSZXNvdXJjZVNldCBwc2V0ID0gKFByb2plY3RSZXNvdXJjZVNldCkgc2V0OwotCQkJCXJldHVybiBwc2V0LmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkVVJJTWFwcGluZyhTdHJpbmcgaHJlZikgewotCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZSA9IGhyZWY7Ci0JCQlpbnQgaW5kZXggPSBocmVmLmluZGV4T2YoJyMnKTsKLQkJCWlmIChpbmRleCA+IC0xKQotCQkJCWZpbGUgPSBocmVmLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQlyZXR1cm4gVVJJQ29udmVydGVyLlVSSV9NQVAuZ2V0KGZpbGUpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2YgdGhlIHJlc291cmNlcyBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYW5kIHRoZW4gdW5sb2FkIHRoZW0uIFVubG9hZCBmb3JjZXMgYWxsIG9mIHRoZSBvYmplY3RzIHRvIGJlY29tZSBwcm94aWVzIHNvIG5leHQgcmVzb2x2ZSB3aWxsCi0JICogcmVsb2FkIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHBhcmFtIGFTZXQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5kVW5sb2FkQWxsKExpc3QgcmVzb3VyY2VzLCBSZXNvdXJjZVNldCBhU2V0KSB7Ci0JCWlmIChhU2V0ID09IG51bGwgfHwgcmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJYVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzKTsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJcmVzLnVubG9hZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHVybiBvYmplY3QgaW50byBhIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBhbk9iamVjdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgb2JqZWN0IHdhcyBhYmxlIHRvIGJlY29tZSBhIHByb3h5LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiZWNvbWVQcm94eShFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBhbk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCQkJKChJbnRlcm5hbEVPYmplY3QpIGFuT2JqZWN0KS5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KHJlcy5nZXRVUklGcmFnbWVudChhbk9iamVjdCkpKTsKLQkJCQkvL2FuT2JqZWN0LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBXcmFwcGVkRXhjZXB0aW9uIGlzIGFjdHVhbGx5IGEgUmVzb3VyY2UgTm90IEZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVkRXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIGV4Y2VwdGlvbiB3cmFwcGVycyBhIHJlc291cmNlIG5vdCBmb3VuZC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXNvdXJjZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCUV4Y2VwdGlvbiBleGNlcCA9IHdyYXBwZWRFeC5leGNlcHRpb24oKTsKLQkJd2hpbGUgKGV4Y2VwIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJZXhjZXAgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGV4Y2VwKS5leGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gcHJpbUlzUmVzb3VyY2VOb3RGb3VuZChleGNlcCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKFRocm93YWJsZSBleGNlcCkgewotCQlpZiAoZXhjZXAgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZXhjZXApLmdldFN0YXR1cygpOwotCQkJcmV0dXJuIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLlJFU09VUkNFX05PVF9GT1VORCAmJiBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLmVxdWFscyhzdGF0dXMuZ2V0UGx1Z2luKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgV3JhcHBlZEV4Y2VwdGlvbiBpcyBhY3R1YWxseSBhIFJlc291cmNlIE5vdCBGb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlZEV4Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyBleGNlcHRpb24gd3JhcHBlcnMgYSByZXNvdXJjZSBub3QgZm91bmQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVzb3VyY2VOb3RGb3VuZChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7Ci0JCXJldHVybiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKHdyYXBwZWRFeC5nZXRDYXVzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBVUkkgcmVwcmVzZW5hdGlvbiBvZiB0aGUgcGxhdGZvcm1VUkkgd2l0aG91dCB0aGUgbGVhZGluZyAicGxhdGZvcm06L3Jlc291cmNlLyIgaWYgcHJlc2VudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGxhdGZvcm1VUkkKLQkgKiBAcmV0dXJuIHVyaQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldE5vblBsYXRmb3JtVVJJKFVSSSBwbGF0Zm9ybVVSSSkgewotCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHBsYXRmb3JtVVJJKSkgewotCQkJU3RyaW5nIHVyaVN0cmluZyA9IHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhwbGF0Zm9ybVVSSSk7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBwbGF0Zm9ybVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW5hdGlvbiBvZiB0aGUgcGxhdGZvcm1VUkkgd2l0aG91dCB0aGUgbGVhZGluZyAicGxhdGZvcm06L3Jlc291cmNlLyIgaWYgcHJlc2VudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGxhdGZvcm1VUkkKLQkgKiBAcmV0dXJuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcoVVJJIHBsYXRmb3JtVVJJKSB7Ci0JCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkocGxhdGZvcm1VUkkpKSB7IHJldHVybiBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcocGxhdGZvcm1VUkkpOyB9Ci0JCXJldHVybiBwbGF0Zm9ybVVSSS50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogUmVtb3ZlICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcGxhdGZvcm1VUkkgYW5kIHJldHVybiB0aGUgcmVtYWluaW5nIFN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKFVSSSBwbGF0Zm9ybVVSSSkgewotCQlTdHJpbmcgdXJpU3RyaW5nID0gcGxhdGZvcm1VUkkudG9TdHJpbmcoKTsKLQkJLy8icGxhdGZvcm06L3Jlc291cmNlLyIgaXMgMTkgY2hhcmFjdGVycy4KLQkJcmV0dXJuIHVyaVN0cmluZy5zdWJzdHJpbmcoMTksIHVyaVN0cmluZy5sZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgcGFzc2VkIFVSSSBoYXZlIHRoZSBmb3JtIHBsYXRmb3JtOi9wbHVnaW4vLi4uID8KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB1cmkgaXMgcGxhdGZvcm0gcGx1Z2luIHByb3RvY29sLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoVVJJIHVyaSkgewotCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTY4NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIFdvcmtiZW5jaFVSSSBjb252ZXJ0ZXJzLiBXb3JrYmVuY2ggVVJJIGNvbnZlcnRlcnMgaGFuZGxlIHJlZmVyZW5jZXMgdG8gZmlsZXMgaW4gdGhlIHByb2plY3QncyBjb250YWluZXJzLgotICogVGhpcyBjb252ZXJ0ZXIgaXMgb25seSBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBvbGQgYW1iaWd1b3VzIHdvcmtiZW5jaCBVUklzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2JlbmNoVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKLQotCS8qKgotCSAqIEFkZCBpbnB1dCBjb250YWluZXIgdG8gdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKTsKLQotCS8qKgotCSAqIEFkZCBsaXN0IG9mIGNvbnRhaW5lcnMgdG8gdGhlIGNvbnZlcnRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVycwotCSAqICAgICAgICAgICAgbGlzdCBvZiA8Y29kZT5JQ29udGFpbmVyPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXZvaWQgYWRkSW5wdXRDb250YWluZXJzKExpc3QgY29udGFpbmVycyk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgcmVsYXRpdmUgdG8gYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gZmlsZSByZWxhdGl2ZSB0byBhIGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0RmlsZShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIEdldCBmaXJzdCBpbnB1dCBjb250YWluZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGZpcnN0IGlucHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJQ29udGFpbmVyIGdldElucHV0Q29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGlucHV0IGNvbnRhaW5lcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgaW5wdXQgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlMaXN0IGdldElucHV0Q29udGFpbmVycygpOwotCi0JLyoqCi0JICogR2V0IHRoZSBvdXRwdXQgY29udGFpbmVyIGlmIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIG91dHB1dCBjb250YWluZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQl2b2lkIHNldE91dHB1dENvbnRhaW5lcihJQ29udGFpbmVyIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSUZpbGUgZm9yCi0JICogCi0JICogQGFQYXRoLiBJZiB3ZSBoYXZlIGEgcGFyZW50IGFuZCB3ZSBkbyBub3QgY29udGFpbiB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0aGUgYVBhdGgsIGZvcndhcmQgdG8gdGhlIHBhcmVudCB0byByZXRyaWV2ZSB0aGUgZmlsZS4KLQkgKiBAcGFyYW0gYVBhdGgKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSUZpbGUgZ2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCk7Ci0KLQkvKioKLQkgKiBHZXQgb3V0cHV0IGZpbGUgd2l0aCBtYXBwaW5nIGFwcGxpZWQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJRmlsZSBnZXRPdXRwdXRGaWxlV2l0aE1hcHBpbmdBcHBsaWVkKFN0cmluZyB1cmkpOwotCi0JLyoqCi0JICogUmVtb3ZlIGlucHV0IGNvbnRhaW5lciBmcm9tIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlbW92ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JYm9vbGVhbiByZW1vdmVJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgd2UgY2FuIHJldHJpZXZlIHRoZSByZXNvdXJjZSB1c2VkIHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtIG9uLgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZpbGVuYW1lIGlzIHZhbGlkIGZvciBmaWxlIHN0cmVhbSBhY2Nlc3MuCi0JICogQHNpbmNlIDEuMC4wCi0JICogIAotCSAqLwotCWJvb2xlYW4gY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKFN0cmluZyBhRmlsZU5hbWUpOwotCi0JLyoqCi0JICogSXMgZm9yY2Ugc2F2ZSByZWxhdGl2ZSBmbGFnIHR1cm5lZCBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGZvcmNlIHNhdmUgcmVsYXRpdmUgaXMgdHVybmVkIG9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCWJvb2xlYW4gaXNGb3JjZVNhdmVSZWxhdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgaWYgeW91IGRvIG5vdCB3YW50IGFueSBwYXRoIG1hbmlwdWxhdGlvbiB3aGVuIGNyZWF0aW5nIHRoZSBvdXRwdXQgc3RyZWFtLi4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2VTYXZlUmVsYXRpdmUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZvcmNlIHNhdmVzIGFzIHJlbGF0aXZlLgotCSAqLwotCXZvaWQgc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjU1NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS42ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbCBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwgaW1wbGVtZW50cyBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgV09SS1NQQUNFX1JPT1QgPSBVUklDb252ZXJ0ZXJJbXBsLndvcmtzcGFjZVJvb3Q7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OID0gV09SS1NQQUNFX1JPT1QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIElOVkFMSURfUEFUSCA9IG5ldyBQYXRoKCIhISEhfiEhISEiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbGUgSU5WQUxJRF9GSUxFID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShJTlZBTElEX1BBVEguYXBwZW5kKElOVkFMSURfUEFUSCkpOwotCi0JLy9Vc2VkIHRvIGF2b2lkIHRyeWluZyB0byBmaXh1cCB0aGUgVVJJIHdoZW4gZ2V0dGluZyB0aGUKLQkvL091dHB1dFN0cmVhbQotCXByb3RlY3RlZCBib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBpbnB1dENvbnRhaW5lcnM7Ci0KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBvdXRwdXRDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXI7Ci0JCi0JLyoKLQkgKiBLTFVER0U6IFdlIG5lZWQgdG8ga25vdyB0aGUgbWV0YSBkYXRhIGFyZWEuIFRoaXMgaXMgc28gdGhhdCBhbnkgdXJpIHRoYXQgc3RhcnRzIHdpdGggdGhlIG1ldGFkYXRhIGRpcmVjdG9yeQotCSAqIGlzIGNvbnNpZGVyZWQgYSBmaWxlIHVyaSBhbmQgTk9UIGEgd29ya3NwYWNlIHVyaS4gVGhlIG1ldGFkYXRhIGlzIHdoZXJlIHBsdWdpbidzIHN0b3JlIHRoZWlyIHdvcmtpbmcgZGF0YS4KLQkgKiBJdCBpcyBub3QgcGFydCBvZiB0aGUgd29ya3NwYWNlIHJvb3QuCi0JICogIAotCSAqIFRoZXJlIGlzIG5vIHJlcXVlc3QgZm9yIHNpbXBseSB0aGUgbWV0YWRhdGEgYXJlYS4gVGhlIGxvZyBmaWxlIGlzIGluIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkuIFNvIHdlIHdpbGwKLQkgKiBnZXQgdGhlIGxvZyBmaWxlIGxvY2F0aW9uIGFuZCBqdXN0IHJlbW92ZSB0aGUgbG9nIGZpbGUgbmFtZS4gVGhhdCBzaG91bGQgbGVhdmUgdXMgd2l0aCB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5Ci0JICogb25seS4gSWYgRWNsaXBzZSBldmVyIGRlY2lkZXMgdG8gbW92ZSBpdCBmcm9tIGhlcmUsIHRoaXMgd2lsbCBubyBsb25nZXIgd29yay4gQnV0IGl0IGhhc24ndCBtb3ZlZCBpbiB0aHJlZSAKLQkgKiB2ZXJzaW9ucy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBNRVRBREFUQV9MT0NBVElPTiA9IFBsYXRmb3JtLmdldExvZ0ZpbGVMb2NhdGlvbigpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb252ZXJ0ZXIgY29uc3RydWN0b3IsIG5vIGNvbnRhaW5lcnMuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyKSB7Ci0JCXRoaXMoYW5JbnB1dENvbnRhaW5lciwgKFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIgYW5kIGEgc3luY2hyb256aWVyLgotCSAqIAotCSAqIEBwYXJhbSBhQ29udGFpbmVyCi0JICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKLQkJdGhpcyhhQ29udGFpbmVyLCBudWxsLCBhU3luY2hyb25pemVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBpbnB1dCBjb250YWluZXIgYW5kIGFuIG91dHB1dCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIpIHsKLQkJdGhpcyhhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyLCBvdXRwdXQgY29udGFpbmVyLCBhbmQgYSBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlhZGRJbnB1dENvbnRhaW5lcihhbklucHV0Q29udGFpbmVyKTsKLQkJc2V0T3V0cHV0Q29udGFpbmVyKGFuT3V0cHV0Q29udGFpbmVyKTsKLQkJcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIgPSBhU3luY2hyb25pemVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjYWRkSW5wdXRDb250YWluZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpIHsKLQkJaWYgKGFDb250YWluZXIgIT0gbnVsbCAmJiAhZ2V0SW5wdXRDb250YWluZXJzKCkuY29udGFpbnMoYUNvbnRhaW5lcikpCi0JCQlnZXRJbnB1dENvbnRhaW5lcnMoKS5hZGQoYUNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNhZGRJbnB1dENvbnRhaW5lcnMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5wdXRDb250YWluZXJzKExpc3QgY29udGFpbmVycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZElucHV0Q29udGFpbmVyKChJQ29udGFpbmVyKSBjb250YWluZXJzLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3JlbW92ZUlucHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7Ci0JCXJldHVybiBnZXRJbnB1dENvbnRhaW5lcnMoKS5yZW1vdmUoYUNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRJbnB1dENvbnRhaW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldElucHV0Q29udGFpbmVycygpIHsKLQkJaWYgKGlucHV0Q29udGFpbmVycyA9PSBudWxsKQotCQkJaW5wdXRDb250YWluZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gaW5wdXRDb250YWluZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0SW5wdXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldElucHV0Q29udGFpbmVyKCkgewotCQlpZiAoIWdldElucHV0Q29udGFpbmVycygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUNvbnRhaW5lcikgZ2V0SW5wdXRDb250YWluZXJzKCkuZ2V0KDApOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dENvbnRhaW5lcigpCi0JICovCi0JcHVibGljIElDb250YWluZXIgZ2V0T3V0cHV0Q29udGFpbmVyKCkgewotCQlpZiAob3V0cHV0Q29udGFpbmVyID09IG51bGwpCi0JCQlvdXRwdXRDb250YWluZXIgPSBnZXRJbnB1dENvbnRhaW5lcigpOwotCQlyZXR1cm4gb3V0cHV0Q29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjc2V0T3V0cHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0Q29udGFpbmVyKElDb250YWluZXIgbmV3T3V0cHV0Q29udGFpbmVyKSB7Ci0JCW91dHB1dENvbnRhaW5lciA9IG5ld091dHB1dENvbnRhaW5lcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlKElQYXRoIGFQYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZ2V0T3V0cHV0Q29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJaWYgKGZvcmNlU2F2ZVJlbGF0aXZlKQotCQkJCXJldHVybiBwcmltR2V0T3V0cHV0RmlsZShhUGF0aCk7Ci0JCQlmaWxlID0gZ2V0T3V0cHV0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoYVBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcHJpbUdldE91dHB1dEZpbGUoYVBhdGgpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBwcmltR2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCkgewotCQlyZXR1cm4gcHJpbUdldEZpbGUoZ2V0T3V0cHV0Q29udGFpbmVyKCksIGFQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0T3V0cHV0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoSVBhdGggYVBhdGgpIHsKLQkJSUNvbnRhaW5lciBvdXQgPSBnZXRPdXRwdXRDb250YWluZXIoKTsKLQkJcmV0dXJuIGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKGFQYXRoLCBvdXQsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMoSVBhdGggYVBhdGgsIElDb250YWluZXIgY29udGFpbmVyLCBib29sZWFuIHRlc3RFeGlzdHMpIHsKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAodGVzdEV4aXN0cykgewotCQkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQlpZiAoIWNvbnRhaW5lclBhdGguaXNFbXB0eSgpKSB7Ci0JCQkJZmlsZSA9IGdldEZpbGVGb3JNYXRjaGluZ1BhdGgoYVBhdGgsIGNvbnRhaW5lclBhdGgsIGNvbnRhaW5lcik7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJfQotCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCWZpbGUgPSBnZXRGaWxlRm9yTWF0Y2hpbmdQYXRoKGFQYXRoLCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZUZvck1hdGNoaW5nUGF0aChJUGF0aCBjb250YWluZXJQYXRoLCBJUGF0aCBzb3VyY2VQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlpbnQgbWF0Y2hlcyA9IDA7Ci0JCW1hdGNoZXMgPSBjb250YWluZXJQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhzb3VyY2VQYXRoKTsKLQkJaWYgKG1hdGNoZXMgPiAwICYmIG1hdGNoZXMgPT0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJSVBhdGggbG9hZFBhdGggPSBjb250YWluZXJQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hlcyk7Ci0JCQlyZXR1cm4gcHJpbUdldEZpbGUoY29udGFpbmVyLCBsb2FkUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0RmlsZShuZXcgUGF0aCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpbGUgZnJvbSB0aGUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiBAc2VlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRGaWxlKFN0cmluZykKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZ2V0SW5wdXRDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5tYWtlUmVsYXRpdmUoKTsKLQkJCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGdldElucHV0Q29udGFpbmVycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNvbnRhaW5lciBjb24gPSAoSUNvbnRhaW5lcikgaXQubmV4dCgpOwotCQkJCWZpbGUgPSBnZXRJbnB1dEZpbGUoY29uLCBwYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gSU5WQUxJRF9GSUxFOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3V0cHV0IGZpbGUgZnJvbSBzdHJpbmcgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGUoSVBhdGgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldE91dHB1dEZpbGUoU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gZ2V0T3V0cHV0RmlsZShuZXcgUGF0aCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlucHV0IGZpbGUgZnJvbSB0aGUgY29udGFpbmVyIGFuZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBjb24KLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0SW5wdXRGaWxlKElDb250YWluZXIgY29uLCBJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoV09SS1NQQUNFX1JPT1QuZXF1YWxzKGNvbikgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlwYXRoID0gSU5WQUxJRF9QQVRILmFwcGVuZChwYXRoKTsKLQkJZmlsZSA9IHByaW1HZXRGaWxlKGNvbiwgcGF0aCk7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQlmaWxlID0gZ2V0RmlsZUZvclBhdGhXaXRoQ29udGFpbmVyU2VnbWVudHMocGF0aCwgY29uLCB0cnVlKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWxlIHByaW1HZXRGaWxlKElDb250YWluZXIgY29udGFpbmVyLCBJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29udGFpbmVyLmdldEZpbGUocGF0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuR2V0VW5kZXJseWluZ1Jlc291cmNlKFN0cmluZyBhRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoYUZpbGVOYW1lKTsKLQkJcmV0dXJuIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjaXNGb3JjZVNhdmVSZWxhdGl2ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JjZVNhdmVSZWxhdGl2ZSgpIHsKLQkJcmV0dXJuIGZvcmNlU2F2ZVJlbGF0aXZlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVNhdmVSZWxhdGl2ZShib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlKSB7Ci0JCXRoaXMuZm9yY2VTYXZlUmVsYXRpdmUgPSBmb3JjZVNhdmVSZWxhdGl2ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIjbm9ybWFsaXplKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovcHVibGljIFVSSSBub3JtYWxpemUoVVJJIHVyaSkgewotCQlVUkkgcmVzdWx0ID0gdXJpOwotCQlTdHJpbmcgZnJhZ21lbnQgPSBudWxsOwotCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCWZyYWdtZW50ID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlyZXN1bHQgPSB1cmkudHJpbUZyYWdtZW50KCk7Ci0JCX0KLQkJcmVzdWx0ID0gZ2V0SW50ZXJuYWxVUklNYXAoKS5nZXRVUkkocmVzdWx0KTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkocmVzdWx0KSkKLQkJCXJldHVybiBhcHBlbmRGcmFnbWVudChyZXN1bHQsIGZyYWdtZW50KTsKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkocmVzdWx0KSkgewotCQkJVVJJIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQbHVnaW5VUkkocmVzdWx0LCBmcmFnbWVudCk7Ci0JCQlyZXR1cm4gKG5vcm1hbGl6ZWQgIT0gbnVsbCkgPyBub3JtYWxpemVkIDogdXJpOwotCQl9Ci0JCVN0cmluZyBwcm90b2NvbCA9IHJlc3VsdC5zY2hlbWUoKTsKLQkJVVJJIGZpbGVTZWFyY2hVUkkgPSBudWxsOwotCQlpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotCQkJZmlsZVNlYXJjaFVSSSA9IG5vcm1hbGl6ZUVtcHR5UHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7Ci0JCQlpZiAoZmlsZVNlYXJjaFVSSSAhPSBudWxsKQotCQkJCXJldHVybiBmaWxlU2VhcmNoVVJJOwotCQl9IGVsc2UgaWYgKEZJTEVfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSkgewotCQkJZmlsZVNlYXJjaFVSSSA9IG5vcm1hbGl6ZUZpbGVQcm90b2NvbChyZXN1bHQsIGZyYWdtZW50KTsKLQkJCWlmIChmaWxlU2VhcmNoVVJJICE9IG51bGwpCi0JCQkJcmV0dXJuIGZpbGVTZWFyY2hVUkk7Ci0JCX0gZWxzZSBpZiAoSkVNVXRpbFBsdWdpbi5XT1JLU1BBQ0VfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSkKLQkJCXJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQcm90b2NvbChyZXN1bHQsIGZyYWdtZW50KTsKLQkJcmV0dXJuIHN1cGVyLm5vcm1hbGl6ZSh1cmkpOwotCX0KLQotCS8qCi0JICogUmVzb2x2ZXMgYSBwbHVnaW4gZm9ybWF0IGludG8gdGhlIGFjdHVhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZVBsdWdpblVSSShVUkkgdXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJaWYgKHVyaS5zZWdtZW50Q291bnQoKSA8IDIpCi0JCQlyZXR1cm4gdXJpOyAvLyBJbnZhbGlkLCBqdXN0IGxldCBpdCBnbyBvbi4KLQkJLy8gU2VlIGlmIGFscmVhZHkgbm9ybWFsaXplZC4KLQkJaW50IHVfc2NvcmVOZHggPSB1cmkuc2VnbWVudCgxKS5sYXN0SW5kZXhPZignXycpOwotCQlpZiAodV9zY29yZU5keCAhPSAtMSkgewotCQkJLy8gTm90IG5vcm1hbGl6ZWQuIFJlbW92ZSB0aGUgdmVyc2lvbiB0byBtYWtlIGl0IG5vcm1hbGl6ZWQuCi0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHVyaS5zZWdtZW50cygpOwotCQkJc2VnbWVudHNbMV0gPSBzZWdtZW50c1sxXS5zdWJzdHJpbmcoMCwgdV9zY29yZU5keCk7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUhpZXJhcmNoaWNhbFVSSSh1cmkuc2NoZW1lKCksIHVyaS5hdXRob3JpdHkoKSwgdXJpLmRldmljZSgpLCBzZWdtZW50cywgdXJpLnF1ZXJ5KCksIGZyYWdtZW50KTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdXJpOwotCX0KLQotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplV29ya3NwYWNlUHJvdG9jb2woVVJJIGFXb3Jrc3BhY2VVUkksIFN0cmluZyBmcmFnbWVudCkgewotCQlVUkkgcmVzdWx0OwotCQlTdHJpbmcgdXJpU3RyaW5nID0gYVdvcmtzcGFjZVVSSS50b1N0cmluZygpOwotCQl1cmlTdHJpbmcgPSB1cmlTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uV09SS1NQQUNFX1BST1RPQ09MLmxlbmd0aCgpICsgMSk7Ci0JCXJlc3VsdCA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHVyaVN0cmluZyk7Ci0JCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJcmVzdWx0ID0gYXBwZW5kRnJhZ21lbnQoYVdvcmtzcGFjZVVSSSwgZnJhZ21lbnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZUVtcHR5UHJvdG9jb2woVVJJIGFGaWxlVXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKLQkJLy9NYWtlIHRoZSByZWxhdGl2ZSBwYXRoIGFic29sdXRlIGFuZCByZXR1cm4gYSBwbGF0Zm9ybSBVUkkuCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhRmlsZVVyaS50b1N0cmluZygpKTsKLQkJcmV0dXJuIG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKHBhdGgsIGZyYWdtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgbm9ybWFsaXplVG9Xb3Jrc3BhY2VVUkkoSVBhdGggcGF0aCwgU3RyaW5nIGZyYWdtZW50KSB7Ci0JCVVSSSByZXN1bHQgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShwYXRoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCWZpbGUgPSBnZXRPdXRwdXRGaWxlKHBhdGgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXN1bHQgPSBhcHBlbmRGcmFnbWVudChyZXN1bHQsIGZyYWdtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZUZpbGVQcm90b2NvbChVUkkgYUZpbGVVcmksIFN0cmluZyBmcmFnbWVudCkgewotCQlVUkkgcmVzdWx0ID0gbnVsbDsKLQkJLy9NYWtlIHRoZSByZWxhdGl2ZSBwYXRoIGFic29sdXRlIGFuZCByZXR1cm4gYSBwbGF0Zm9ybSBVUkkuCi0JCVN0cmluZyBkZXZpY2VQYXRoID0gYUZpbGVVcmkuZGV2aWNlUGF0aCgpOwotCQkvL1Rlc3QgZm9yIHdvcmtzcGFjZSBsb2NhdGlvbi4KLQkJaWYgKCFkZXZpY2VQYXRoLnN0YXJ0c1dpdGgoTUVUQURBVEFfTE9DQVRJT04pICYmCi0JCQlkZXZpY2VQYXRoLnN0YXJ0c1dpdGgoV09SS1NQQUNFX1JPT1RfTE9DQVRJT04pICYmIGRldmljZVBhdGgubGVuZ3RoKCkgPiBXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTi5sZW5ndGgoKSkgewotCQkJLy90ZXN0IGZvciB3b3Jrc3BhY2UgbG9jYXRpb24KLQkJCXJlc3VsdCA9IG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKG5ldyBQYXRoKGRldmljZVBhdGguc3Vic3RyaW5nKFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OLmxlbmd0aCgpKSksIGZyYWdtZW50KTsKLQkJfSBlbHNlIGlmIChhRmlsZVVyaS5pc1JlbGF0aXZlKCkpIHsKLQkJCXJlc3VsdCA9IG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKG5ldyBQYXRoKGFGaWxlVXJpLnRvU3RyaW5nKCkpLCBmcmFnbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBhRmlsZVVyaTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIGFwcGVuZEZyYWdtZW50KFVSSSByZXN1bHQsIFN0cmluZyBmcmFnbWVudCkgewotCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotCQllbHNlCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0T3V0cHV0RmlsZVdpdGhNYXBwaW5nQXBwbGllZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlV2l0aE1hcHBpbmdBcHBsaWVkKFN0cmluZyB1cmkpIHsKLQkJVVJJIGNvbnZlcnRlZCA9IGdldEludGVybmFsVVJJTWFwKCkuZ2V0VVJJKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JCXJldHVybiBnZXRPdXRwdXRGaWxlKG5ldyBQYXRoKGNvbnZlcnRlZC50b1N0cmluZygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0oU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2VQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShuZXcgUGF0aChwbGF0Zm9ybVJlc291cmNlUGF0aCkpOwotCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZpbGUpOwotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShmaWxlLCByZXNvdXJjZVNldFN5bmNocm9uaXplcik7Ci0JfQotCi0JcHJvdGVjdGVkIFVSSSBnZXRDb250YWluZXJSZWxhdGl2ZVVSSShJRmlsZSBhRmlsZSkgewotCQlJUGF0aCBwYXRoID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFBhdGhGcm9tQ29udGFpbmVycyhpbnB1dENvbnRhaW5lcnMsIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI2NyZWF0ZVBsYXRmb3JtUmVzb3VyY2VJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlSW5wdXRTdHJlYW0oU3RyaW5nIHBsYXRmb3JtUmVzb3VyY2VQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gV09SS1NQQUNFX1JPT1QuZ2V0RmlsZShuZXcgUGF0aChwbGF0Zm9ybVJlc291cmNlUGF0aCkpOwotCQl0cnkgewotCQkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9PTkUpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBpb2ZpbGUgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9GaWxlKCk7Ci0JCQkJCWlmIChpb2ZpbGUuZXhpc3RzKCkgfHwgZmlsZS5leGlzdHMoKSkKLQkJCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJaWYgKGNlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBJUmVzb3VyY2VTdGF0dXMuV09SS1NQQUNFX0xPQ0tFRCkKLQkJCQkJCXRocm93IGNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIENIQU5HRUQgZnJvbSA8bm8tYXJncz4gdG8gPHRydWU+IFs5NDAxNV0KLQkJCXJldHVybiBmaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmMjg4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmUuamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFBhcnNlclBvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFBhcnNlclBvb2xJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGUgYmFzZSBFTUZOYXR1cmUuCi0gKiA8cD4KLSAqIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLCBidXQgdGhlcmUgYXJlIGRlZmF1bHQgc3ViY2xhc3NlcyBhdmFpbGFibGUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFhNTFBhcnNlclBvb2wgU0hBUkVEX1BBUlNFUl9QT09MID0gbmV3IFhNTFBhcnNlclBvb2xJbXBsKCk7CQotCi0JcHVibGljIEVNRk5hdHVyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hdHVyZSBpZCB0byB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvagotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2osIG5hdHVyZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhpcyBuYXR1cmUuIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuIFRoZQotCSAqIG5hdHVyZSBleHRlbnNpb24gaWQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieSA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgYWRkZWQgaGVyZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbGwgc3VidHlwZXMgbXVzdCBjYWxsIHN1cGVyLiBUaGUgYmV0dGVyIHdheSBmb3Igc3VidHlwZXMgaXMgdG8gb3ZlcnJpZGUgcHJpbUNvbmZpZ3VyZSBpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQlpZiAoIWhhc0NvbmZpZ3VyZWQpIHsKLQkJCWhhc0NvbmZpZ3VyZWQgPSB0cnVlOwotCQkJcHJpbUNvbmZpZ3VyZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGZyb20gY29uZmlndXJlIHRoZSBmaXJzdCB0aW1lIGNvbmZpZ3VyZSBpcyBjYWxsZWQgb24gdGhlIG5hdHVyZS4gRGVmYXVsdCBpcyBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIGluIHRoZWlyIG93bgotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1Db25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVNRiBjb250ZXh0IGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbWZDb250ZXh0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlRU1GQ29udGV4dChnZXRQcm9qZWN0KCksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKFN0cmluZyBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcgIT0gbnVsbCAmJiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gY3JlYXRlRm9sZGVyKG5ldyBQYXRoKGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhUHJvamVjdFJlbGF0aXZlUGF0aCAhPSBudWxsICYmICFhUHJvamVjdFJlbGF0aXZlUGF0aC5pc0VtcHR5KCkpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihnZXRQcm9qZWN0UGF0aCgpLmFwcGVuZChhUHJvamVjdFJlbGF0aXZlUGF0aCkpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZvbGRlcik7Ci0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmb2xkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGlzIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0LCBwZXJmb3JtaW5nIGFueSByZXF1aXJlZCBkZWNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4gYW5kCi0JICogc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gVGhlIG5hdHVyZSBpZCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieQotCSAqIDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4sIGFuZCBuZWVkIG5vdCBiZSByZW1vdmVkIGhlcmUuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gewotCQllbWZDb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgSUZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGZpbGVuYW1lIGNhbiBiZSByZWxhdGl2ZSB0byBvbmUgb2YgdGhlIGlucHV0IGZpbGUgcGF0aHMgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgYUZpbGVOYW1lKSB7Ci0JCWlmIChhRmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYUZpbGVOYW1lKTsKLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5leGlzdHMoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpLmNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShhRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2Ugc2V0IGZvciB0aGUgcHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRFbWZDb250ZXh0QmFzZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4gRGVmYXVsdHMgdG8gdGhlIHByb2plY3QuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRFTUZSb290KCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbnM7IGFuc3dlcnMgd2hldGhlciBhIG1vZiBjb250ZXh0IGZvciB0aGlzIG5hdHVyZSBoYXMgZXhpc3RzIHlldAotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBoYXNSZXNvdXJjZVNldCgpOwotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbnRleHQoKSB7Ci0JCXJldHVybiBoYXNSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIElzIHRoZXJlIGEgcmVzb3VyY2Ugc2V0IHlldCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIHJlc291cmNlIHNldCBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBlbWZDb250ZXh0ICE9IG51bGwgJiYgZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIExhenkgaW5pdGlhbGl6ZXI7IGZvciBtaWdyYXRpb24gb2YgZXhpc3Rpbmcgd29ya3NwYWNlcyB3aGVyZSBjb25maWd1cmUgd2lsbCBuZXZlciBnZXQgY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RW1mQ29udGV4dEJhc2UoKSB7Ci0JCWlmIChlbWZDb250ZXh0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlRW1mQ29udGV4dCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVtZkNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBJRmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIGluIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGVOYW1lCi0JICogICAgICAgICAgICBmaWxlbmFtZSBjYW4gYmUgcmVsYXRpdmUgdG8gb25lIG9mIHRoZSBpbnB1dCBmaWxlIHBhdGhzIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyLgotCSAqIEByZXR1cm4gZmlsZSBpdCBpdCBpcyBpbiB0aGlzIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXNuJ3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGFGaWxlTmFtZSkgewotCQlyZXR1cm4gZ2V0V29ya2JlbmNoVVJJQ29udmVydGVyKCkuZ2V0RmlsZShhRmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmF0dXJlJ3MgSUQuCi0JICogCi0JICogQHJldHVybiBuYXR1cmUgaWQKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hdHVyZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgcHJvamVjdCBuYXR1cmUgYXBwbGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgcHJvamVjdCBwYXRoIChyZWxhdGl2ZSB0byB3b3Jrc3BhY2UpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIElQYXRoIGdldFByb2plY3RQYXRoKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBkZXByZWNhdGVkIHdlIGNhbm5vbnQgdXNlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXJ2ZXJWYWx1ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IFdvcmtiZW5jaFVSSUNvbnZlcnRlciBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIFVSSUNvbnZlcnRlciBvbiB0aGUgUmVzb3VyY2VTZXQgaXMgdGhlIG9uZSB0aGF0IHdhcyBjcmVhdGVkIGZvciB0aGUgUmVzb3VyY2VTZXQgb24gYmVoYWxmIG9mIHRoaXMgbmF0dXJlIHJ1bnRpbWUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JfQotCi0JcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFhtaVJlc291cmNlKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhpcyB1cmkuIEl0IHdpbGwgdXNlIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIHByb2plY3QgdG8gZmluZCBpdC4gSXQgd2lsbCBsb2FkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZXNvdXJjZSBpcyBub3QgZm91bmQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUmVzb3VyY2VOb3RGb3VuZChleCkpCi0JCQkJdGhyb3cgZXg7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0WG1pUmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBkZXBlbmRlbnQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBSZXNvdXJjZVNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVwZW5kZW50Q29tcG9uZW50cygpIHsKLQkJLy9jb20uaWJtLmV0b29scy5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBjcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCi0JICovCi0JcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBhbkV4dGVudCkgewotCQlSZXNvdXJjZSByZXMgPSBtYWtlWG1pUmVzb3VyY2UodXJpKTsKLQkJaWYgKHJlcyAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkQWxsKGFuRXh0ZW50KTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIHJlc291cmNlIGZvciB0aGlzIHVyaS4gSXQgd2lsbCB1c2UgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgcHJvamVjdCB0byBjcmVhdGUgaXQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBRdWFsaWZlZFZhbHVlIGZvciBrZXkgZm9yIHN0b3JhZ2UgaW4gdGhlIHJlcG9zaXRvcnkuIFRoZSBrZXkgaXMgcXVhbGlmZWQgd2l0aCB0aGUgcGFja2FnZSBuYW1lIHRvIGF2b2lkIGNvbGxpc2lvbi4gQHJldHVybgotCSAqIFF1YWxpZmVkTmFtZSBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkS2V5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKGdldFBsdWdpbklEKCksIGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgdGhlIGdpdmVuIG5hdHVyZSBpZCBhcyBhbiBFTUZOYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG5hdHVyZUlECi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlEKSB7Ci0JCUVNRk5hdHVyZVJlZ2lzdHJ5LnNpbmdsZXRvbigpLlJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcy4gVXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLiBUaGlzIGlzIGNhbGxlZCBieQotCSAqIDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJcHJvamVjdCA9IG5ld1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAZGVwcmVjYXRlZCB3ZSBjYW5ub250IHVzZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdFNlcnZlclZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKLQkJCQlnZXRQcm9qZWN0KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2h1dGRvd24gdGhlIEVNRiBuYXR1cmUKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkKLQkJCSgoUHJvamVjdFJlc291cmNlU2V0KSBnZXRSZXNvdXJjZVNldCgpKS5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBFTUZOYXR1cmVzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgRU1GTmF0dXJlcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBsaXN0IG9mIG5hdHVyZXMgY29uZmlndXJlZCBmb3IgdGhlIHByb2plY3QuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJRU1GTmF0dXJlIG5hdHVyZSA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJU3RyaW5nIG5hdHVyZUlEOwotCQkJSXRlcmF0b3IgaXQgPSBFTUZOYXR1cmVSZWdpc3RyeS5zaW5nbGV0b24oKS5SRUdJU1RFUkVEX05BVFVSRV9JRFMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQluYXR1cmVJRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQluYXR1cmUgPSAoRU1GTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJRCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgewotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJCQlyZXN1bHQuYWRkKG5hdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBuYXR1cmUgaWRzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgY29uZmlndXJlZCBuYXR1cmUgaWRzLgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lSURzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbmF0dXJlSUQgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gRU1GTmF0dXJlUmVnaXN0cnkuc2luZ2xldG9uKCkuUkVHSVNURVJFRF9OQVRVUkVfSURTLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJbmF0dXJlSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlEKSkgewotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJCQlyZXN1bHQuYWRkKG5hdHVyZUlEKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgdGhlIGdpdmVuIG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBuYXR1cmVJZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvamVjdCBoYXMgZ2l2ZW4gbmF0dXJlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUobmF0dXJlSWQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgYW55IG9uZSBvZiB0aGUgcG9zc2libGUgZ2l2ZW4gbmF0dXJlIGlkcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBwb3NzaWJsZU5hdHVyZUlkcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBwb3NzaWJsZSBuYXR1cmVzIGlkIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlSWRzKSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaGFzUnVudGltZShwcm9qZWN0LCBwb3NzaWJsZU5hdHVyZUlkc1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmMxNDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuKjsKLQotCi0vKioKLSAqIEJhc2UgbG9nIHJlbmRlcmVyIHRoYXQgbG9ncyB0byB0aGUgd29ya2JlbmNoLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgaW1wbGVtZW50cyBJTG9nUmVuZGVyZXIyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEJ1bmRsZSBmTXlCdW5kbGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIExvZ2dlciBmTXlMb2dnZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElMb2cgZldvcmtCZW5jaExvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RlciB0YWtpbmcgYSBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk15TG9nZ2VyID0gbG9nZ2VyOwotCQlmVHJhY2VNb2RlID0gZk15TG9nZ2VyLmdldFRyYWNlTW9kZSgpOwotCi0JCVN0cmluZyBwbHVnaW5JRCA9IGZNeUxvZ2dlci5nZXRQbHVnaW5JRCgpOwotCQlmTXlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQlpZiAoZk15QnVuZGxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBQbHVnaW4gSUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZXb3JrQmVuY2hMb2dnZXIgPSBQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKTsKLQkJc2V0VHJhY2VNb2RlKGZNeUxvZ2dlci5nZXRUcmFjZU1vZGUoKSB8fCBpc0RlYnVnZ2luZyhmTXlCdW5kbGUpKTsKLQkJZk15TG9nZ2VyLnNldFJlbmRlcmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogVGhpcyB1c2VkIHRvIGNvbWUgZnJvbSB0aGUgUGx1Z2luIGluc3RhbmNlLiBCdXQgaW4gbmV3IE9TR2ksIHRoZXJlIGlzIG5vdCBuZWNlc3NhcmlseSBhIFBsdWdpbiBpbnN0YW5jZS4gU28gdXNlIHRoZSBzYW1lIGxvZ2ljIHRoZXkgdXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnZ2luZyhCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IHN5bWJvbGljTmFtZSArICIvZGVidWciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihrZXkpOwotCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGUgY29uc29sZSBsb2cgZm9yIGVjbGlwc2UgdHVybmVkIG9uIHRvIHN5c291dC4gSWYgdHJ1ZSwgdGhlbiB3ZSBzaG91bGRuJ3QgbG9nIHRvIGNvbnNvbGUgYW55dGhpbmcgYWxyZWFkeSBsb2dnZWQgYmVjYXVzZSBFY2xpcHNlIHdvdWxkIG9mCi0JICogbG9nZ2VkIGl0IGZvciB1cy4gVGhpcyBjb21lcyBmcm9tIHRoZSAtRGVjbGlwc2UuY29uc29sZUxvZz0idHJ1ZSIgd2hpY2ggaXMgdGhlIGRlZmF1bHQgd2hlbiBzdGFydGluZyBlY2xpcHNlIGZyb20gUERFLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb25zb2xlTG9nT247Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIGNvbnNvbG9nUHJvcGVydHlOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEFjY2Vzc2luZyBhbiBpbnRlcm5hbCBmaWVsZCwgc28gdXNpbmcgcmVmbGVjdGlvbi4gVGhpcyB3YXkgaWYgY2hhbmdlcyBpbiBmdXR1cmUgd2Ugd29uJ3QgY3Jhc2guCi0JCQlDbGFzcyBlY2xpcHNlU3RhcnRlciA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLkVjbGlwc2VTdGFydGVyIik7CS8vJE5PTi1OTFMtMSQKLQkJCUZpZWxkIGNvbnNvbGVsb2cgPSBlY2xpcHNlU3RhcnRlci5nZXREZWNsYXJlZEZpZWxkKCJQUk9QX0NPTlNPTEVfTE9HIik7CS8vJE5PTi1OTFMtMSQKLQkJCWNvbnNvbG9nUHJvcGVydHlOYW1lID0gKFN0cmluZykgY29uc29sZWxvZy5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY29uc29sZUxvZ09uID0gY29uc29sb2dQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eShjb25zb2xvZ1Byb3BlcnR5TmFtZSkpIDsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIjc2V0VHJhY2VNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhY2VNb2RlKGJvb2xlYW4gZmxhZykgewotCQlpZiAoZlNldHRpbmdUcmFjZSkKLQkJCXJldHVybjsgLy8gRG8gbm90IGFsbG93IGN5Y2xlcwotCi0JCWZTZXR0aW5nVHJhY2UgPSB0cnVlOwotCQlmVHJhY2VNb2RlID0gZmxhZzsKLQkJZk15TG9nZ2VyLnNldFRyYWNlTW9kZShmbGFnKTsKLQkJZlNldHRpbmdUcmFjZSA9IGZhbHNlOwotCX0KLQotCS8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgZm9yIGhpc3RvcmljYWwgcmVuZGVyZXJzIGluIGNhc2UgdGhpcyBoYXMgYmVlbiBzdWJjbGFzc2VkIG91dHNpZGUKLQkvLyBvZiB1dGlsLgotCi0JLyoqCi0JICogTG9nIGEgc3RyaW5nIHRvIHRoZSB0cmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyYW0KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBsb2coU3RyaW5nIHBhcmFtKTsKLQotCS8qKgotCSAqIERlZmF1bHQgb25lIHRoYXQgbG9nIGEgc3RyaW5nIHRvIHRoZSB0cmFjZSBnaXZlbiBhIGxldmVsLiBEZWZhdWx0IHNpbXBseSBwYXNzZXMgaXQgdG8gbG9nKFN0cmluZykgc28gdGhhdCB3ZSBkb24ndCBicmVhayBvbGQgc3ViY2xhc3Nlcy4KLQkgKiA8cD4KLQkgKiBJZiBsb2dnZWRUb1dvcmtiZW5jaCBpcyB0cnVlLCB0aGVuIGl0IHNob3VsZG4ndCBiZSBsb2dnZWQgdG8gY29uc29sZSBpZiBjb25zb2xlTG9nT24gaXMgdHJ1ZSBiZWNhdXNlIHdvcmtiZW5jaCBhbHJlYWR5IGxvZ2dlZCB0byBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsLCBib29sZWFuIGxvZ2dlZFRvV29ya2JlbmNoKSB7Ci0JCWxvZyhtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2csIGludCB0eXBlKSB7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IGxvZ1dvcmtCZW5jaChtc2csIHR5cGUpOwotCQlpZiAoZlRyYWNlTW9kZSB8fCB0YXJnZXQuZXF1YWxzKE5PTE9HX0RFU0NSSVBUSU9OKSkKLQkJCXJldHVybiBsb2cobXNnKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdG8gd29ya2JlbmNoLCBhIHN0cmluZyBvZiB0aGUgZ2l2ZW4gbGV2ZWwgPGNvZGU+SUxvZ1JlbmRlcmVyLkxPR188L2NvZGU+LiBsZXZlbHMuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElMb2dSZW5kZXJlciNMT0dfRVJST1IgYW5kIGFsbCBvZiB0aGUgb3RoZXIgbG9nIHR5cGVzLgotCSAqIEBzZWUgSUxvZ1JlbmRlcmVyI0NPTlNPTEVfREVTQ1JJUFRJT04KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZ1dvcmtCZW5jaChTdHJpbmcgbXNnLCBpbnQgdHlwZSkgewotCi0JCXRyeSB7Ci0JCQlpbnQgRXJyQ29kZTsKLQkJCWlmIChmV29ya0JlbmNoTG9nZ2VyICE9IG51bGwpIHsKLQkJCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQkJY2FzZSAoSUxvZ1JlbmRlcmVyLkxPR19FUlJPUik6Ci0JCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX1dBUk5JTkcpOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX0lORk8pOgotCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuSU5GTzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX1RSQUNFKToKLQkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLk9LOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBMb2cgVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKEVyckNvZGUsIGZNeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgbXNnLCBudWxsKTsKLQkJCQlmV29ya0JlbmNoTG9nZ2VyLmxvZyhzdGF0dXMpOwotCQkJCXJldHVybiBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JCX0KLQl9Ci0KLQkvLyBEZWZhdWx0IGltcGxlbnRhdGlvbiBvZiB0aGUgSUxvZ1JlbmRlcmVyMiBpbnRlcmZhY2UuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2dnaW5nKExldmVsIGxldmVsKSB7Ci0JCXJldHVybiBmVHJhY2VNb2RlIHx8IGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1RBVFVTX0xFVkVMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBTVEFUVVNfTEVWRUxfTE9PS1VQOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWxbXSBMRVZFTF9TVEFUVVM7Ci0KLQlzdGF0aWMgewotCQkvLyBTdGF0dXMgbGV2ZWxzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgbG9nIGxldmVscywgZnJvbSBmaW5lc3QgdG8gbm9uZSwgc2FtZSBpbmRleGVzIGFzIGZyb20gU1RBVFVTX0xFVkVMX0xPT0tVUC4KLQkJU1RBVFVTX0xFVkVMX0xPT0tVUCA9IG5ldyBMZXZlbFtdIHsgTGV2ZWwuSU5GTywgTGV2ZWwuV0FSTklORywgTGV2ZWwuU0VWRVJFfTsKLQkJU1RBVFVTX0xFVkVMID0gbmV3IGludFtdIHsgSVN0YXR1cy5JTkZPLCBJU3RhdHVzLldBUk5JTkcsIElTdGF0dXMuRVJST1J9OwotCi0JCS8vIExldmVscyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIElTdGF0dXMgbGV2ZWxzLgotCQlpbnQgbWF4SUQgPSBNYXRoLm1heChJU3RhdHVzLk9LLCBNYXRoLm1heChJU3RhdHVzLklORk8sIE1hdGgubWF4KElTdGF0dXMuV0FSTklORywgSVN0YXR1cy5FUlJPUikpKTsKLQkJTEVWRUxfU1RBVFVTID0gbmV3IExldmVsW21heElEICsgMV07Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLk9LXSA9IExldmVsLkZJTkU7Ci0JCUxFVkVMX1NUQVRVU1tJU3RhdHVzLklORk9dID0gTGV2ZWwuSU5GTzsKLQkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuV0FSTklOR10gPSBMZXZlbC5XQVJOSU5HOwotCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5FUlJPUl0gPSBMZXZlbC5TRVZFUkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIExldmVsIGZvciB0aGUgc3RhdHVzIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gSVN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybiB0aGUgSmF2YSBMZXZlbAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBMZXZlbCBnZXRMb2dMZXZlbChJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gTEVWRUxfU1RBVFVTW3N0YXR1cy5nZXRTZXZlcml0eSgpXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElTdGF0dXMgc3RhdHVzIGNvZGUgZm9yIHRoZSBnaXZlbiBKYXZhIExldmVsLgotCSAqIAotCSAqIEBwYXJhbSBsb2dMZXZlbAotCSAqIEByZXR1cm4gdGhlIElTdGF0dXMgc3RhdHVzIGNvZGUuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTdGF0dXNTZXZlcml0eShMZXZlbCBsb2dMZXZlbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNUQVRVU19MRVZFTF9MT09LVVAubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTVEFUVVNfTEVWRUxfTE9PS1VQW2ldID09IGxvZ0xldmVsKQotCQkJCXJldHVybiBTVEFUVVNfTEVWRUxbaV07Ci0JCX0KLQkJcmV0dXJuIElTdGF0dXMuT0s7IC8vIERlZmF1bHQgdG8gb2suCi0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzdHJpbmcgdG8gdGhlIHdvcmtiZW5jaCBmb3IgdGhlIGdpdmVuIGxldmVsCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goU3RyaW5nIG1zZywgTGV2ZWwgbGV2ZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IE5PTE9HX0RFU0NSSVBUSU9OOwotCQkvLyBUZXN0IGFnYWluIGJlY2F1c2Ugd2UgY291bGQgYmUgaGVyZSBzaW1wbHkgZHVlIHRvIHRyYWNlIG1vZGUsIGluIHdoaWNoIGNhc2Ugd2UKLQkJLy8gZG9uJ3Qgd2FudCB0byB3b3JrYmVuY2ggbG9nIGl0LgotCQlpZiAoZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKSkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSkubG9nKG5ldyBTdGF0dXMoZ2V0U3RhdHVzU2V2ZXJpdHkobGV2ZWwpLCBmTXlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIDAsIG1zZywgbnVsbCkpOwotCQkJcmVzdWx0ID0gV09SS0JFTkNIX0RFU0NSSVBUSU9OOwotCQkJaWYgKGZUcmFjZU1vZGUpCi0JCQkJbG9nKG1zZywgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2cobXNnLCBsZXZlbCwgZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXR1c01zZyhJU3RhdHVzIHMsIExldmVsIGwpIHsKLQkJaWYgKHMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhzLnRvU3RyaW5nKCkgKyBmTXlMb2dnZXIuZkxpbmVTZXBlcmF0b3IgKyBmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcocy5nZXRFeGNlcHRpb24oKSksIGwpOwotCQllbHNlCi0JCQlyZXR1cm4gZk15TG9nZ2VyLmdldEdlbmVyaWNNc2cocy50b1N0cmluZygpLCBsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIElTdGF0dXMgdG8gdGhlIHdvcmtiZW5jaCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9nV29ya2JlbmNoKElTdGF0dXMgcywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IGdldExvZ0xldmVsKHMpOwotCQlTdHJpbmcgcmVzdWx0ID0gTk9MT0dfREVTQ1JJUFRJT047Ci0JCS8vIFRlc3QgYWdhaW4gYmVjYXVzZSB3ZSBjb3VsZCBiZSBoZXJlIHNpbXBseSBkdWUgdG8gdHJhY2UgbW9kZSwgaW4gd2hpY2ggY2FzZSB3ZQotCQkvLyBkb24ndCB3YW50IHRvIHdvcmtiZW5jaCBsb2cgaXQuCi0JCWlmIChmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKS5sb2cocyk7Ci0JCQlyZXN1bHQgPSBXT1JLQkVOQ0hfREVTQ1JJUFRJT047Ci0JCQlpZiAoZlRyYWNlTW9kZSkKLQkJCQlsb2coZ2V0U3RhdHVzTXNnKHMsIGxldmVsKSwgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2coZ2V0U3RhdHVzTXNnKHMsIGxldmVsKSwgbGV2ZWwsIGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdG8gdGhlIHdvcmtiZW5jaCB0aGUgVGhyb3dhYmxlIGF0IHRoZSBnaXZlbiBsZXZlbC4KLQkgKiAKLQkgKiBAcGFyYW0gdAotCSAqIEBwYXJhbSBsZXZlbAotCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBOT0xPR19ERVNDUklQVElPTjsKLQkJLy8gVGVzdCBhZ2FpbiBiZWNhdXNlIHdlIGNvdWxkIGJlIGhlcmUgc2ltcGx5IGR1ZSB0byB0cmFjZSBtb2RlLCBpbiB3aGljaCBjYXNlIHdlCi0JCS8vIGRvbid0IHdhbnQgdG8gd29ya2JlbmNoIGxvZyBpdC4KLQkJaWYgKGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCkpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpLmxvZyhuZXcgU3RhdHVzKGdldFN0YXR1c1NldmVyaXR5KGxldmVsKSwgZk15QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiRXhjZXB0aW9uIHRocm93bi4iLCB0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IFdPUktCRU5DSF9ERVNDUklQVElPTjsKLQkJCWlmIChmVHJhY2VNb2RlKQotCQkJCWxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwsIHRydWUpOwotCQl9IGVsc2UgaWYgKGZUcmFjZU1vZGUpCi0JCQlsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coZk15TG9nZ2VyLmV4Y2VwdGlvblRvU3RyaW5nKHQpLCBsZXZlbCksIGxldmVsLCBmYWxzZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coYnl0ZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coY2hhciwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoYyksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZG91YmxlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhkb3VibGUgZCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGQpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGZsb2F0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKLQkJCWxldmVsID0gTGV2ZWwuRklORVNUOwotCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKLQkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZiksIGxldmVsKSwgbGV2ZWwpOwotCQllbHNlCi0JCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coaW50LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGkpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGxvbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGwpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsZXZlbCkgewotCQlpZiAobyBpbnN0YW5jZW9mIElTdGF0dXMpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKChJU3RhdHVzKSBvLCBsZXZlbCk7Ci0JCWlmIChsZXZlbCA9PSBERUZBVUxUKQotCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7Ci0JCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQotCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihvKSwgbGV2ZWwpLCBsZXZlbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhzaG9ydCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCi0JICovCi0JcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbGV2ZWwpIHsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKHMpLCBsZXZlbCksIGxldmVsKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGphdmEubGFuZy5UaHJvd2FibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSB0LCBMZXZlbCBsZXZlbCkgewotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQlyZXR1cm4gbG9nV29ya2JlbmNoKCgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCksIGxldmVsKTsKLQkJaWYgKGxldmVsID09IERFRkFVTFQpCi0JCQlsZXZlbCA9IExldmVsLlNFVkVSRTsKLQkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpIHsKLQkJCXJldHVybiBsb2dXb3JrYmVuY2godCwgbGV2ZWwpOwotCQl9IGVsc2UKLQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9Db25zb2xlTG9nUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxMGUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogTG9nIHJlbmRlcmVyIHRvIHRoZSBjb25zb2xlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVMb2dSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgdGFraW5nIGEgbG9nZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQ29uc29sZUxvZ1JlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIobG9nZ2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2cpIHsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2csIExldmVsIGwsIGJvb2xlYW4gbG9nZ2VkVG9Xb3JrYmVuY2gpIHsKLQkJaWYgKCFsb2dnZWRUb1dvcmtiZW5jaCB8fCAhY29uc29sZUxvZ09uKSB7Ci0JCQlpZiAobCA9PSBMZXZlbC5TRVZFUkUpCi0JCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzMzMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0KLS8qKgotICogTG9nZ2VyIHRoYXQgYWxzbyBsb2dzIHRvIGEgdHJhY2UgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgbWV0YWRhdGEgYXJlYS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgewotCi0JLyoqCi0JICogTmFtZSBvZiB0aGUgdHJhY2UgZmlsZSBpbiB0aGUgbWV0YWRhdGEgYXJlYS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQbHVnaW5UcmFjZUZpbGVOYW1lID0gIi8ubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZlRyYWNlRmlsZSA9IG51bGw7Ci0KLQlwcml2YXRlIFByaW50V3JpdGVyIHRyYWNlRmlsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0VUlMb2dSZW5kZXJlciBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICovCi0JcHVibGljIERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKLQkJc3VwZXIobG9nZ2VyKTsKLQotCQlmVHJhY2VGaWxlID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihmTXlCdW5kbGUpLnRvU3RyaW5nKCkgKyBQbHVnaW5UcmFjZUZpbGVOYW1lOwotCQkobmV3IEZpbGUoZlRyYWNlRmlsZSkpLmRlbGV0ZSgpOyAvLyBTdGFydCBmcm9tIGZyZXNoIC4uLiBkbyBub3Qgd2FudCB0byBsZWFrIG9uIGRpc2sgc3BhY2UKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZVRyYWNlRmlsZSgpIHsKLQkJaWYgKHRyYWNlRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJdHJhY2VGaWxlLmZsdXNoKCk7Ci0JCQl0cmFjZUZpbGUuY2xvc2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyYWNlRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2cpIHsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQotCQlvcGVuVHJhY2VGaWxlKCk7Ci0JCWlmICh0cmFjZUZpbGUgIT0gbnVsbCkgewotCQkJdHJhY2VGaWxlLnByaW50bG4obXNnKTsKLQkJCWNsb3NlVHJhY2VGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZUcmFjZUZpbGU7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbCwgYm9vbGVhbiBsb2dnZWRUb1dvcmtiZW5jaCkgewotCQlpZiAoIWxvZ2dlZFRvV29ya2JlbmNoIHx8ICFjb25zb2xlTG9nT24pIHsKLQkJCWlmIChsID09IExldmVsLlNFVkVSRSkKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCi0JCW9wZW5UcmFjZUZpbGUoKTsKLQkJaWYgKHRyYWNlRmlsZSAhPSBudWxsKSB7Ci0JCQl0cmFjZUZpbGUucHJpbnRsbihtc2cpOwotCQkJY2xvc2VUcmFjZUZpbGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuVHJhY2VGaWxlKCkgewotCQl0cnkgewotCQkJdHJhY2VGaWxlID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZUcmFjZUZpbGUsIHRydWUpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBvcGVuaW5nIHRoZSBsb2cgZmlsZSBzbyBsb2cgdG8gdGhlIGNvbnNvbGUKLQkJCXRyYWNlRmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MTI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotCi0gCi0vKioKLSAqIEdldCBhbiBFY2xpcHNlIGxvZ2dlci4gVGhpcyBnZXRzIGEgbG9nZ2VyIHRoYXQga25vd3MgaXQgaXMgZm9yIGEgcGx1Z2luLiAKLSAqIAotICogRm9yIGVhY2ggcGx1Z2luLCB0aGUgZm9sbG93aW5nIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIC5vcHRpb24gZmlsZToKLSAqIAkJe3BsdWdpbi1pZH0vZGVidWcvbG9nVHJhY2UKLSAqIAkJCVRoZSB2YWx1ZXMgdmFsaWQgZm9yIHRoaXMgYXJlICJ0cnVlIiwgImZhbHNlIiwgb3IgImRlZmF1bHQiLiBJZiB0cnVlIHRoZW4gbG9nZ2VycyB3aWxsIGJlIHNldCBpbnRvCi0gKiAJCQl0cmFjZSBtb2RlLiBUaGlzIG1lYW5zIGV2ZXJ5dGhpbmcgbG9nZ2VkIChldmVuIHRob3NlIHRoYXQgYXJlIGZpbHRlcmVkIG91dCBkdWUgdG8gbm90IG1lZXRpbmcgbG9nIGxldmVsKQotICogCQkJd2lsbCBiZSB0cmFjZWQgb3V0LiBJZiB0aGUgdmFsdWUgaXMgInRydWUiIHRoZXkgd2lsbCBiZSB0cmFjZWQgdG8gdGhlIHN5c3RlbSBjb25zb2xlLiAgCi0gKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dUcmFjZSIgLm9wdGlvbnMgc2V0dGluZy4KLSAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgotICogCi0gKiAJCXtwbHVnaW4taWR9L2RlYnVnL2xvZ1RyYWNlRmlsZQotICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgInRydWUiLCAiZmFsc2UiLCBvciAiZGVmYXVsdCIuIElmIHRydWUgdGhlbiBsb2dnZXJzIHdpbGwgdHJhY2UgdG8gCi0gKiAJCQl0aGUgc3lzdGVtIGNvbnNvbGUgQU5EIHRvIHRoZSAiLmxvZyIgZmlsZSBpbiB0aGUgcGx1Z2lucyB3b3JrIGFyZWEgaW4gdGhlIG1ldGFkYXRhIHNlY3Rpb24gb2YgdGhlIHdvcmtzcGFjZS4KLSAqIAkJCUlmICJmYWxzZSIgdGhlbiBub3QgdHJhY2VkIHRvIGEgdHJhY2UgZmlsZS4gCi0gKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dUcmFjZUZpbGUiIC5vcHRpb25zIHNldHRpbmcuCi0gKiAJCQlJZiBub3Qgc2V0IHRoZXJlLCB0aGVuIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLSAqIAotICogCQl7cGx1Z2luLWlkfS5kZWJ1Zy9sb2dMZXZlbAotICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgdGhlIG5hbWVzIGZyb20gPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+LCBhbmQgImRlZmF1bHQiLiBUaGVzZQotICogCQkJYXJlIHRoZSB0cmFjZSBjdXRvZmYgbGV2ZWxzIHRvIHVzZS4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbGV2ZWwgd2FzIFNFVkVSRSwgdGhlbiBvbmx5IGxldmVsIFNFVkVSRSBtc2dzCi0gKiAJCQlhcmUgbG9nZ2VkLiBUaGUgcmVzdCBhcmUgc2tpcHBlZC4gT3IgaWYgdGhlIGxldmVsIHdhcyBXQVJOSU5HLCB0aGVuIG9ubHkgbGV2ZWwgU0VWRVJFIGFuZCBXQVJOSU5HIGFyZQotICogCQkJbG9nZ2VkLgotICogCQkJSWYgaXQgaXMgImRlZmF1bHQiIG9yIG5vdCBzZXQgYXQgYWxsLCB0aGVuIGl0IHdpbGwgYmUgdGhlIHZhbHVlIGluIHRoZSAib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nTGV2ZWwiIC5vcHRpb25zIHNldHRpbmcuCi0gKiAJCQlJZiBub3Qgc2V0IHRoZXJlLCB0aGVuIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBXQVJOSU5HLgotICogCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBleHRlbmRzIExvZ2dlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19UUkFDRV9PUFRJT04gPSAiL2RlYnVnL2xvZ3RyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OID0gIi9kZWJ1Zy9sb2d0cmFjZWZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfTE9HX0xFVkVMX09QVElPTiA9ICIvZGVidWcvbG9nbGV2ZWwiOyAvLyBUaGUgbG9nZ2luZyBsZXZlbCB0byB1c2Ugd2hlbiBubyBIeWFlZGVzLiAod2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCBhdCB0aGlzIHRpbWUpLiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PUFRJT04gPSAiZGVmYXVsdCI7CS8vIElmIG9wdGlvbiB2YWx1ZSBpcyB0aGlzLCB0aGVuIHRoZSB2YWx1ZSBmcm9tIFdUUCBDb21tb24gcGx1Z2luIG9wdGlvbnMgd2lsbCBiZSB1c2VkIGZvciBib3RoIGxvZ1RyYWNlIGFuZCBsb2dMZXZlbC4JIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsb2dnZXIgYmFzZWQgdXBvbiB0aGUgUGx1Z2luLiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldEVjbGlwc2VMb2dnZXIoUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gZ2V0RWNsaXBzZUxvZ2dlcihwbHVnaW4uZ2V0QnVuZGxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsb2dnZXIgYmFzZWQgdXBvbiB0aGUgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0RWNsaXBzZUxvZ2dlcihCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJTG9nZ2VyIGxvZ2dlciA9IGdldExvZ2dlcklmRXhpc3RzKGlkKTsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKQotCQkJcmV0dXJuIGxvZ2dlcjsKLQkJCi0JCWxvZ2dlciA9IGdldExvZ2dlcihpZCk7CS8vIENyZWF0ZSBvbmUsIHdlIHdpbGwgbm93IGN1c3RvbWl6ZSBpdC4KLQkJCi0JCVN0cmluZyBwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX1RSQUNFX09QVElPTik7Ci0JCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX1RSQUNFX09QVElPTik7Ci0JCWJvb2xlYW4gbG9nVHJhY2UgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oaWQgKyBERUJVR19UUkFDRV9GSUxFX09QVElPTik7Ci0JCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OKTsKLQkJYm9vbGVhbiBsb2dUcmFjZUZpbGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQotCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX0xPR19MRVZFTF9PUFRJT04pOwotCQlpZiAocGx1Z2luT3B0aW9uID09IG51bGwgfHwgImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UocGx1Z2luT3B0aW9uKSkgLy8kTk9OLU5MUy0xJAotCQkJcGx1Z2luT3B0aW9uID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyBERUJVR19MT0dfTEVWRUxfT1BUSU9OKTsKLQkJCi0JCUxldmVsIGxvZ0xldmVsID0gTGV2ZWwuV0FSTklORzsKLQkJaWYgKHBsdWdpbk9wdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvZ0xldmVsID0gTGV2ZWwucGFyc2UocGx1Z2luT3B0aW9uKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsb2dUcmFjZSkKLQkJCWxvZ2dlci5zZXRUcmFjZU1vZGUodHJ1ZSk7Ci0JCWxvZ2dlci5zZXRMZXZlbChsb2dMZXZlbCk7Ci0JCWlmICghbG9nVHJhY2VGaWxlKQotCQkJbG9nZ2VyLnNldFJlbmRlcmVyKG5ldyBDb25zb2xlTG9nUmVuZGVyZXIobG9nZ2VyKSk7Ci0JCWVsc2UKLQkJCWxvZ2dlci5zZXRSZW5kZXJlcihuZXcgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIobG9nZ2VyKSk7Ci0JCQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvSU1zZ0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjQ1ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgbWVzc2FnZSBsb2dnZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNc2dMb2dnZXIgewotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvcGx1Z2luL0pFTVV0aWxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9wbHVnaW4vSkVNVXRpbFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I5YjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9wbHVnaW4vSkVNVXRpbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkJFJDU2ZpbGU6IEpFTVV0aWxQbHVnaW4uamF2YSx2ICQkCi0gKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0vKioKLSAqIFBsdWdpbiBmb3IgRU1GV29ya2JlbmNoIHV0aWxzLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEpFTVV0aWxQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUGx1Z2luIGlkIG9mIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IElEOwkKLQotCS8qKgotCSAqIFVJIENvbnRleHQgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UID0gInVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVUlUZXN0ZXIgZWxlbWVudCBuYW1lLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1RFU1RFUl9FWFRFTlNJT05fUE9JTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUHJvdG9jb2wgZm9yIHdvcmtzcGFjZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUk9UT0NPTCA9ICJ3b3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcm90b2NvbCBmb3IgcGxhdGZvcm0gdXJpJ3MuIGkuZS4gInBsYXRmb3JtOi8uLi4iCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVzb3VyY2UgaW5kaWNhdGlvbiBpbiBwbGF0Zm9ybSBwcm90b2NvbC4gSW5kaWNhdGVzIHVybCBpcyBmb3IgYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLiBpLmUuICJwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdG5hbWUvLi4uIgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUGx1Z2luIGluZGljYXRpb24gaW4gcGxhdGZvcm0gcHJvdG9jb2wuIEluZGljYXRlcyB1cmwgaXMgZm9yIGEgZmlsZS9kaXJlY3RvcnkgaW4gdGhlIHBsdWdpbnMgYXJlYS4gaS5lLiAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5pZC8uLi4iCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgc2hhcmVkQ2FjaGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVNldCBwbHVnaW5SZXNvdXJjZVNldDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUzsKLQotCXByaXZhdGUgc3RhdGljIEpFTVV0aWxQbHVnaW4gREVGQVVMVDsKLQotCXB1YmxpYyBKRU1VdGlsUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlERUZBVUxUID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtzcGFjZS4gSnVzdCB1c2UgUmVzb3VyY2VQbHVnaW4uZ2V0V29ya3NwYWNlKCkgaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHBsdWdpbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpFTVV0aWxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkQ2FjaGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGdldFNoYXJlZENhY2hlKCkgewotCQlpZiAoc2hhcmVkQ2FjaGUgPT0gbnVsbCkKLQkJCXNoYXJlZENhY2hlID0gbmV3IFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIoKTsKLQkJcmV0dXJuIHNoYXJlZENhY2hlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNoYXJlZENhY2hlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2hhcmVkQ2FjaGUKLQkgKiAgICAgICAgICAgIFRoZSBzaGFyZWRDYWNoZSB0byBzZXQKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBhU2hhcmVkQ2FjaGUpIHsKLQkJc2hhcmVkQ2FjaGUgPSBhU2hhcmVkQ2FjaGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUlzb2xhdGVkUmVzb3VyY2VTZXQoSVByb2plY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW4gQWRhcHRlci4gWW91IGNhbiB1c2UgdGhpcyBhcGkgdG8gbGlzdGVuIGZvciBhbnkgc2hhcmVkIHJlc291cmNlIGJlaW5nIGxvYWRlZCBvciByZW1vdmVkIGZyb20gYW55IFByb2plY3RSZXNvdXJjZVNldCBpbiB0aGUgV29ya2JlbmNoCi0JICogaW5zdGVhZCBvZiB0cnlpbmcgdG8gbGlzdGVuIHRvIGVhY2ggaW5kaXZpZHVhbCBQcm9qZWN0UmVzb3VyY2VTZXQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkV29ya3NwYWNlRU1GUmVzb3VyY2VMaXN0ZW5lcihBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhZ2V0U2hhcmVkQ2FjaGUoKS5lQWRhcHRlcnMoKS5jb250YWlucyhhZGFwdGVyKSkKLQkJCWdldFNoYXJlZENhY2hlKCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAKLQkgKiBAc2VlICNhZGRXb3Jrc3BhY2VFTUZSZXNvdXJjZUxpc3RlbmVyKEFkYXB0ZXIpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVdvcmtzcGFjZUVNRlJlc291cmNlTGlzdGVuZXIoQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlnZXRTaGFyZWRDYWNoZSgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHBsdWdpbiBhY3RpdmUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhY3RpdmUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBXb3JrYmVuY2hDb250ZXh0IGlzIGluc3RhbnRpYXRlZCBvbiBhbiBFTUZOYXR1cmUuCi0JICogPHA+Ci0JICogVGhpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiAKLQkgKiBAc2VlIHBsdWdpbi54bWwjUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlZFJlc291cmNlSGFuZGxlcnMoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChnZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb24gPSBwY3QuZ2V0RXh0ZW5zaW9ucygpOwotCQlJRXh0ZW5zaW9uIGNvbmZpZzsKLQkJZm9yIChpbnQgbCA9IDA7IGwgPCBleHRlbnNpb24ubGVuZ3RoOyArK2wpIHsKLQkJCWNvbmZpZyA9IGV4dGVuc2lvbltsXTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNFbGVtcyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY0VsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlciA9IChSZXNvdXJjZUhhbmRsZXIpIGNFbGVtc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJydW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWhhbmRsZXIgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCQlhUmVzb3VyY2VTZXQuYWRkKGhhbmRsZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IChhbmQgdGhlIGRpcmVjdG9yeSBpZiBkZWxldGVSb290IGlzIHRydWUpLgotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIGRlbGV0ZVJvb3QgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSB0b28uCi0JICogQHBhcmFtIG1vbml0b3IgCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZGVsZXRpbmcgYW55dGhpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoRmlsZSByb290LCBib29sZWFuIGRlbGV0ZVJvb3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCWlmIChyb290LmNhblJlYWQoKSkgewotCQkJaWYgKHJvb3QuaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdFV0aWxfRGVsZXRlXzEiKSwgbmV3IE9iamVjdFtdIHtyb290LmdldE5hbWUoKX0pLCBmaWxlcy5sZW5ndGgrKGRlbGV0ZVJvb3QgPyAxIDogMCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJCWVycm9yIHw9IGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoZmlsZXNbaV0sIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQllbHNlIHsKLQkJCQkJCWVycm9yIHw9ICFmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RVdGlsX0RlbGV0ZV8xIiksIG5ldyBPYmplY3RbXSB7cm9vdC5nZXROYW1lKCl9KSwgMSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoZGVsZXRlUm9vdCkgewotCQkJCWVycm9yIHw9ICFyb290LmRlbGV0ZSgpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBjbGVhbiByZXNvdXJjZSBjaGFuZ2VsaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAcGFyYW0gZXZlbnRNYXNrIG1hc2sgb2YgZXZlbnQgdHlwZXMgdG8gbGlzdGVuIGZvciBpbiBhZGRpdGlvbiB0byBvbmVzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgY2xlYW4uIFVzZSAwIGlmIG5vIGFkZGl0aW9uYWwgb25lcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2xlYW5SZXNvdXJjZUNoYW5nZUxpc3RlbmVyKENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQkvLyBQUkVfQlVJTEQ6IEhhbmRsZSBDbGVhbi4KLQkJLy8gVE9ETyBVbnRpbCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxOTQyIGlzIGZpeGVkLCB3ZSBtdXN0IGRvIFBPU1RfQlVJTEQsIHRoYXQgd2lsbCBwcm9iYWJseSBiZSBzZW50IGJlY2F1c2UgYSBjbGVhbiB3aWxsIGNhdXNlIGEgYnVpbGQgdG8gb2NjdXIgd2hpY2ggc2hvdWxkIGNhdXNlIGEgZGVsdGEuCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2sgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsJCQotCX0KLQkKLQkvKioKLQkgKiBBIHJlc291cmNlIGxpc3RlbmVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbGlzdGVuIGZvciBDbGVhbiByZXF1ZXN0cyBhbmQgcHJvY2VzcyB0aGVtLgotCSAqIDxwPgotCSAqIFVzZSA8Y29kZT57QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUFJFX0JVSUxEfTwvY29kZT4gd2hlbiBhZGRpbmcgYXMgbGlzdGVuZXIgdG8gZ2V0IHRoZQotCSAqIGNsZWFuIGV2ZW50cy4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlPC9iPiA6IFRPRE8gVW50aWwgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTk0MiBpcyBmaXhlZCwgeW91IG11c3QgZG8gUE9TVF9CVUlMRCwgdGhhdCB3aWxsIHByb2JhYmx5IGJlIHNlbnQgYmVjYXVzZSBhIGNsZWFuIHdpbGwgY2F1c2UgYSBidWlsZCB0byBvY2N1ciB3aGljaCBzaG91bGQgY2F1c2UgYSBkZWx0YS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBoYW5kbGUgbW9yZSBldmVudHMgdGhhbiBqdXN0IGNsZWFuLgotCQkJaWYgKGV2ZW50LmdldEJ1aWxkS2luZCgpID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQkJY2xlYW5Qcm9qZWN0KChJUHJvamVjdCkgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJCWVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkKLQkJCQkJY2xlYW5BbGwoKTsJCQkJCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgb3V0IHRoZSBwcm9qZWN0LgotCQkgKiBAcGFyYW0gcHJvamVjdAotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbGVhblByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkJLyoqCi0JCSAqIENsZWFuIGFsbC4KLQkJICogPHA+Ci0JCSAqIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIHNpbXBseSBjYWxsIGEgY2xlYW4gcHJvamVjdCBvbiBlYWNoIG9wZW4gcHJvamVjdC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGVpdGhlcgotCQkgKiBhZGQgbW9yZSBmdW5jdGlvbiB0byBjbGVhciBvdXQgbm9uLXByb2plY3QgZGF0YSBhbmQgdGhlbiBjYWxsIHN1cGVyLiBPciBpZiB0aGV5IGNhbiBoYW5kbGUgYWxsIG9mIHRoZSBwcm9qZWN0cwotCQkgKiBpbiBhIGZhc3RlciB3YXksIHRoZW4gY2FuIGNvbXBsZXRlbHkgaGFuZGxlIHRoaXMuCi0JCSAqIAotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGNsZWFuQWxsKCkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJY2xlYW5Qcm9qZWN0KHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCByZXNvdXJjZSBzZXQgZm9yIHRoZSBwbHVnaW4gKHRoZXJlIGlzIG9uZSBmb3IgdGhlIHdob2xlIHN5c3RlbSkuCi0JICogCi0JICogQHJldHVybiBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRQbHVnaW5SZXNvdXJjZVNldCgpIHsKLQkJaWYgKHBsdWdpblJlc291cmNlU2V0ID09IG51bGwpCi0JCQlwbHVnaW5SZXNvdXJjZVNldCA9IG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKG51bGwpOwotCQlyZXR1cm4gcGx1Z2luUmVzb3VyY2VTZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHNldAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbHVnaW5SZXNvdXJjZVNldChSZXNvdXJjZVNldCBzZXQpIHsKLQkJcGx1Z2luUmVzb3VyY2VTZXQgPSBzZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBnbG9iYWwgbG9hZGluZyBwbHVnaW4gbmFtZXMuCi0JICogPHA+Ci0JICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKLQkJaWYgKEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUyA9PSBudWxsKQotCQkJR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTID0gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpOwotCQlyZXR1cm4gR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgTG9nZ2VyIGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihJRCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleFBvaW50ID0gcmVnLmdldEV4dGVuc2lvblBvaW50KElELCAiZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIik7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleFBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2V4dGVuc2lvbnMubGVuZ3RoXTsKLQkJaWYgKGV4dGVuc2lvbnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCW5hbWVzW2ldID0gZXh0ZW5zaW9uc1tpXS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI5YzgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4NmEzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLVRoaXMgaXMgYSBzdHViIHBsdWdpbiBmb3IgcGVyZm1zci4gSXQgaXMgaGVyZSBqdXN0IHNvIHRoYXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgY2FuIGNvbXBpbGUuCi0KLUl0IHNob3VsZCBub3QgYmUgYW4gb3BlbiBwcm9qZWN0IGR1cmluZyBub3JtYWwgdXNhZ2UuIFdoZW5ldmVyIGFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBwcm9qZWN0Ci1hcmUgY2hhbmdlZCwgInBlcmZtc3IuamFyZGVzYyIgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgY2hhbmdlZCBhcHByb3ByaWF0ZSBqYXIuIERvIHRoaXMgYnk6Ci0KLTEpIFNlbGVjdCBwZXJmbXNyLmphcmRlc2MKLTIpIE9uIHBvcHVwIG1lbnUgc2VsZWN0ICJDcmVhdGUgSkFSIgotMykgSGl0ICJGaW5pc2giCi00KSBDb21taXQgYWxsIGNoYW5nZXMgdG8gQ1ZTLgotNSkgR28gdG8gb3JnLmVjbGlwc2UuamVtLnV0aWwgcHJvamVjdCwgc2VsZWN0IHRoZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1YiBmb2xkZXIKLSAgIGFuZCBzZWxlY3QgUmVwbGFjZS0+TGF0ZXN0IGZyb20gSEVBRC4gVGhpcyB3aWxsIGNhdXNlIHlvdXIganVzdCBjb21taXR0ZWQgY2hhbmdlcwotICAgZnJvbSBzdGVwIDQgdG8gYmUgcHV0IGludG8gb3JnLmVjbGlwc2UuamVtLnV0aWwgYW5kIHdpbGwgYmUgcGlja2VkIHVwIGZvciB0aGF0Ci0gICBwbHVnaW4gdG8gY29tcGlsZSBhZ2FpbnN0LgotNikgRWl0aGVyIGNsb3NlIG9yIGRlbGV0ZSB0aGUgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWYgcHJvamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWYyMzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4zMHRoIE1hcmNoLCAyMDA0PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBFUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgRVBMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBFUEwuPC9wPgotCi08cD48Yj5WZXJzaW9uOjwvYj4gdjIwMDQwNjI0YQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkYjU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgICouamFyCi1zb3VyY2UucGVyZm1zci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYmE4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZTIyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08amFyZGVzYz4KLSAgICA8amFyIHBhdGg9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyIi8+Ci0gICAgPG9wdGlvbnMgYnVpbGRJZk5lZWRlZD0idHJ1ZSIgY29tcHJlc3M9InRydWUiIGRlc2NyaXB0aW9uTG9jYXRpb249Ii9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcmRlc2MiIGV4cG9ydEVycm9ycz0idHJ1ZSIgZXhwb3J0V2FybmluZ3M9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiIHNhdmVEZXNjcmlwdGlvbj0idHJ1ZSIgdXNlU291cmNlRm9sZGVycz0iZmFsc2UiLz4KLSAgICA8bWFuaWZlc3QgZ2VuZXJhdGVNYW5pZmVzdD0idHJ1ZSIgbWFuaWZlc3RMb2NhdGlvbj0iL1ZFU2NyYXBQcm9qZWN0L01BTklGRVNULm1mIiBtYW5pZmVzdFZlcnNpb249IjEuMCIgcmV1c2VNYW5pZmVzdD0iZmFsc2UiIHNhdmVNYW5pZmVzdD0iZmFsc2UiIHVzZXNNYW5pZmVzdD0idHJ1ZSI+Ci0gICAgICAgIDxzZWFsaW5nIHNlYWxKYXI9ImZhbHNlIj4KLSAgICAgICAgICAgIDxwYWNrYWdlc1RvU2VhbC8+Ci0gICAgICAgICAgICA8cGFja2FnZXNUb1VuU2VhbC8+Ci0gICAgICAgIDwvc2VhbGluZz4KLSAgICA8L21hbmlmZXN0PgotICAgIDxzZWxlY3RlZEVsZW1lbnRzIGV4cG9ydENsYXNzRmlsZXM9InRydWUiIGV4cG9ydEphdmFGaWxlcz0idHJ1ZSIgZXhwb3J0T3V0cHV0Rm9sZGVyPSJmYWxzZSI+Ci0gICAgICAgIDxqYXZhRWxlbWVudCBoYW5kbGVJZGVudGlmaWVyPSI9b3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjIi8+Ci0gICAgPC9zZWxlY3RlZEVsZW1lbnRzPgotPC9qYXJkZXNjPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjBlZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QbHVnaW4ubmFtZT1QZXJmb3JtYW5jZSBNb25pdG9yCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2OTI2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZSIKLSAgIG5hbWU9IiVQbHVnaW4ubmFtZSIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJmbXNyLmphciI+PGV4cG9ydCBuYW1lPSIqIi8+PC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL0lQZXJmb3JtYW5jZU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5OTJjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOwotCi0vKioKLSAqIFRha2Ugc25hcHNob3RzIG9mIHRoZSB2YXJpb3VzIHBlcmZvcm1hbmNlIGNvdW50ZXJzLgotICogKioqKioqKioqKioqKiBUaGlzIGlzIGp1c3QgYSBzdHViIG9mIHRoZSByZWFsIGludGVyZmFjZSB0byBnZXQgb3JnLmVjbGlwc2UuamVtLnV0aWwgCi0gKiAgICAgICAgICAgICAgIHRvIGNvbXBpbGUuIEl0IGlzIG5vdCB1c2FibGUgYnkgaXRzZWxmLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBlcmZvcm1hbmNlTW9uaXRvcgotewotCS8qKgotCSAqIFRoZXNlIGNvbnN0YW50cyBjb250cm9sIGhvdyBtdWNoIGluZm9ybWF0aW9uIGlzIGdhdGhlcmVkIGZvciBhIHBhcnRpY3VsYXIgc25hcHNob3QuCi0JICogVGhleSBhcmUgb3InZWQgdG9nZXRoZXIgYW5kIHBhc3NlZCBpbnRvIHRoZSBzbmFwc2hvdCBtZXRob2QuICAKLQkgKi8KLQlpbnRlcmZhY2UgVHlwZXMKLQl7Ci0JCS8qKiAKLQkJICogMSAtIFdyaXRlIG91dCB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVGhlc2UKLQkJICogaW5jbHVkZSB3b3JraW5nIHNldCwgcGVhayB3b3JraW5nIHNldCwgZWxhcHNlZCB0aW1lLCB1c2VyIHRpbWUsIGFuZCAKLQkJICoga2VybmVsIHRpbWUuCi0JCSAqLwotCQlpbnQgT3BlcmF0aW5nU3lzdGVtQ291bnRlcnMJCT0gMTsKLQkJCi0JCS8qKgotCQkgKiAyIC0gV3JpdGUgb3V0IHRoZSBnbG9iYWwgcGVyZm9ybWFuY2UgaW5mby4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgdG90YWwKLQkJICogY29tbWl0dGVkIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uCi0JCSAqIAotCQkgKiBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIEdldFBlcmZvcm1hbmNlSW5mbygpIGZ1bmN0aW9uIGJlaW5nIGF2YWlsYWJsZSBpbgotCQkgKiB0aGUgV2luZG93cyBwc2FwaS5kbGwuIFRoaXMgaXMgYXZhaWxhYmxlIGluIFhQIGJ1dCBpcyB1c3VhbGx5IG5vdCBhdmFpbGFibGUKLQkJICogaW4gV2luLzIwMDAuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLQkJICovCi0JCWludCBHbG9iYWxTeXN0ZW1Db3VudGVycwkJPSAyOwotCQkKLQkJLyoqCi0JCSAqIDQgLSBXcml0ZSBvdXQgdGhlIHNpemUgb2YgdGhlIEphdmEgSGVhcC4KLQkJICovCi0JCWludCBKYXZhSGVhcFNpemUJCQkJPSA0OwotCi0JCS8qKgotCQkgKiA4IC0gV3JpdGUgb3V0IGhvdyBtdWNoIG9mIHRoZSBKYXZhIGhlYXAgaXMgYmVpbmcgdXNlZC4gVGhpcyBjYWxscyB0aGUgCi0JCSAqIGdhcmJhZ2UgY29sbGVjdG9yIHNvIGl0IG1heSBza2V3IHRpbWluZyByZXN1bHRzLgotCQkgKi8KLQkJaW50IEphdmFIZWFwVXNlZAkJCQk9IDg7Ci0JCQotCQkvKioKLQkJICogMTYgLSBUaGUgcGx1Z2luIHN0YXJ0dXAgYW5kIHNpemUgaW5mb3JtYXRpb24uCi0JCSAqLwotCQlpbnQgUGx1Z2luSW5mbwkJCQkJPSAxNjsKLQkJCi0JCS8qKiAweGZmZmYgLSBFdmVyeXRoaW5nLiAqLwotCQlpbnQgQWxsCQkJCQkJCT0gMHhmZmZmOwkKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHNvbWUgbW9yZSAiZXh0cmEiIHZhcmlhdGlvbnMuIAotCSAqIAotCSAqIFRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdCBhcmUgbWFkZSB1cCBvZiB0aGVzZSBleHRyYSB2YXJpYXRpb25zIHBsdXMgYW55IHZhcmlhdGlvbnMKLQkgKiB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IHdpdGggdGhlIHNldFZhcigpIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFyTGlzdCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHZhcmlhdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYXJBcHBlbmQoU3RyaW5nIHZhckxpc3QpOwotCQotCS8qKgotCSAqIFNldCB0aGUgZHJpdmVyIG5hbWUuIAotCSAqIAotCSAqIEBwYXJhbSBkcml2ZXIgYSBsYWJlbCB0aGF0IGlkZW50aWZpZXMgdGhlIGRyaXZlciB0aGF0IGlzIGJlaW5nIHRlc3RlZC4gSWYgaXQgaXMgYSBXU0FECi0JICogZHJpdmVyLCB0aGlzIHdpbGwgdXN1YWxseSBiZSBzZXQgYnkgdGhlIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcik7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgZmlsZSwgdGhhdCBpcyB0aGUgcGxhY2Ugd2hlcmUKLQkgKiB0aGUgbWVhc3VyZW1lbnRzIGFyZSBzdG9yZWQuCi0JICogCi0JICogQHBhcmFtIGxvZ0ZpbGUgdGhlIGZpbGUgbmFtZSBvZiB3aGVyZSB0aGUgbG9nIHNob3VsZCBiZSB3cml0dGVuLiBVc3VhbGx5IHRoaXMgaXMgZnVsbHkgcXVhbGlmaWVkCi0JICogcGF0aCBuYW1lLiBGb3IgZXhhbXBsZSAieDpcbG9nc1x0aW1lci54bWwiLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGUoU3RyaW5nIGxvZ0ZpbGUpOwotCQotCS8qKgotCSAqIFNldCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciB0byBiZSBvbiBvciBvZmYuIElmIGl0IGlzIG9mZiB0aGVuIG1vc3Qgb2YgdGhlIG90aGVyIAotCSAqIG9wZXJhdGlvbnMgd2lsbCBuby1vcC4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyBmb3IgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgdG8gYmUgb2ZmIHVubGVzcyBpdCdzIHNwZWNpYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LiAKLQkgKiBXaGVuIGNhbGxlZCBmcm9tIHRoZSBVSSwgdGhlIFVJIHNob3VsZCBjYWxsIHRoaXMgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbihib29sZWFuIGlzT24pOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHRlc3QgY2FzZSBudW1iZXIgZm9yIHRoaXMgbWVhc3VyZW1lbnQgcnVuLgotCSAqICAKLQkgKiBAcGFyYW0gdGVzdGQgdGVzdCBjYXNlIGlkZW50aWZpZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0ZChpbnQgdGVzdGQpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHRlc3QgY2FzZSBuYW1lLiBJZiB3aWxsIGNhdXNlIGEgbmV3IHRlc3QgY2FzZSB0byBiZSBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIHRlc3ROYW1lIGEgc2ltcGxlIChzaG9ydCkgdGVzdCBjYXNlIG5hbWUuIEluIHRoZSBjYXNlIG9mIEpVbml0IHRlc3QgY2FzZXMsIGl0IHdvdWxkIHVzdWFsbHkgCi0JICogYmUgdGhlIEpVbml0IG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdE5hbWUoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHZhcmlhdGlvbnMgdGhhdCBhcmUgaW4gZWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSB2YXIgYSBjb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG9mIHZhcmlhdGlvbiBudW1iZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyKFN0cmluZyB2YXIpOwotCQotCS8qKgotCSAqIFNldCB0aGUgdXBsb2FkIGhvc3QKLQkgKiAKLQkgKiBAcGFyYW0gaG9zdCBETlMgbmFtZSBvZiB0aGUgdXBsb2FkIGhvc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGxvYWRIb3N0KFN0cmluZyBob3N0KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVwbG9hZCBwb3J0Ci0JICogCi0JICogQHBhcmFtIHBvcnQgdXBsb2FkIHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGxvYWRQb3J0KGludCBwb3J0KTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHVwbG9hZCB1c2VyaWQKLQkgKiAKLQkgKiBAcGFyYW0gdXNlcmlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBsb2FkVXNlcmlkKFN0cmluZyB1c2VyaWQpOwotCQotCS8qKgotCSAqIFRha2UgYSBzbmFwc2hvdCBvZiBzb21lIGRlZmF1bHQgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGVwIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKLQkgKi8KLQl2b2lkIHNuYXBzaG90KGludCBzdGVwKTsKLQkKLQkvKioKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHNlbGVjdGVkIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RlcCB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCi0JICogCi0JICogQHBhcmFtIHR5cGVzIFRoaXMgY29udHJvbHMgd2hpY2ggbWVhc3VyZW1lbnRzIGFyZSBzZWxlY3RlZC4gSXQgaXMgYW4gb3InZCB0b2dldGhlcgotCSAqIGxpc3Qgb2YgdGhlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcyAKLQkgKi8KLQl2b2lkIHNuYXBzaG90KGludCBzdGVwLCBpbnQgdHlwZXMpOwotCQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb21tZW50IHRvIHRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBjb21tZW50Ci0JICovCi0Jdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpOwotCQotCS8qKgotCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgaWYgdGhlIHVwbG9hZGhvc3QsIHVwbG9hZHBvcnQgYW5kIHVwbG9hZHVzZXJpZAotCSAqIGhhdmUgYmVlbiBjb25maWd1cmVkIGJlZm9yZSBoYW5kLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0JICogCi0JICogQHJldHVybiBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBVcGxvYWQuU3RhdHVzIHVwbG9hZChTdHJpbmcgZGVzY3JpcHRpb24pOwotLy8JCi0vLwkvKioKLS8vCSAqIFVwbG9hZCB0aGUgcmVzdWx0cyB0byB0aGUgc2VydmVyLiBUaGlzIGNhdXNlcyB0aGUgZmlsZSB0byBiZQotLy8JICogY2xvc2VkLCBhbmQgdGhlIG1vbml0b3IgdG8gYmUgcGxhY2VkIGludG8gdGhlIGZpbmlzaGVkIHN0YXRlLgotLy8JICogCi0vLwkgKiBAcGFyYW0gaG9zdCB0aGUgaG9zdCBuYW1lIHRoYXQgdGhlIGZpbGUgaXMgYmVpbmcgc2VudCB0bwotLy8JICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgb24gdGhlIGhvc3QKLS8vCSAqIEBwYXJhbSB1c2VyaWQgdGhlIHVzZXJpZCB0aGF0IGlzIGRvaW5nIHRoZSB1cGxvYWQKLS8vCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAoaXQgY2FuIGJlIG51bGwpCi0vLwkgKiAKLS8vCSAqIEByZXR1cm4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24KLS8vCSAqLwotLy8JVXBsb2FkLlN0YXR1cyB1cGxvYWQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdXNlcmlkLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9QZXJmTXNyQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1BlcmZNc3JDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NWJhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1BlcmZNc3JDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLSAKLQotLyoqCi0gKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgY2xhc3MgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAotICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmTXNyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUGVyZm9ybWFuY2VNb25pdG9yIGdldFBlcmZvcm1hbmNlTW9uaXRvcihib29sZWFuIGJvb2wpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmE2NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9zcmMvb3JnL2VjbGlwc2UvcGVyZm1zci9jb3JlL1VwbG9hZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTsKLSAKLQotLyoqCi0gKiBVcGxvYWQuCi0gKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgaW50ZXJmYWNlIHRvIGdldCBvcmcuZWNsaXBzZS5qZW0udXRpbCAKLSAqICAgICAgICAgICAgICAgdG8gY29tcGlsZS4gSXQgaXMgbm90IHVzYWJsZSBieSBpdHNlbGYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotcHVibGljIGludGVyZmFjZSBVcGxvYWQgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdHVzIHsKLQkJcHVibGljIGJvb2xlYW4gc3VjY2VzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzZGI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvY29tbW9uLm1vdmUvd2VidG9vbHMuY29tbW9uLmdpdC9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzLHYgJAotIyAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wMi8xNSAyMzowNzo0NSAkCi0jCi0KLQotcGx1Z2luTmFtZT1KYXZhIEVNRiBNb2RlbCBVdGlsaXRpZXMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWJlNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gRXh0ZW5zaW9uIHBvaW50IHRvIHJlZ2lzdGVyIFJlc291cmNlSGFuZGxlcnMgdGhhdCB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byAKLQluZXcgV29ya2JlbmNoQ29udGV4dHMgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24iIG5hbWU9IlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIiBuYW1lPSJHbG9iYWwgUGx1Z2luIFJlc291cmNlIExvYWQiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5hdHVyZV9yZWdpc3RyYXRpb24iIG5hbWU9IkVNRiBOYXR1cmUgcmVnaXN0cmF0aW9uIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5IiBuYW1lPSJJbnRlcm5hbCBXb3JrYmVuY2ggQ29udGV4dCBGYWN0b3J5Ii8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbmFtZT0iVUkgQ29udGV4dCBTZW5zaXRpdmUgQ2xhc3MiIHNjaGVtYT0ic2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVpVGVzdGVyIiBuYW1lPSJVSSBUZXN0ZXIiIHNjaGVtYT0ic2NoZW1hL3VpVGVzdGVyLmV4c2QiLz4gICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkOTQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzA9SVdBRTAwMDNFIE1ldGhvZCBub3QgeWV0IGltcGxlbWVudGVkLgotRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMT1JV0FFMDAwNUUgUHJvamVjdCBjYW4gbm90IGJlIG51bGwuCi1FTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8yPUlXQUUwMDA2RSBBdHRlbXB0IHRvIGNyZWF0ZSByZXNvdXJjZSBzZXQgd2l0aCBudWxsIHByb2plY3QKLUVNRk5hdHVyZVJlZ2lzdHJ5X0VSUk9SXzA9SVdBRTAwMDdFIER1cGxpY2F0ZSBFTUYgbmF0dXJlIHJlZ2lzdHJhdGlvbiBmb3IgaWQ6IHswfQotRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMD1UaGUgcHJvamVjdCBzaG91bGQgbm90IGJlIG51bGwuCi1FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8xPVRoZSBwcm9qZWN0IFwiezB9XCIgaXMgbm90IGFjY2Vzc2libGUuCi0KLVByb2plY3RVdGlsX0RlbGV0ZV8xPURlbGV0aW5nIFwiezB9XCIuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzBlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qZW0udXRpbCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiIGlkPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbmFtZT0iVUkgQ29udGV4dCBTZW5zaXRpdmUgQ2xhc3MiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29tcG9uZW50cyBhcmUgb2Z0ZW4gZGVzaWduZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSAmcXVvdDtIZWFkbGVzcyZxdW90OyBvciBub24tZ3JhcGhpY2FsIHBvcnRpb25zIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UgKEdVSSkgcG9ydGlvbnMuIFNvbWV0aW1lcyB0aGlzIGlzIGRvbmUgdG8gZm9sbG93IGdvb2QgZGVzaWduIHByaW5jaXBsZXMsIG90aGVyIHRpbWVzIHRoZXJlIGlzIGEgc3BlY2lmaWMgdXNlIGNhc2UgZm9yIGRvaW5nIHNvLiBXaGVuIHBsdWdpbnMgZm9sbG93IHRoaXMgcHJhY3RpY2UgYmVjYXVzZSB0aGV5IG11c3QgdmFyeSB0aGVpciBiZWhhdmlvciBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIHJ1bm5pbmcgaW4gYSBoZWFkbGVzcyBlbnZpcm9ubWVudCBvciBhIGdyYXBoaWNhbCBlbnZpcm9ubWVudCwgdGhleSBvZnRlbiBuZWVkIHRvIGNob29zZSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHBhcnRpY3VsYXIgdHlwZS4gVGhlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlZCBieSB0aGUgSkVNIGNvbXBvbmVudCBzb2x2ZXMgZXhhY3RseSB0aGlzIHByb2JsZW0uCi0mbHQ7cCZndDsgICAgCi1UbyB1c2UgdGhlIGV4dGVuc2lvbiBwb2ludCwgeW91IG11c3QgcHJvdmlkZSB0d28gZXh0ZW5zaW9ucyB0aGF0IGFyZSBsaW5rZWQgYnkgYSBrZXkuIFRoZSBrZXkgaXMgYSB1bmlxdWUgU3RyaW5nLWJhc2VkIHZhbHVlIHRoYXQgeW91IHdpbGwgbGF0ZXIgdXNlIHRvIGluc3Rhbml0YXRlIHlvdXIgY2xhc3MuCi0mbHQ7cCZndDsKLVRoZSBmaXJzdCB1c2FnZSBvZiB0aGUgZXh0ZW5zaW9uIHNwZWNpZmllcyB5b3VyIGtleSwgYW5kIHRoZSBIZWFkbGVzcyBjb250ZXh0LCBhbmQgdGhlIGNsYXNzIHRoYXQgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgdGhpcyAoa2V5LCBjb250ZXh0KSBwYWlyLiBUaGlzIG1lYW5zIGluIHRoZSBoZWFkbGVzcyBlbnZpcm9ubWVudCB0aGlzIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVxdWVzdGVkLgotJmx0O3AmZ3Q7Ci1UaGUgc2Vjb25kIGV4dGVuc2lvbiBzcGVjaWZpZXMgdGhlIFVJIGNvbnRleHQgYW5kIHRoZSBzYW1lIGtleSwgYnV0IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIGZvciBncmFwaGljYWwgZW52aXJvbm1lbnRzLiBUaGlzIG1lYW5zIGluIHRoZSBVSSBlbnZpcm9ubWVudCB0aGlzIG90aGVyIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVxdWVzdGVkLgotJmx0O3AmZ3Q7Ci1UaGUgYWN0dWFsIHJlcXVlc3QgaXMgZG9uZSBpbiB5b3VyIGNvZGUgdmlhOgotJmx0O3ByZSZndDsKLUlNeUludGVyZmFjZSBpbnN0YW5jZSA9IChJTXlJbnRlcmZhY2UpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoJnF1b3Q7bXlLZXkmcXVvdDspOwotJmx0Oy9wcmUmZ3Q7Ci13aGVyZSAmbHQ7Y29kZSZndDsmcXVvdDtteUtleSZxdW90OyZsdDsvY29kZSZndDsgaXMgdGhlIGtleSB1c2VkIG9uIGJvdGggZXh0ZW5zaW9ucy4gSXQgd2lsbCB0aGVuIGNob29zZSBlaXRoZXIgdGhlIFVJIG9yIHRoZSBIZWFkbGVzcyBleHRlbnNpb24gZGVwZW5kaW5nIHVwb24gdGhlIGNvbnRleHQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gZXh0ZW5zaW9uIHBvaW50IHRoYXQgZGVmaW5lcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGFuZCBpdHMgYXBwcm9wcmlhdGUgY29udGV4dCAoVUkgb3IgSGVhZGxlc3MpCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUga2V5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDb250ZXh0IFNlbnNpdGl2ZSBzdXBlciBjbGFzcy9pbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGVpdGhlciBhIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dCIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgT25lIG9mICZxdW90O1VJJnF1b3Q7IG9yICZxdW90O0hlYWRsZXNzJnF1b3Q7IFRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuIEl0IG11c3QgbWF0Y2ggZXhhY3RseSBhcyBzaG93biBoZXJlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgPHNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVUkiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZGxlc3MiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDYuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2FnZSBmb3IgdGhlIFVJIGNvbnRleHQ6Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBVSSBDb250ZXh0IENsYXNzJnF1b3Q7Ci0gICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuQ29udGV4dFNlbnNpdGl2ZUNsYXNzJnF1b3Q7Jmd0OwotICAgICAmbHQ7dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKLSAgICAgICBjb250ZXh0PSZxdW90O1VJJnF1b3Q7Ci0gICAgICAga2V5PSZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgIGNsYXNzTmFtZT0mcXVvdDtjb20uaWJtLnd0cC5jb21tb24udWkuV1RQVUlXb3JraW5nQ29weU1hbmFnZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDticiZndDsKLVVzYWdlIGZvciB0aGUgSGVhZGxlc3MgY29udGV4dDoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgaWQ9JnF1b3Q7Y29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7Ci0gICAgICAgbmFtZT0mcXVvdDtXb3JraW5nIENvcHkgTWFuYWdlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MmcXVvdDsKLSAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC5Db250ZXh0U2Vuc2l0aXZlQ2xhc3MmcXVvdDsmZ3Q7Ci0gICAgICZsdDt1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgY29udGV4dD0mcXVvdDtIZWFkbGVzcyZxdW90OwotICAgICAgICAga2V5PSZxdW90O3dvcmtpbmdDb3B5TWFuYWdlciZxdW90OwotICAgICAgICAgY2xhc3NOYW1lPSZxdW90O2NvbS5pYm0ud3RwLmNvbW1vbi51aS5XVFBIZWFkbGVzc1dvcmtpbmdDb3B5TWFuYWdlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0O2JyJmd0OwotQW5kIGZpbmFsbHkgdGhlIHJldHJpZXZhbCBvZiB0aGUgY2xhc3MgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQ6Ci0KLSZsdDtwcmUmZ3Q7Ci1JV29ya2luZ0NvcHlNYW5hZ2VyIG1hbmFnZXIgPSAoSVdvcmtpbmdDb3B5TWFuYWdlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgmcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDspOwotJmx0Oy9wcmUmZ3Q7Ci0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTZWUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiZsdDsvY29kZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIElCTSAyMDAzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpVGVzdGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aVRlc3Rlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlhYjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvc2NoZW1hL3VpVGVzdGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamVtLnV0aWwiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQgdG8gdGVsbCBKRU0gdGhhdCBpdCBpcyBydW5uaW5nIGluIGEgbm9uLUhFQURMRVNTIGVudmlyb25tZW50LiBUeXBpY2FsbHkgVUkgZW52aXJvbm1lbnQgaXMgbm9uLUhFQURMRVNTLiBUaGUgZGVmYXVsdCBpZiB0aGVyZSBhcmUgbm8gaW1wbGVtZW50ZXJzIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgcmV0dXJuIHRydWUgaXMgSEVBRExFU1MuCi0mbHQ7cCZndDsKLUEgSEVBRExFU1MgZW52aXJvbm1lbnQgaXMgdHlwaWNhbGx5IGEgYmF0Y2ggc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIG5vIFVJIGFuZCB0aGUgd29ya3NwYWNlIGlzIHVzZWQgZm9yIG9uZSBvcGVyYXRpb24gYW5kIHRoZW4gdGVybWluYXRlZC4gTW9zdCBoZWFkbGVzcyB0YXNrcyBhcmUgZG9uZSB1bmRlciBvbmUgb3BlcmF0aW9uIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgbWF5IG5vdCBoYXZlIGEgY2hhbmNlIHRvIGZsdXNoIGEgYmFkIHJlZmxlY3Rpb24gYmVmb3JlIHRoZSByZWFsIHR5cGUgbmVlZHMgdG8gYmUgZm91bmQgYW5kIGNhbiBiZSBmb3VuZC4gU28gd2hhdCB3b3VsZCBoYXBwZW4gaXMgaWYgYSBjbGFzcyB3YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvbmUgb3BlcmF0aW9uIGl0IHdvdWxkIG5vdCBiZSBmb3VuZCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb25zIGhhZCBub3QgeWV0IGdvbmUgb3V0LiAKLSZsdDtwJmd0OwotSW4gYSBVSSBlbnZpcm9ubWVudCB0aGUgb3BlcmF0aW9ucyBhcmUgdHlwaWNhbGx5IHNob3J0IGFuZCBkbyBvbmx5IGEgZmV3IHRoaW5ncyBhbmQgdGhlIHJlc3VsdHMgYXJlbiZhcG9zO3QgbmVlZGVkIHVudGlsIGFmdGVyIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gSW4gdGhhdCBjYXNlIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIG5vdCBrZWVwIGNoZWNraW5nIGlmIGEgY2xhc3MgaGFzIGFwcGVhcmVkIGV2ZXJ5dGltZSBhIHJlcXVlc3QgaXMgbWFkZSwgaW5zdGVhZCBpdCB3aWxsIHdhaXQgZm9yIHRoZSBub3RpZmljYXRpb24gb2YgdGhlIGFkZGVkIGNsYXNzIHRvIGFwcGVhciBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZWZpbml0aW9uIHRvIGFsbG93IGNoZWNraW5nIGFnYWluIGxhdGVyLgotJmx0O3AmZ3Q7Ci1JZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGltcGxlbWVudGVyIG9mIHRoaXMgaW50ZXJmYWNlIGluIHRoZSBhcHBsaWNhdGlvbiwgdGhlbiBpdCB3aWxsIGdvIHRocm91Z2ggZWFjaCBvZiB0aGVtIG9uY2UgdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gQXMgc29vbiBhcyBvbmUgcmV0dXJucyB0cnVlIGl0IHdpbGwgc3RvcCBhbmQgbWFyayB0aGUgYXBwbGljYXRpb24gYXMgYmVpbmcgbm9uLUhFQURMRVNTLiBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IG9uY2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4gSXQgd2lsbCBub3QgYmUgYWdhaW4gdW50aWwgdGhlIG5leHQgc2Vzc2lvbiBvZiB0aGUgYXBwbGljYXRpb24uCi0mbHQ7cCZndDsKLVRoaXMgaXMgdHlwaWNhbGx5IGFuIGludGVybmFsIGV4dGVuc2lvbiBwb2ludCBvbmx5LiBUaGUgSkVNIFVJIHBsdWdpbiB3aWxsIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBQbGF0Zm9ybSBVSSBpcyBhY3RpdmUuIFNvIHRoaXMgd2lsbCBub3JtYWxseSBub3QgYmUgbmVlZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vc3QgY3VzdG9tZXJzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aVRlc3RlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idWlUZXN0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSB1aVRlc3RlciBkZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVUlUZXN0ZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiBJdCBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW1wbGVtZW50ZXI6IAotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC51aVRlc3RlciZxdW90OyZndDsKLSAgJmx0O3VpVGVzdGVyCi0gICBjbGFzc05hbWU9JnF1b3Q7Y29tLmV4YW1wbGUuVUlUZXN0ZXJJbXBsZW1lbnRhdGlvbiZxdW90Oy8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3NOYW1lJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSBhIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UgZm9yIHRoZSB0ZXN0ZXIuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZXJlIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgY2xhc3MuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MjAyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3RwZW1mLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndvcmtiZW5jaC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NThiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotcnVudGltZQotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZfMS4wLjAuemlwCi1zcmMuemlwCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1ZjBmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzMmRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6MDY6MDIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE5YWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjQuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzdjZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgc2NoZW1hLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gd3RwZW1mLyxcCi0gICAgICAgICAgIHdvcmtiZW5jaC8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzMGQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODNkMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVBhY2thZ2VVUklNYXA9UGFja2FnZVVSSU1hcAotcGx1Z2luTmFtZT1FTUYgVXRpbGl0aWVzCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlNmFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwYWNrYWdlVVJJTWFwIiBuYW1lPSIlUGFja2FnZVVSSU1hcCIgc2NoZW1hPSJzY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIi8+Ci0gICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRyYW5zbGF0b3JFeHRlbnNpb24iIG5hbWU9InRyYW5zbGF0b3JFeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZCIvPgotCi08IS0tIE5lZWQgdG8gcmVnaXN0ZXIgdGhlIEVjb3JlIHNwZWNpZmljIHBhY2thZ2UgbWFwcGluZ3MgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYucGFja2FnZVVSSU1hcCI+Ci0gICAgICA8bWFwCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgICAgICAgICBwcmVmaXg9ImVjb3JlIj4KLSAgICAgIDwvbWFwPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL01hcHBpbmciCi0gICAgICAgICAgICBwcmVmaXg9Im1hcHBpbmciPgotICAgICAgPC9tYXA+Ci08IS0tIFRyaWNrIHRvIGdldCBNYXBwaW5nLnhtaSBmb3IgTU9GNSBzZXJpYWxpemF0aW9uIC0tPgotICAgICAgPG1hcAotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL01hcHBpbmciCi0gICAgICAgICAgICBwcmVmaXg9Ik1hcHBpbmciPgotICAgICAgPC9tYXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiCi0gICAgICAgICAgICBrZXk9InJlbmRlcmVyRmFjdG9yeSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDc2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmVtZiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3d0cGVtZiIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3d0cGVtZiI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvc2NoZW1hL3BhY2thZ2VVUklNYXAuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5ZDk1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS9wYWNrYWdlVVJJTWFwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIiBpZD0icGFja2FnZVVSSU1hcCIgbmFtZT0iJVBhY2thZ2VVUklNYXAiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byByZWdpc3RlciBwYWNrYWdlIG1hcHBpbmdzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtYXAiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFwIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTk2NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgaWQ9InRyYW5zbGF0b3JFeHRlbnNpb24iIG5hbWU9InRyYW5zbGF0b3JFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGNvbnRyaWJ1dGUgY2hpbGQgdHJhbnNsYXRvcnMgdG8gdGhlIGRlZmF1bHQgdHJhbnNsYXRvcnMgaW4gRU1GMkRPTUFkYXB0ZXJJbXBsLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0cmFuc2xhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRyYW5zbGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgY2hpbGQgdHJhbnNsYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzRjN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLQotCi0KLS8qKgotICogVGhlIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlciBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBsb2FkaW5nCi0gKiBvZiBFTUYgcmVzb3VyY2VzLiBUaGlzIGlzIHRoZSBFY2xpcHNlIHZlcnNpb24gb2YgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLAotICogYW5kIHVzZXMgdGhlIEVjbGlwc2UgSUxvY2sgdGVjaG5vbG9neSB0byBhY3F1aXJlIGEgc2VtYXBob3JlIHVudGlsIHRoZQotICogUmVzb3VyY2UgaXMgbG9hZGVkLiB0aGUgd2FpdEZvclJlc291cmNlVG9Mb2FkKCkgbWV0aG9kIHdpbGwgcGF1c2UgdW50aWwKLSAqIGVpdGhlciAoYSkgdGhlIFJlc291cmNlIGhhcyBsb2FkZWQsIHRoZSBBZGFwdGVyIGlzIG5vdGlmaWVkLCBhbmQgdGhlCi0gKiBzZW1hcGhvcmUgaXMgcmVsZWFzZWQgb3IgKGIpIHRoZSBERUxBWSB0aW1lb3V0IGlzIGV4Y2VlZGVkLCB3aGljaCBwcmV2ZW50cwotICogZnVsbCBkZWFkbG9jay4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBJTG9jayBsb2FkaW5nTG9jazsKLQotCS8qKgotCSAqIFRoZSBkZWxheSBpcyBkZWZhdWx0IHRvIDUgbWludXRlcy4gVGhpcyBpcyB0aGUgdXB3YXJkIHRocmVzaGhvbGQuIFRoZQotCSAqIGxvY2sgd2lsbCB3YWl0IHVwIHRvIERFTEFZIG1pbGxpc2Vjb25kcyB0byBhY3F1aXJlIHRoZSBsb2NrLCBhbmQgYmFpbAotCSAqIGlmIG5vdC4gSXQgZG9lcyBub3QgbWVhbiB0aGF0IGl0IHdpbGwgd2FpdCBERUxBWSBtaWxsaXNlY29uZHMgYWx3YXlzLgotCSAqIEluIGdlbmVyYWwsIHRoZSB3YWl0IHNob3VsZCBiZSBhbG1vc3QgaW5zdGFudGVvdXMgLS0ganVzdCBhcyBsb25nIGFzCi0JICogZG9jdW1lbnQgbG9hZGluZyByZW1haW5zIHNwZWVkeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMzAwMDAwOwotCi0JcHVibGljIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlcigpIHsKLQkJbG9hZGluZ0xvY2sgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCkKLQkJCWxvYWRpbmdMb2NrLmFjcXVpcmUoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53dHAuaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIjd2FpdEZvclJlc291cmNlVG9Mb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKSB7Ci0KLQkJaWYgKGxvYWRpbmdMb2NrID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBsb2NrQWNxdWlyZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQotCQkJCWlmICghKGxvY2tBY3F1aXJlZCA9IGxvYWRpbmdMb2NrLmFjcXVpcmUoREVMQVkpKSkKLQkJCQkJbG9nV2FybmluZygpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGp1c3QgY29udGludWUKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChsb2NrQWNxdWlyZWQpCi0JCQkJbG9hZGluZ0xvY2sucmVsZWFzZSgpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2dXYXJuaW5nKCkgewotCQlOb3RpZmllciB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsIHx8ICEodGFyZ2V0IGluc3RhbmNlb2YgUmVzb3VyY2UpKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgdGFyZ2V0OwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJbV0FSTklOR10gQ291bGQgbm90IGFjcXVpcmUgU2VtYXBob3JlIExvY2sgZm9yIFJlc291cmNlOiBcIiIgKyByZXNvdXJjZS5nZXRVUkkoKSArICJcIiBpbiAiICsgZ2V0Q2xhc3MoKSk7Ci0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgIT0gbnVsbCkgewotCQkJLy8gbGlzdGVuIGZvciB0aGUgcmVtb3ZlIG9mIHRoZSBsb2FkaW5nIGFkYXB0ZXIKLQkJCWlmIChpc1NldExvYWRlZFJlc291cmNlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikpIHsKLQkJCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCkKLQkJCQkJbG9hZGluZ0xvY2sucmVsZWFzZSgpOwotCQkJCXJlbW92ZUlzTG9hZGluZ1N1cHBvcnQoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciNmb3JjZVJlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlUmVsZWFzZSgpIHsKLQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwgJiYgbG9hZGluZ0xvY2suZ2V0RGVwdGgoKSA+IDApCi0JCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTBlOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgY3JlYXRlUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkgeyAKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vRWNvcmVVdGlsaXRpZXNQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9FY29yZVV0aWxpdGllc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI0YzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9FY29yZVV0aWxpdGllc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRWNvcmVVdGlsaXRpZXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTEFUT1JfRVhURU5TVElPTl9QT0lOVCA9ICJ0cmFuc2xhdG9yRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgRWNvcmVVdGlsaXRpZXNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdEhhbmRsZXIoUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuSU5TVEFOQ0UpOwotCQlQYWNrYWdlVVJJTWFwUmVhZGVyIHJlYWRlciA9IG5ldyBQYWNrYWdlVVJJTWFwUmVhZGVyKCk7Ci0JCXJlYWRlci5wcm9jZXNzRXh0ZW5zaW9ucygpOwotCQkvL3VzZSBhIHN5bmNocm9uaXplZCBsb2FkaW5nIGFkYXB0ZXIgZmFjdG9yeQotCQlSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFID0gbmV3IFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjMzliMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeTsKLQotLyoqCi0gKiBUaGlzIHJlYWRlciB3aWxsIHJlYWQgdGhlIHBhY2thZ2VVUklNYXAgZXh0ZW5zaW9uIHBvaW50IGFuZCBwb3B1bGF0ZSB0aGUKLSAqIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LgotICogCi0gKiBUaGUgcGFja2FnZVVSSU1hcCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGVsZW1lbnQuCi0gKiAKLSAqIDxtYXAgcHJlZml4PSJzb21lUGFja2FnZVByZWZpeCIgdXJpPSJzb21lUGFja2FnZVVSSSIvPgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVVSSU1hcFJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9BVFRfTkFNRSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9BVFRfTkFNRSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gInBhY2thZ2VVUklNYXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFBhY2thZ2VVUklNYXBSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCB0aGlzIG1ldGhvZCB0byByZWFkIGFuZCBwcm9jZXNzIGFsbCBvZiB0aGUgcGFja2FnZVVSSU1hcCBleHRlbnNpb25zLiAqCi0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc0V4dGVuc2lvbnMoKSB7Ci0JCUNvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZyA9IENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvblBvaW50KCkuZ2V0RXh0ZW5zaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQlwcm9jZXNzRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0sIHJlZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV4dGVuc2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uLCBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlncyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKQotCQkJcHJvY2Vzc0NvbmZpZ3VyYXRpb24oY29uZmlnc1tpXSwgcmVnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlndXJhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQUkVGSVhfQVRUX05BTUUpOwotCQlTdHJpbmcgdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVVJJX0FUVF9OQU1FKTsKLQkJcmVnLnJlZ2lzdGVyUHJlZml4VG9QYWNrYWdlVVJJKHByZWZpeCwgdXJpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTgwNzU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGV4dGVuZHMgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIHsKLQotCXN0YXRpYyBmaW5hbCBQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUX1BPSU5UX05BTUUgPSAicmVuZGVyZXJGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIjZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgewotCQlSZW5kZXJlckZhY3RvcnkgYUZhY3RvcnkgPSAoUmVuZGVyZXJGYWN0b3J5KSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKEVYVF9QT0lOVF9OQU1FKTsKLQkJcmV0dXJuIGFGYWN0b3J5ID09IG51bGwgPyBzdXBlci5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgOiBhRmFjdG9yeTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQWJzdHJhY3RSZW5kZXJlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0Fic3RyYWN0UmVuZGVyZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjgzYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQWJzdHJhY3RSZW5kZXJlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbXBsIGltcGxlbWVudHMgUmVuZGVyZXIgewotCi0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgaW50IHZlcnNpb25JZDsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RSZW5kZXJlckltcGwuCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVuZGVyZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlIGFSZXNvdXJjZSkgewotCQlyZXNvdXJjZSA9IGFSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZ2V0UmVzb3VyY2UoKQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JZCgpIHsKLQkJcmV0dXJuIHRoaXMudmVyc2lvbklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JZChpbnQgdmVyc2lvbklkKSB7Ci0JCXRoaXMudmVyc2lvbklkID0gdmVyc2lvbklkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW5nOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIGIpIHsKLQkJdmFsaWRhdGluZyA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2FjY2Vzc0ZvclJlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2FjY2Vzc0ZvcldyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjaXNNb2RpZmllZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc1NoYXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjaXNTaGFyZWRGb3JXcml0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVEZWxldGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlVW5sb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVVbmxvYWQoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3JlbGVhc2VGcm9tUmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNyZWxlYXNlRnJvbVdyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNzZXRCYXRjaE1vZGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMDg2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjEsIDIwMDMKLSAqICAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlciBleHRlbmRzIFRyYW5zbGF0b3JGaWx0ZXIgewotCi0JcHVibGljIEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIoKSB7Ci0JCXN1cGVyKG51bGwsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcihUcmFuc2xhdG9yIHRyYW5zLCBpbnQgdmVyc2lvbikgewotCQlzdXBlcih0cmFucywgdmVyc2lvbik7Ci0JfQotCi0JcHVibGljIGZpbmFsIGludCBzY2FuTmV4dFRyYW5zbGF0b3IoVHJhbnNsYXRvcltdIGNoaWxkcmVuLCBpbnQgc3RhcnQpIHsKLQkJaW50IGZvdW5kID0gc3RhcnQgKyAxOwotCQlmb3IgKDsgZm91bmQgPCBjaGlsZHJlbi5sZW5ndGg7ICsrZm91bmQpIHsKLQkJCWlmIChjaGlsZHJlbltmb3VuZF0uaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlicmVhazsKLQkJfQotCQlmb3VuZCA9IChmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aCkgPyBmb3VuZCA6IC0xOwotCQlyZXR1cm4gZm91bmQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc1ODMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotCi0vKioKLSAqIENhY2hlRXZlbnROb2RlcyAoQ0VOT3MpIHN0b3JlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIFNBWCBFdmVudHMuIFRoaXMgaW5mb3JtYXRpb24gY2FuIHRoZW4gYmUKLSAqIHVzZWQgb25jZSBhbGwgbmVjZXNzYXJ5IFNBWCBFdmVudHMgaGF2ZSBiZWVuIGdlbmVyYXRlZCB0byBjcmVhdGUgYW5kL29yIHNldCB2YWx1ZXMgb24gRU1GIG1vZGVsCi0gKiBvYmplY3RzLgotICogCi0gKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBoYXZlIGEgc2ltcGxlIGxpZmVjeWNsZTogaW5pdGlhbGl6ZSwgY29sbGVjdCBkYXRhLCBjb21taXQsIGRpc2NhcmQuIFdoZW4KLSAqIGluaXRpYWxpemVkLCBDRU5PcyB3aWxsIGF0dGVtcHQgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNsYXRvciBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBuYW1lLAotICogYW5kIGFsc28gY3JlYXRlL3NldCBhbnkgbmVjZXNzYXJ5IEVNRiBtb2RlbCB2YWx1ZXMuIERhdGEgaXMgY29sbGVjdGVkIGFzIFNBWCBjaGFyYWN0ZXIoKSBldmVudHMKLSAqIGFyZSBnZW5lcmF0ZWQuIE9uIHRoZSBTQVggZW5kRWxlbWVudCBldmVudCwgdGhlIENFTk8gaXMgY29tbWl0dGVkKCksIHdoaWNoIGlzIHdoZXJlIGl0IHdpbGwKLSAqIGNvbXBsZXRlIGl0cyBwcm9jZXNzaW5nIHRvIGNyZWF0ZSBFTUYgbW9kZWwgZmVhdHVyZXMuIEluIHRob3NlIGNhc2VzIHdoZXJlIGl0IGNhbm5vdCBjb21wbGV0ZSBpdHMKLSAqIHByb2Nlc3NpbmcsIGl0IHdpbGwgZGVmZXIgaXRzIHByb2Nlc3NpbmcgdG8gdGhlIHVwZGF0ZUVNRigpIG1ldGhvZCBvZiBpdHMgcGFyZW50LiBEZWZlcmVkCi0gKiBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgRU1GIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSByZWFkIGFoZWFkIGN1ZXMgZnJvbSB0aGUgWE1MLiBDRU5PcwotICogd2lsbCBhZGQgdGhlbXNlbHZlcyB0byB0aGVpciBwYXJlbnRzIGFzIGNoaWxkcmVuIGluIGEgdHJlZSBkYXRhIHN0cnVjdHVyZS4gV2hlbiBhbiBDRU5PCi0gKiBkZXRlcm1pbmVzIGl0IGlzIHRoZSBnb2xkZW4gcGllY2Ugb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFudGlhdGUgaXRzIHBhcmVudCBmZWF0dXJlLCBpdAotICogd2lsbCB0cmlnZ2VyIGl0cyBwYXJlbnQgQ0VOTyB0byBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBjYWNoZWQgQ0VOTyB0cmVlLiBBcyBtZW50aW9uZWQsIHRoZQotICogYnVpbGRpbmcgb2YgYSBDRU5PIHRyZWUgd2lsbCBvbmx5IG9jY3VyIGZvciBub2RlcyB3aXRoIHJlYWQgYWhlYWQgY3Vlcy4KLSAqIAotICogZGlzY2FyZCgpIGlzIGludm9rZWQgYnkgaW5pdCgpIHRvIGVuc3VyZSB0aGF0IG5vIGp1bmsgc3RhdGUgaXMgbGVmdCBmcm9tIGEgcHJldmlvdXMgdXNlIG9mIHRoZQotICogQ0VOTy4gY29tbWl0KCkgd2lsbCBjYWxsIGRpc2NhcmQgYXMgbmVlZGVkLiBCZWNhdXNlIG9mIHRoZSB1c2Ugb2YgZGlzY2FyZCwgQ0VOT3MgY2FuIGJlIHBvb2xlZAotICogYW5kIHJldXNlZC4gSWYgYSBDRU5PIGRldGVybWluZXMgdGhhdCBpdCBpcyBjb250YWluZWQgaW4gYSBwb29sLCBpdCB3aWxsIG1hbmFnZSBpdHMgb3duIHJlbGVhc2UKLSAqIGZyb20gdGhhdCBwb29sLiBTZWxmLSBtYW5hZ2VtZW50IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSB3YXkgaW4gd2hpY2ggQ0VOT3MgbWlnaHQgY2FjaGUKLSAqIGNlcnRhaW4gY2hpbGRyZW4gd2hpbGUgd2FpdGluZyB0byBjcmVhdGUgdGhlIHBhcmVudCBFTUYgZmVhdHVyZS4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUV2ZW50Tm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX05PREUgPSAiRU1GX1JPT1RfTk9ERSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBOb3RpZmllciBlbWZPd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBudWxsOwotCXByaXZhdGUgaW50IHZlcnNpb25JRDsKLQotCS8qCi0JICogVGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgdGhlIGF0dHJpYnV0ZXMgaXMgYSBTdHJpbmdbXS4gVGhlIGNob2ljZSB3YXMgbWFkZQotCSAqIHRvIHVzZSBhbiBhcnJheSB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYW5vdGhlciBvYmplY3QgKHByb2JhYmx5IGEgSGFzaHRhYmxlKSBhbmQgdG8gZXhwbG9pdAotCSAqIGFycmF5LWFjY2VzcyB0aW1lcyB0byBnZXQgdGhlIG5hbWUgYW5kIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIChvcHBvc2VkIHRvIGZ1bGwgZmxlZGdlZAotCSAqIG1ldGhvZCBpbnZvY2F0aW9ucykuCi0JICogIAotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50Tm9kZSBwYXJlbnQgPSBudWxsOwotCXByaXZhdGUgQ2FjaGVFdmVudFBvb2wgY29udGFpbmluZ1Bvb2wgPSBudWxsOwotCXByaXZhdGUgQm9vbGVhbiBpZ25vcmFibGUgPSBudWxsOwotCi0JcHVibGljIENhY2hlRXZlbnROb2RlKENhY2hlRXZlbnRQb29sIGNvbnRhaW5pbmdQb29sKSB7Ci0JCXRoaXMuY29udGFpbmluZ1Bvb2wgPSBjb250YWluaW5nUG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBMaWZlY3ljbGUgbWV0aG9kLiBpbml0KFRyYW5zbGF0b3JSZXNvdXJjZSkgd2lsbCBjb25maWd1cmUgdGhpcyBBZGFwdGVyIGFzIGEgUk9PVCBub2RlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaW52b2tlIGRpc2NhcmQoKSBiZWZvcmUgY29tcGxldGluZyBpdHMgdGFza3MuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcy5kaXNjYXJkKCk7Ci0JCXRoaXMuc2V0RW1mT3duZXIocmVzb3VyY2UpOwotCQl0aGlzLnNldFRyYW5zbGF0b3IocmVzb3VyY2UuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JCXRoaXMuc2V0VmVyc2lvbklEKHJlc291cmNlLmdldFZlcnNpb25JRCgpKTsKLQkJdGhpcy5ub2RlTmFtZSA9IENhY2hlRXZlbnROb2RlLlJPT1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBMaWZlY3ljbGUgbWV0aG9kLiBpbml0KENhY2hlRXZlbnROb2RlLCBTdHJpbmcsIEF0dHJpYnV0ZXMpIHdpbGwgY29uZmlndXJlIHRoaXMgQWRhcHRlciB0byBiZQotCSAqIGEgbm9uLVJPT1Qgbm9kZSBvZiB0aGUgQWRhcHRlciBkYXRhIHN0cnVjdHVyZQotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgaW52b2tlIGRpc2NhcmQoKSBiZWZvcmUgY29tcGxldGluZyBpdHMgdGFza3MuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChDYWNoZUV2ZW50Tm9kZSBwYXJlbnRBcmcsIFN0cmluZyBub2RlTmFtZUFyZywgQXR0cmlidXRlcyBhdHRyaWJ1dGVzQXJnKSB7Ci0JCXRoaXMuZGlzY2FyZCgpOwotCQl0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWVBcmc7Ci0JCWluaXQocGFyZW50QXJnLCBhdHRyaWJ1dGVzQXJnKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdChDYWNoZUV2ZW50Tm9kZSBwYXJlbnRSZWNvcmQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlc0FyZykgewotCQlzZXRQYXJlbnQocGFyZW50UmVjb3JkKTsKLQotCQlzZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNBcmcpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCS8qIEkgYW0gbm90IHRoZSByb290ICovCi0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgcGFyZW50IGlzIHBhcnQgb2YgdGhlIERPTSBQYXRoLCB0aGVuIHdlIGlnbm9yZSBpdCBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgZ3JhbmQKLQkJCSAqIHBhcmVudAotCQkJICovCi0JCQlpZiAocGFyZW50LnRyYW5zbGF0b3IgIT0gbnVsbCAmJiBwYXJlbnQuaXNJbkRPTVBhdGgoKSkgewotCQkJCXNldFBhcmVudChwYXJlbnQuZ2V0UGFyZW50KCkpOwotCQkJfQotCi0JCQlzZXRWZXJzaW9uSUQocGFyZW50LmdldFZlcnNpb25JRCgpKTsKLQkJCWlmIChwYXJlbnQuZ2V0RW1mT3duZXIoKSAhPSBudWxsICYmIHBhcmVudC5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgewotCi0JCQkJLyogTXkgcGFyZW50IGhhZCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZW1zZWxmICovCi0KLQkJCQlpZiAocGFyZW50LmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJCQkJc2V0VHJhbnNsYXRvcihwYXJlbnQuZ2V0VHJhbnNsYXRvcigpLmZpbmRDaGlsZChub2RlTmFtZSwgcGFyZW50LmdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKSk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlzZXRUcmFuc2xhdG9yKHBhcmVudC5nZXRUcmFuc2xhdG9yKCkpOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLnRyYW5zbGF0b3IgPT0gbnVsbCkgewotCQkJCQkvKiBPdXIgdHJhbnNsYXRvciBpcyBudWxsISBBaGghIFJ1biEgKi8KLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyZW50IFRyYW5zbGF0b3IgKCIgKyBwYXJlbnQuZ2V0VHJhbnNsYXRvcigpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkiKSBkaWQgbm90IGZpbmQgYSBDaGlsZCBUcmFuc2xhdG9yIGZvciBcIiIgKyAvLyROT04tTkxTLTEkIAotCQkJCQkJCQlub2RlTmFtZSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWlmICh0aGlzLnRyYW5zbGF0b3IuZ2V0UmVhZEFoZWFkSGVscGVyKG5vZGVOYW1lKSA9PSBudWxsICYmICF0aGlzLnRyYW5zbGF0b3IuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCQkvKgotCQkJCQkgKiBJIGRvIG5vdCByZXF1aXJlIGEgcmVhZCBhaGVhZCBjdWUsIGFuZCBJIGFtIG5vdCBtYW5hZ2VkIGJ5IG15IHBhcmVudCBzbyBJIGNhbgotCQkJCQkgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgbXkgRU1GIG9iamVjdAotCQkJCQkgKi8KLQotCQkJCQlOb3RpZmllciBteUVtZk93bmVyID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXROb2RlTmFtZSgpLCBudWxsKTsKLQkJCQkJc2V0RW1mT3duZXIobXlFbWZPd25lcik7Ci0JCQkJCXRoaXMudHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShwYXJlbnQuZ2V0RW1mT3duZXIoKSwgbXlFbWZPd25lcik7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogRWxzZSBJIHJlcXVpcmUgYSByZWFkIGFoZWFkIHZhbHVlIG9yIEkgYW0gYmVpbmcgbWFuYWdlZCBieSBteSBwYXJlbnQsIHNvIEkgaGF2ZQotCQkJCSAqIG5vIG5lZWQgdG8gY3JlYXRlIGFuIEVNRiBvYmplY3QKLQkJCQkgKi8KLQkJCX0KLQkJCS8qCi0JCQkgKiBFbHNlIEkgYW0gbm90IG1hcHBlZCB0byB0aGUgRU1GIHN0YWNrIChYTUwgRWxlbWVudHMgZm91bmQgaW4gdGhlIERPTVBhdGggYXJlIGlnbm9yZWQpCi0JCQkgKi8KLQkJfQotCQkvKiBwcm9jZXNzQXR0cmlidXRlcyBpcyBndWFyZGVkIGFuZCB3aWxsIG5vdCBleGVjdXRlIHVubGVzcyByZWFkeSAqLwotCQlwcm9jZXNzQXR0cmlidXRlcygpOwotCi0JfQotCi0JLyoqCi0JICogY29tbWl0KCkgaXMgaW52b2tlZCBvbmx5IGlmIHRoZSBDYWNoZUV2ZW50Tm9kZSAoQ0VOTykgaGFzIGFsbCB0aGUgaW5mb3JtYXRpb24gdGhleSBuZWVkIGFuZAotCSAqIHNob3VsZCBiZSBhYmxlIHRvIGRldGVybWluZSB3aGF0IHRvIGRvIHRvIHRoZSBFTUYgZmVhdHVyZS4KLQkgKiAKLQkgKiBUaGUgY29tbWl0KCkgbWV0aG9kIHdpbGwgaW52b2tlIGRpc2NhcmQoKSB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgaXRzIHRhc2tzLCBpZiBuZWVkZWQuIFRodXMsCi0JICogYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QsIHRoZSBDRU5PIG1heSBoYXZlIG5vIG1lYW5pbmdmdWwgc3RhdGUuIElmIGRpc2NhcmQoKSBpcyBpbnZva2VkLAotCSAqIGFsbCBwcmV2aW91c2x5IGhlbGQgcmVmZXJlbmNlIHdpbGwgYmUgcmVsZWFzZWQgaW4gb3JkZXIgdG8gYmUgbWFkZSBlbGlnaWJsZSBmb3IgR2FyYmFnZQotCSAqIENvbGxlY3Rpb24uCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQotCQlpZiAocGFyZW50ID09IG51bGwgfHwgdGhpcy5pc0lnbm9yYWJsZSgpKSB7Ci0JCQlkaXNjYXJkKCk7Ci0JCQlyZWxlYXNlRnJvbUNvbnRhaW5pbmdQb29sKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkQWhlYWRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJVHJhbnNsYXRvciBhY3RpdmVUcmFuc2xhdG9yID0gZ2V0VHJhbnNsYXRvcigpOwotCQlUcmFuc2xhdG9yIHBhcmVudFRyYW5zbGF0b3IgPSBnZXRQYXJlbnQoKS5nZXRUcmFuc2xhdG9yKCk7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXRFbWZPd25lcigpID09IG51bGwpIHsKLQotCQkJLyoKLQkJCSAqIE5vdCBlbm91Z2ggaW5mb3JtYXRpb24geWV0LCBhZGQgdGhlIENhY2hlRXZlbnROb2RlIHRvIHRoZSBET00gQ2FjaGUgdHJlZQotCQkJICovCi0KLQkJCXBhcmVudC5hcHBlbmRUb0J1ZmZlcih0aGlzKTsKLQkJCWlmICgoaGVscGVyID0gZ2V0UGFyZW50KCkuZ2V0UmVhZEFoZWFkSGVscGVyKCkpICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIElmIHRoZSBwYXJlbnRSZWNvcmQncyBlbWZPd25lciBpcyBudWxsLCB0aGVuIGl0IG11c3Qgbm90IGJlIGluaXRpYWxpemVkIHRoZXJlZm9yZQotCQkJCSAqIGl0IG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIG11c3QgcmVxdWlyZSByZWFkIGFoZWFkIGNsdWVzCi0JCQkJICogCi0JCQkJICogVGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgY2hlY2tzIGlmIHRoZSBwYXJlbnQgaXMgdGhlIG5vZGUgd2FpdGluZyBmb3IgYQotCQkJCSAqIHJlYWRBaGVhZCBjdWUKLQkJCQkgKi8KLQkJCQlFT2JqZWN0IHBhcmVudE93bmVyID0gbnVsbDsKLQkJCQlpZiAoaGVscGVyLm5vZGVWYWx1ZUlzUmVhZEFoZWFkTmFtZShnZXROb2RlTmFtZSgpKSkgewotCQkJCQkvKiBUaGUgcmVhZEFoZWFkTmFtZSBpcyB0aGUgdmFsdWUgb2YgdGhlIHFOYW1lIGNoaWxkIG5vZGUgKi8KLQotCQkJCQkvKiBXZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIEVtZk93bmVyIGluIHRoZSBwYXJlbnQhICovCi0JCQkJCXBhcmVudE93bmVyID0gcGFyZW50VHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0UGFyZW50KCkuZ2V0Tm9kZU5hbWUoKSwgZ2V0QnVmZmVyKCkpOwotCi0JCQkJCS8qCi0JCQkJCSAqIE5vdyB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBjYWNoZWQgRE9NIHRyZWUgYW5kIHVwZGF0ZSB0aGUgZW1mT3duZXIgb2YgdGhlCi0JCQkJCSAqIHBhcmVudAotCQkJCQkgKi8KLQkJCQkJZ2V0UGFyZW50KCkudXBkYXRlRU1GKHBhcmVudE93bmVyKTsKLQotCQkJCX0gZWxzZSBpZiAoaGVscGVyLm5vZGVOYW1lSXNSZWFkQWhlYWROYW1lKGdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCS8qIFRoZSByZWFkQWhlYWROYW1lIGlzIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgY2hpbGQgbm9kZSAocU5hbWUpICovCi0KLQkJCQkJLyogV2UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBFbWZPd25lciBpbiB0aGUgcGFyZW50ISAqLwotCQkJCQlwYXJlbnRPd25lciA9IHBhcmVudFRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldFBhcmVudCgpLmdldE5vZGVOYW1lKCksIGdldE5vZGVOYW1lKCkpOwotCi0JCQkJCS8qCi0JCQkJCSAqIE5vdyB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBjYWNoZWQgRE9NIHRyZWUgYW5kIHVwZGF0ZSB0aGUgZW1mT3duZXIgb2YgdGhlCi0JCQkJCSAqIHBhcmVudAotCQkJCQkgKi8KLQkJCQkJZ2V0UGFyZW50KCkudXBkYXRlRU1GKHBhcmVudE93bmVyKTsKLQkJCQl9Ci0KLQkJCX0gLyogRWxzZSBhbiBhbmNlc3RvciBvZiB0aGUgcGFyZW50IGlzIHdhaXRpbmcgKi8KLQotCQl9IGVsc2UgewotCQkJaWYgKGFjdGl2ZVRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChhY3RpdmVUcmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQotCQkJCQlPYmplY3QgdmFsdWUgPSBhY3RpdmVUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGdldE5vZGVOYW1lKCksIG51bGwsIGdldEJ1ZmZlcigpLCBnZXRQYXJlbnQoKS5nZXRFbWZPd25lcigpKTsKLQkJCQkJYWN0aXZlVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShnZXRQYXJlbnQoKS5nZXRFbWZPd25lcigpLCB2YWx1ZSk7Ci0JCQkJCXByb2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlhY3RpdmVUcmFuc2xhdG9yLnNldFRleHRWYWx1ZUlmTmVjZXNzYXJ5KGdldEJ1ZmZlcigpLCBnZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlkaXNjYXJkKCk7Ci0JCQlyZWxlYXNlRnJvbUNvbnRhaW5pbmdQb29sKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0cnVjdCB0aGUgQ2FjaGVFdmVudE5vZGUgdG8gZGlzY2FyZCBhbGwgcmVmZXJlbmNlcyB0byBtYWtlIGV2ZXJ5dGhpbmcgZWxpZ2libGUgZm9yIGdhcmJhZ2UKLQkgKiBjb2xsZWN0aW9uLiBUaGlzIHNob3VsZCBPTkxZIGJlIGNhbGxlZCBhZnRlciBjb21taXQgaGFzIHN1Y2NlZWRlZC4gSW4gdGhlIGNhc2Ugb2YgRU1GCi0JICogZmVhdHVyZXMgdGhhdCByZXF1aXJlIGEgcmVhZEFoZWFkTmFtZSwgcHJvY2VzcyBub3QgYmUgY29tcGxldGVkIGluIGNvbW1pdCgpLCBidXQgcmF0aGVyIHdpbGwKLQkgKiBiZSBkZWZlcmVkIHRvIHRoZSB1cGRhdGVFTUYoKSBtZXRob2QuIFRoaXMgbWV0aG9kIHdhcyBtYWRlIHByaXZhdGUgc3BlY2lmaWNhbGx5IGJlY2F1c2UgaXQKLQkgKiBjb3VsZCBlcmFzZSBhbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBDYWNoZUV2ZW50Tm9kZSBiZWZvcmUgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzY2FyZCgpIHsKLQkJdHJhbnNsYXRvciA9IG51bGw7Ci0JCWVtZk93bmVyID0gbnVsbDsKLQkJYnVmZmVyID0gbnVsbDsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpCi0JCQljaGlsZHJlbi5jbGVhcigpOwotCQljaGlsZHJlbiA9IG51bGw7Ci0JCWF0dHJpYnV0ZXMgPSBudWxsOwotCQlwYXJlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlRnJvbUNvbnRhaW5pbmdQb29sKCkgewotCQlpZiAoY29udGFpbmluZ1Bvb2wgIT0gbnVsbCkKLQkJCWNvbnRhaW5pbmdQb29sLnJlbGVhc2VOb2RlKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKCkgewotCQlpZiAoaWdub3JhYmxlID09IG51bGwpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAodGhpcy50cmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlpZiAodGhpcy50cmFuc2xhdG9yLmlzRW1wdHlDb250ZW50U2lnbmlmaWNhbnQoKSkgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgZG9tUGF0aCA9IHRoaXMudHJhbnNsYXRvci5nZXRET01QYXRoKCk7Ci0JCQkJCXJlc3VsdCA9IChkb21QYXRoICE9IG51bGwpID8gZG9tUGF0aC5pbmRleE9mKHRoaXMubm9kZU5hbWUpID49IDAgOiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZ25vcmFibGUgPSByZXN1bHQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBpZ25vcmFibGUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGNoaWxkIGhhcyBhIHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIGNoaWxkTm9kZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IFhNTCBjaGlsZCBub2RlCi0JICogQHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGNoaWxkTm9kZU5hbWUgY2FuIGJlIGlnbm9yZWQgKGUuZy4gaXQgaXMgcGFydCBvZiB0aGUgRE9NIFBhdGgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZElnbm9yYWJsZShTdHJpbmcgY2hpbGROb2RlTmFtZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCVRyYW5zbGF0b3IgY2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKLQkJaWYgKHRoaXMuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKLQkJCWNoaWxkVHJhbnNsYXRvciA9IHRoaXMuZ2V0VHJhbnNsYXRvcigpLmZpbmRDaGlsZChjaGlsZE5vZGVOYW1lLCB0aGlzLmdldEVtZk93bmVyKCksIHRoaXMuZ2V0VmVyc2lvbklEKCkpOwotCi0JCQlpZiAoY2hpbGRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGRUcmFuc2xhdG9yLmlzRW1wdHlDb250ZW50U2lnbmlmaWNhbnQoKSkgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgdGVtcCA9IG51bGw7Ci0JCQkJCXJlc3VsdCA9ICgodGVtcCA9IGNoaWxkVHJhbnNsYXRvci5nZXRET01QYXRoKCkpICE9IG51bGwpID8gdGVtcC5pbmRleE9mKGNoaWxkTm9kZU5hbWUpID49IDAgOiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5ET01QYXRoKCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmICh0aGlzLmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7Ci0KLQkJCXJlc3VsdCA9IHRoaXMuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModGhpcy5nZXRUcmFuc2xhdG9yKCkuZ2V0RE9NUGF0aCgpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoIkNhY2hlRXZlbnROb2RlWyIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCgibm9kZU5hbWU9Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKG5vZGVOYW1lKTsKLQkJb3V0cHV0LmFwcGVuZCgiOyB0cmFuc2xhdG9yPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCh0cmFuc2xhdG9yKTsKLQkJb3V0cHV0LmFwcGVuZCgiOyBlbWZPd25lcj0iKTsvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlvdXRwdXQuYXBwZW5kKGVtZk93bmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJb3V0cHV0LmFwcGVuZCgiQ291bGQgbm90IHJlbmRlciBhcyBzdHJpbmchIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW91dHB1dC5hcHBlbmQoIjsgYnVmZmVyPSIpOy8vJE5PTi1OTFMtMSQKLQkJb3V0cHV0LmFwcGVuZCh0aGlzLmJ1ZmZlcik7Ci0JCW91dHB1dC5hcHBlbmQoIjsgaGFzQ2hpbGRyZW49Iik7Ly8kTk9OLU5MUy0xJAotCQlvdXRwdXQuYXBwZW5kKChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLnNpemUoKSA+IDApKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCW91dHB1dC5hcHBlbmQoIlxuXHRjaGlsZHJlbigiKTsvLyROT04tTkxTLTEkCi0JCQkJb3V0cHV0LmFwcGVuZChpKTsKLQkJCQlvdXRwdXQuYXBwZW5kKCIpOiAiKTsvLyROT04tTkxTLTEkCi0JCQkJb3V0cHV0LmFwcGVuZCh0aGlzLmNoaWxkcmVuLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJb3V0cHV0LmFwcGVuZCgiXSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG91dHB1dC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIEVNRiBtb2RlbCBieSBjcmVhdGluZyBFTUYgRmVhdHVyZXMgYXMgbmVjZXNzYXJ5IGZyb20gdGhlIERPTSBUcmVlIENhY2hlCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRU1GKEVPYmplY3Qgb3duZXIpIHsKLQkJdGhpcy5zZXRFbWZPd25lcihvd25lcik7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoKEVPYmplY3QpIHRoaXMucGFyZW50LmdldEVtZk93bmVyKCksIG93bmVyKTsKLQkJCXRoaXMucHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJfQotCi0JCXRoaXMudXBkYXRlRU1GKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRyYW5zbGF0b3IgYW5kIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IENFTk8gcGFzc2VkIHRvIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBub25udWxsCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRU1GKCkgewotCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNhY2hlRXZlbnROb2RlIGNoaWxkID0gbnVsbDsKLQkJVHJhbnNsYXRvciBjaGlsZFRyYW5zbGF0b3IgPSBudWxsOwotCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQlpZiAodGhpcy5nZXRFbWZPd25lcigpICE9IG51bGwpIHsKLQkJCU5vdGlmaWVyIHBhcmVudE93bmVyID0gdGhpcy5nZXRFbWZPd25lcigpOwotCQkJVHJhbnNsYXRvciBwYXJlbnRUcmFuc2xhdG9yID0gdGhpcy5nZXRUcmFuc2xhdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQotCQkJCWNoaWxkID0gKENhY2hlRXZlbnROb2RlKSB0aGlzLmNoaWxkcmVuLmdldChpKTsgLyogQ3JlYXRlIHRoZSBFTUYgZmVhdHVyZSAqLwotCQkJCWlmICh0aGlzLmlzQ2hpbGRJZ25vcmFibGUoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJdGhpcy5hZGRDaGlsZHJlbihjaGlsZC5nZXRDaGlsZHJlbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGlsZFRyYW5zbGF0b3IgPSBwYXJlbnRUcmFuc2xhdG9yLmZpbmRDaGlsZChjaGlsZC5nZXROb2RlTmFtZSgpLCBwYXJlbnRPd25lciwgY2hpbGQuZ2V0VmVyc2lvbklEKCkpOwotCQkJCQljaGlsZC5zZXRUcmFuc2xhdG9yKGNoaWxkVHJhbnNsYXRvcik7Ci0KLQkJCQkJdmFsdWUgPSBjaGlsZFRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUoY2hpbGQuZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgY2hpbGQuZ2V0QnVmZmVyKCksIHBhcmVudE93bmVyKTsKLQkJCQkJY2hpbGRUcmFuc2xhdG9yLnNldE1PRlZhbHVlKHBhcmVudE93bmVyLCB2YWx1ZSk7Ci0KLQkJCQkJaWYgKGNoaWxkVHJhbnNsYXRvci5pc09iamVjdE1hcCgpKSB7Ci0JCQkJCQljaGlsZC5zZXRFbWZPd25lcigoTm90aWZpZXIpIHZhbHVlKTsKLQkJCQkJCWNoaWxkVHJhbnNsYXRvci5zZXRUZXh0VmFsdWVJZk5lY2Vzc2FyeShjaGlsZC5nZXRCdWZmZXIoKSwgY2hpbGQuZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpOwotCQkJCQl9Ci0KLQkJCQkJY2hpbGQucHJvY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJCQkJY2hpbGQudXBkYXRlRU1GKCk7IC8qIHVwZGF0ZSB0aGUgRU1GIG9mIHRoZSBjaGlsZCAqLwotCi0JCQkJfQotCQkJCWNoaWxkLmRpc2NhcmQoKTsKLQkJCQljaGlsZC5yZWxlYXNlRnJvbUNvbnRhaW5pbmdQb29sKCk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKENhY2hlRXZlbnROb2RlIGNoaWxkKSB7Ci0JCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHRoaXMuaXNJZ25vcmFibGUoKSkgewotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKExpc3QgY2hpbGRyZW5BcmcpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQl0aGlzLmNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbkFyZyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQ2hpbGQoQ2FjaGVFdmVudE5vZGUgY2hpbGQpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIgZ2V0UmVhZEFoZWFkSGVscGVyKCkgewotCQlpZiAodGhpcy50cmFuc2xhdG9yICE9IG51bGwgJiYgdGhpcy50cmFuc2xhdG9yLmhhc1JlYWRBaGVhZE5hbWVzKCkpIHsKLQkJCXJldHVybiB0cmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihub2RlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGZvciBpbmZvIG9uIGhvdyBpdCBpcyBzdHJ1Y3R1cmVkICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHIpIHsKLQotCQkvKgotCQkgKiBUaGUgYXR0cmlidXRlcyByZXR1cm5lZCBmcm9tIHRoZSBwYXJzZXIgbWF5IGJlIHN0b3JlZCBieSByZWZlcmVuY2UsIHNvIHdlIG11c3QgY29weSB0aGVtCi0JCSAqIG92ZXIgdG8gYSBsb2NhbCBkYXRhIHN0b3JlCi0JCSAqLwotCQlpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCWlmICh0aGlzLmF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJCXRoaXMuYXR0cmlidXRlcyA9IG5ldyBTdHJpbmdbYXR0ci5nZXRMZW5ndGgoKSAqIDJdOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXNbaV0gPSBhdHRyLmdldFFOYW1lKGkpOwotCQkJCXRoaXMuYXR0cmlidXRlc1tpICsgYXR0ci5nZXRMZW5ndGgoKV0gPSBhdHRyLmdldFZhbHVlKGkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcm9jZXNzQXR0cmlidXRlcyBtYXkgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lcy4gSXQgaXMgY29uZmlndXJlZCB0byBvbmx5IGNhcnJ5IG91dCB0aGUKLQkgKiBwcm9jZXNzaW5nIG9uZSB0aW1lLiBBZnRlciBpdCBzdWNjZXNzZnVsbHkgY29tcGxldGVzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgVHJhbnNsYXRvcnMgYW5kCi0JICogdmFsdWVzIGl0IHdpbGwgZGlzY2FyZCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZXMgZmllbGQgYnkgc2V0dGluZyBpdCB0byBudWxsLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzQXR0cmlidXRlcygpIHsKLQkJLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXR0cmlidXRlcyBmaWVsZCBmb3IgaW5mbyBvbiBob3cgaXQgaXMgc3RydWN0dXJlZCAqLwotCQlpZiAodGhpcy5hdHRyaWJ1dGVzICE9IG51bGwgJiYgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHsKLQotCQkJaWYgKHRoaXMuZW1mT3duZXIgIT0gbnVsbCAmJiB0aGlzLnRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkJCVRyYW5zbGF0b3IgYXR0clRyYW5zbGF0b3IgPSBudWxsOwotCQkJCWZpbmFsIGludCBsaW1pdCA9IHRoaXMuYXR0cmlidXRlcy5sZW5ndGggLyAyOwotCQkJCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7Ci0KLQkJCQkJLyogRmluZCB0aGUgYXR0cmlidXRlIHRyYW5zbGF0b3IgYnkgdXNpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lIChhdHRyaWJ1dGVzW2ldKSAqLwotCQkJCQlhdHRyVHJhbnNsYXRvciA9IHRoaXMudHJhbnNsYXRvci5maW5kQ2hpbGQodGhpcy5hdHRyaWJ1dGVzW2ldLCB0aGlzLmVtZk93bmVyLCB0aGlzLnZlcnNpb25JRCk7Ci0KLQkJCQkJaWYgKGF0dHJUcmFuc2xhdG9yICE9IG51bGwpIHsKLQotCQkJCQkJLyoKLQkJCQkJCSAqIENvbnZlcnQgdGhlIHZhbHVlIG9mIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIHZhbHVlIChhdHRyaWJ1dGVzW2krbGltaXRdKQotCQkJCQkJICogdG8gYSBtZWFuaW5nZnVsIHZhbHVlCi0JCQkJCQkgKi8KLQkJCQkJCXZhbHVlID0gYXR0clRyYW5zbGF0b3IuY29udmVydFN0cmluZ1RvVmFsdWUodGhpcy5hdHRyaWJ1dGVzW2kgKyBsaW1pdF0sIChFT2JqZWN0KSB0aGlzLmVtZk93bmVyKTsKLQkJCQkJCWF0dHJUcmFuc2xhdG9yLnNldE1PRlZhbHVlKChFT2JqZWN0KSB0aGlzLmVtZk93bmVyLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvKiBGb3JnZXQgdGhlIGF0dHJpYnV0ZXMgc28gd2UgZG8gbm90IHByb2Nlc3MgdGhlbSBhZ2FpbiAqLwotCQkJCXRoaXMuYXR0cmlidXRlcyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIGRhdGEgdG8gdGhlIGJ1ZmZlciBzdG9yZWQgYnkgdGhpcyBDRU5PLiBUZXh0IHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGRhdGEgYXJyYXkKLQkgKiBiZWdpbmluZyBhdCBwb3NpdGlvbmcgPGk+c3RhcnQgPC9pPiBhbmQgZW5kaW5nIGF0IHBvc2l0aW9uIDxpPnN0YXJ0K2xlbmd0aCA8L2k+LgotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRvQnVmZmVyKGNoYXJbXSBkYXRhLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgdGhpcy5pc0lnbm9yYWJsZSgpKSB7Ci0JCQlwYXJlbnQuYXBwZW5kVG9CdWZmZXIoZGF0YSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0KLQkJLyoKLQkJICogYWN0cyBhcyBhIG1vcmUgZWZmaWNpZW50IGZvcm0gb2YgImFwcGVuZCIuIFVzaW5nIHRoaXMgbWV0aG9kIGF2b2lkcyB0aGUgbmVlZCB0byBjb3B5IHRoZQotCQkgKiBkYXRhIGludG8gaXRzIG93biBkYXRhIHN0cnVjdHVyZSAoZS5nLiBTdHJpbmcpIGJlZm9yZSBiZWluZyBhZGRlZCB0byB0aGUgYnVmZmVyCi0JCSAqLwotCQl0aGlzLmJ1ZmZlci5pbnNlcnQoYnVmZmVyLmxlbmd0aCgpLCBkYXRhLCBzdGFydCwgbGVuZ3RoKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gQ0VOTyBhcyBhIGNoaWxkIG9mIHRoaXMgQ0VOTy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVjb3JkCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kVG9CdWZmZXIoQ2FjaGVFdmVudE5vZGUgcmVjb3JkKSB7Ci0KLQkJdGhpcy5hZGRDaGlsZChyZWNvcmQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyKCkgewotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIE5vdGlmaWVyIGdldEVtZk93bmVyKCkgewotCQlyZXR1cm4gZW1mT3duZXI7Ci0JfQotCi0JcHVibGljIENhY2hlRXZlbnROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KENhY2hlRXZlbnROb2RlIHJlY29yZCkgewotCQl0aGlzLnBhcmVudCA9IHJlY29yZDsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2xhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVtZk93bmVyKE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0KLQkJdGhpcy5lbWZPd25lciA9IG5vdGlmaWVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMudHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbklEKCkgewotCi0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKFRyYW5zbGF0b3JSZXNvdXJjZSkgdGhpcy5nZXRFbWZPd25lcigpKS5nZXRWZXJzaW9uSUQoKTsKLQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLnZlcnNpb25JRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpIHsKLQkJdmVyc2lvbklEID0gaTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRQb29sLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc5OWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKiBQcm92aWRlcyBhbiBpbnN0YW5jZSBwb29sIG9mIHJldXNhYmxlIENhY2hlRXZlbnROb2Rlcy4gVGhlIHBvb2wgd2lsbCBkZWZhdWx0IHRvIDEwIGxpdmUKLSAqIGluc3RhbmNlcy4gV2hlbiBpdHMgYXZhaWxhYmxlIGluc3RhbmNlcyByZWFjaCBmaXZlIHRpbWVzIGl0cyBpbml0aWFsIGNhcGFjaXR5LCBpdCB3aWxsIHNocmluawotICogaXRzZWxmIGRvd24gdG8gdGhlIGluaXRpYWwgY2FwYWNpdHkuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFdmVudFBvb2wgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFlfSU5DUkVNRU5UID0gMjU7Ci0KLQlwcml2YXRlIGludCBwb29sQ2FwYWNpdHkgPSBERUZBVUxUX0NBUEFDSVRZOwotCXByaXZhdGUgQ2FjaGVFdmVudFN0YWNrIGF2YWlsYWJsZVBvb2wgPSBudWxsOwotCXByaXZhdGUgQ29sbGVjdGlvbiBpbnVzZVBvb2wgPSBudWxsOwotCi0JcHVibGljIENhY2hlRXZlbnRQb29sKCkgewotCQl0aGlzKERFRkFVTFRfQ0FQQUNJVFkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIENhY2hlRXZlbnRQT29sIHdpdGggdGhlIGdpdmVuIGluaXRpYWwgY2FwYWNpdHkKLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5Ci0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnN0YW5jZXMgdG8gY3JlYXRlLgotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50UG9vbChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXBvb2xDYXBhY2l0eSA9IChpbml0aWFsQ2FwYWNpdHkgPiAwKSA/IGluaXRpYWxDYXBhY2l0eSA6IERFRkFVTFRfQ0FQQUNJVFk7Ci0JCWF2YWlsYWJsZVBvb2wgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7Ci0JCWludXNlUG9vbCA9IG5ldyBBcnJheUxpc3QocG9vbENhcGFjaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBDYWNoZUV2ZW50Tm9kZSAoQ0VOTykgaW5pdGlhbGl6ZWQgdG8gdXNlIHRoZSBnaXZlbiByZXNvdXJjZSBhcyBpdHMgRU1GIE93bmVyLgotCSAqIAotCSAqIFRISVMgTUVUSE9EIFNIT1VMRCBPTkxZIEJFIFVTRUQgVE8gQ1JFQVRFIFJPT1QgTk9ERVMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZAotCSAqIEByZXR1cm4gYSBDYWNoZUV2ZW50Tm9kZSB0byBzZXJ2ZSBhcyB0aGUgcm9vdC4KLQkgKi8KLQlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgY3JlYXRlQ2FjaGVFdmVudE5vZGUoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7Ci0JCUNhY2hlRXZlbnROb2RlIGFkYXB0ZXIgPSBmZXRjaEZyZWVOb2RlKCk7Ci0JCWFkYXB0ZXIuaW5pdChyZXNvdXJjZSk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjaGlsZCBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSB0aGF0IHdpbGwgYnJhbmNoIGZyb20gdGhlIGdpdmVuIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBDRU5PCi0JICogQHBhcmFtIG5vZGVOYW1lCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIFhNTCBlbGVtZW50IG5vZGUgbmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBUaGUgYXR0cmlidXRlcyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgZ2l2ZW4gWE1MIGVsZW1lbnQKLQkgKiBAcmV0dXJuIEEgQ0VOTyB0aGF0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBjcmVhdGVDYWNoZUV2ZW50Tm9kZShDYWNoZUV2ZW50Tm9kZSBwYXJlbnQsIFN0cmluZyBub2RlTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCUNhY2hlRXZlbnROb2RlIGFkYXB0ZXIgPSBmZXRjaEZyZWVOb2RlKCk7Ci0JCWFkYXB0ZXIuaW5pdChwYXJlbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSB0aGUgQ2FjaGVFdmVudE5vZGUgQ0VOTyBiYWNrIHRvIHRoZSBwb29sIG9mIGF2YWlsYWJlIGluc3RhbmNlcy4gVGhpcyBtZXRob2Qgc2hvdWxkCi0JICogbm90IGJlIGludm9rZWQgZGlyZWN0bHkuIENFTk9zIHdoaWNoIGFyZSBhY3F1aXJlZCBmcm9tIGEgZ2l2ZW4gcG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkKLQkgKiByZWxlYXNlIHRoZW1zZWx2ZXMgd2hlbiBuZWNlc3NhcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlTm9kZShDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7Ci0JCWZyZWVOb2RlKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIGZyZWV6ZVBvb2woKSBzaG91bGQgYmUgaW52b2tlZCB0byBmcmVlIGFueSB1bnVzZWQgcmVzb3VyY2VzLiBBZnRlciBmcmVlemVQb29sIGhhcyBiZWVuCi0JICogaW52b2tlZCwgd2FybVBvb2woKSB3aWxsIG5lZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgdGhlIHBvb2wgY2FuIGJlIHVzZWQgYWdhaW4uCi0JICogIAotCSAqLwotCXB1YmxpYyB2b2lkIGZyZWV6ZVBvb2woKSB7Ci0JCWF2YWlsYWJsZVBvb2wuY2xlYXIoKTsKLQkJYXZhaWxhYmxlUG9vbCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogd2FybVBvb2woKSBtdXN0IGJlIGludm9rZWQgdG8gbm90aWZ5IHRoZSBwb29sIGl0IGlzIGFib3V0IHRvIGJlIHVzZWQuIFRoaXMgc2hvdWxkIG9jY3VyIG9ubHkKLQkgKiBvbmNlIHBlciBkb2N1bWVudCByZW5kZXJpbmcuIFVudGlsIHRoZSBwb29sIGlzIGluIHVzZSwgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlCi0JICogQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgaW4gb3JkZXIgdG8gbGltaXQgdGhlIHNpemUgb2YgdGhlIGluLW1lbW9yeSBmb290cHJpbnQgb2YgdGhlCi0JICogRU1GMlNBWFdyaXRlci4KLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgd2FybVBvb2woKSB7Ci0JCWVuc3VyZU1pbmltdW1DYXBhY2l0eSgpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVFdmVudE5vZGUgZmV0Y2hGcmVlTm9kZSgpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAoYXZhaWxhYmxlUG9vbCA9PSBudWxsIHx8IGF2YWlsYWJsZVBvb2wuaXNFbXB0eSgpKQotCQkJd2FybVBvb2woKTsKLQotCQlyZXN1bHQgPSBhdmFpbGFibGVQb29sLnBvcCgpOwotCQlpbnVzZVBvb2wuYWRkKHJlc3VsdCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZnJlZU5vZGUoQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgewotCQlpZiAoaW51c2VQb29sLnJlbW92ZShhZGFwdGVyKSkKLQkJCWF2YWlsYWJsZVBvb2wucHVzaChhZGFwdGVyKTsKLQkJLy9lbHNlCi0JCS8vCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFkYXB0ZXIgbm90IGNvbnRhaW5lZCBpbiBwb29sISIpOwotCQlpZiAoYXZhaWxhYmxlUG9vbC5zaXplKCkgPiAoNSAqIHBvb2xDYXBhY2l0eSkpIHsKLQkJCWF2YWlsYWJsZVBvb2wuY2xlYXIoKTsKLQkJCWVuc3VyZU1pbmltdW1DYXBhY2l0eSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZU1pbmltdW1DYXBhY2l0eSgpIHsKLQkJaWYgKGF2YWlsYWJsZVBvb2wgPT0gbnVsbCkgewotCQkJYXZhaWxhYmxlUG9vbCA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKLQkJfQotCQlpZiAoYXZhaWxhYmxlUG9vbC5zaXplKCkgPCBwb29sQ2FwYWNpdHkpIHsKLQkJCWZpbmFsIGludCBtaW5pbXVtQ2FwYWNpdHkgPSBwb29sQ2FwYWNpdHkgLSBhdmFpbGFibGVQb29sLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWluaW11bUNhcGFjaXR5OyBpKyspCi0JCQkJYXZhaWxhYmxlUG9vbC5wdXNoKG5ldyBDYWNoZUV2ZW50Tm9kZSh0aGlzKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y0MTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjQsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIHVuc3luY2hyb25pemVkIGltcGxlbWVudGF0aW9uIG9mIGEgU3RhY2sgKExJRk8pIGRhdGEgc3RydWN0dXJlLiBObyBjYXN0aW5nIGlzIHJlcXVpcmVkIHdoZW4KLSAqIHVzaW5nIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFdmVudFN0YWNrIGV4dGVuZHMgQXJyYXlMaXN0IHsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBwZWVrKCkgewotCQlpZiAoc2l6ZSgpID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCi0JCXJldHVybiAoQ2FjaGVFdmVudE5vZGUpIGdldChzaXplKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZW1vdmluZyBpdAotCSAqLwotCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBwb3AoKSB7Ci0JCWlmIChzaXplKCkgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0KLQkJcmV0dXJuIChDYWNoZUV2ZW50Tm9kZSkgcmVtb3ZlKHNpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICBBIENFTk8gdG8gcHVzaCBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgcHVzaChDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7Ci0JCWFkZChhZGFwdGVyKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNjdjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgbWFwcGluZ3MgZm9yIGEgcGFja2FnZSBwcmVmaXggdG8gaXRzIGN1cnJlbnQgbmFtZXNwYWNlIFVSSS4gQWxzbywKLSAqIHRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBtYXAgdGhlIHBhY2thZ2UKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHsKLQlwdWJsaWMgc3RhdGljIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5KCk7Ci0JcHJpdmF0ZSBNYXAgcHJlZml4VG9QYWNrYWdlVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkgewotCQlyZXR1cm4gcHJlZml4VG9QYWNrYWdlVVJJczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlclByZWZpeFRvUGFja2FnZVVSSShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJcHJlZml4VG9QYWNrYWdlVVJJcy5wdXQocHJlZml4LCB1cmkpOwotCQkJcGFja2FnZVVSSXNUb1ByZWZpeGVzLnB1dCh1cmksIHByZWZpeCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjRkZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMjMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIHByZWZpeFRvUGFja2FnZVVSSXM7Ci0KLQlwcm90ZWN0ZWQgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQotCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgewotCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNmZmM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuU0FYWE1JSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIERBQkVSRwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIgZXh0ZW5kcyBTQVhYTUlIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBOVUxMX0FUVFJJQiA9IFhNTFJlc291cmNlLlhTSV9OUyArICI6bnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSB4bWlSZXNvdXJjZQotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlcihYTUxSZXNvdXJjZSB4bWlSZXNvdXJjZSwgWE1MSGVscGVyIGhlbHBlciwgTWFwIG9wdGlvbnMpIHsKLQkJc3VwZXIoeG1pUmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGFuZGxlciNpc051bGwoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTnVsbCgpIHsKLQkJYm9vbGVhbiBpc251bGwgPSBzdXBlci5pc051bGwoKTsKLQkJaWYgKCFpc251bGwpCi0JCQlpc251bGwgPSBhdHRyaWJzLmdldFZhbHVlKE5VTExfQVRUUklCKSAhPSBudWxsOwotCQlyZXR1cm4gaXNudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMzVmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXIgewotCVVSSSBkZU5vcm1hbGl6ZShVUkkgdXJpKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTdhNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbCBleHRlbmRzIFhNSUxvYWRJbXBsIHsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbCNtYWtlRGVmYXVsdEhhbmRsZXIoKQotCSAqLwotCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgU0FYV3JhcHBlcihuZXcgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTRmNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZSB7Ci0JaW50IEZPUk1BVF9FTUYxID0gMDsKLQkvKioKLQkgKiBmb3JtYXQgZm9yIE1PRjUgY29tcGF0aWJpbGl0eTsgbm90ZSB0aGF0IHRoaXMgY2FuIE5PVCBiZSB1c2VkIHdpdGggcmVzb3VyY2VzIHVzaW5ncyB0aGUKLQkgKiAicGxhdGZvcm06L3BsdWdpbiIgcHJvdG9jb2wiCi0JICovCi0JaW50IEZPUk1BVF9NT0Y1ID0gMTsKLQotCXZvaWQgYWRkT3JpZ2luYWxQYWNrYWdlVVJJKFN0cmluZyBwYWNrYWdlVXJpLCBTdHJpbmcgb3JpZ2luYWxVcmkpOwotCi0JaW50IGdldEZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4gQnkgZGVmYXVsdCBpdCBpcyBGT1JNQVRfRU1GMS4KLQkgKiAKLQkgKiBAc2VlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSNGT1JNQVRfRU1GMQotCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI0ZPUk1BVF9NT0Y1Ci0JICovCi0Jdm9pZCBzZXRGb3JtYXQoaW50IGZvcm1hdCk7Ci0KLQlib29sZWFuIHVzZXNEZWZhdWx0Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdE9iamVjdAotCSAqLwotCXZvaWQgcmVtb3ZlUHJlc2VydmluZ0lkcyhFT2JqZWN0IHJvb3RPYmplY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBiMDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxMb2FkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5JRFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCBleHRlbmRzIFhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdCA9IEZPUk1BVF9FTUYxOwotCXByb3RlY3RlZCBNYXAgb3JpZ2luYWxQYWNrYWdlVVJJcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlSURzID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUFJPVE9DT0wgPSAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTWFwcGFibGVYTUlSZXNvdXJjZUltcGwuCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCWluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGwjY3JlYXRlWE1MSGVscGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJTWFwcGVkWE1JSGVscGVyIGhlbHBlciA9IGRvQ3JlYXRlWE1MSGVscGVyKCk7Ci0JCWhlbHBlci5zZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkpOwotCQlyZXR1cm4gaGVscGVyOwotCX0KLQotCXByb3RlY3RlZCBNYXBwZWRYTUlIZWxwZXIgZG9DcmVhdGVYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGVkWE1JSGVscGVyKHRoaXMsIGdldFByZWZpeFRvUGFja2FnZVVSSXMoKSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSNnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFByZWZpeFRvUGFja2FnZVVSSXMoKSB7Ci0JCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQcmVmaXhUb1BhY2thZ2VVUklzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm90IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHNlZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSNnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpIHsKLQkJcmV0dXJuIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE9yaWdpbmFsUGFja2FnZVVSSShTdHJpbmcgcGFja2FnZVVyaSwgU3RyaW5nIG9yaWdpbmFsVXJpKSB7Ci0JCW9yaWdpbmFsUGFja2FnZVVSSXMucHV0KHBhY2thZ2VVcmksIG9yaWdpbmFsVXJpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvcm1hdCgpIHsKLQkJcmV0dXJuIGZvcm1hdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXQoaW50IGZvcm1hdCkgewotCQlpZiAoIWlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSSgpKQotCQkJdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSSgpIHsKLQkJVVJJIGFVUkkgPSBnZXRVUkkoKTsKLQotCQlyZXR1cm4gYVVSSSAhPSBudWxsICYmIFBMQVRGT1JNX1BST1RPQ09MLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmIFBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldFVSSUZyYWdtZW50KEVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKHVzZXNEZWZhdWx0Rm9ybWF0KCkpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCk7Ci0JCXJldHVybiBJRFV0aWwuZ2V0T3JBc3NpZ25JRChlT2JqZWN0LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzRGVmYXVsdEZvcm1hdCgpIHsKLQkJcmV0dXJuIGZvcm1hdCA9PSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX0VNRjE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTFNhdmUoKQotCSAqLwotCXByb3RlY3RlZCBYTUxTYXZlIGNyZWF0ZVhNTFNhdmUoKSB7Ci0JCWlmICh1c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVhNTFNhdmUoKTsKLQkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1NhdmUoT3V0cHV0U3RyZWFtLCBNYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5kb1NhdmUob3V0cHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdERlZmF1bHRPcHRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChkZWZhdWx0U2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNnZXRFT2JqZWN0QnlJRChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RU9iamVjdEJ5SUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaWRUb0VPYmplY3RNYXAuZ2V0KGlkKTsKLQkJCWlmIChlT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZU9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHVubG9hZGVkLiBUaGlzIGltcGxlbWVudGF0aW9uCi0JICoge0BsaW5rIEludGVybmFsRU9iamVjdCNlU2V0UHJveHlVUkkgc2V0c310aGUgb2JqZWN0IHRvIGJlIGEgcHJveHkgYW5kIGNsZWFycyB0aGUKLQkgKiB7QGxpbmsgI2VBZGFwdGVycyBhZGFwdGVyc30uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5sb2FkZWQoSW50ZXJuYWxFT2JqZWN0IGludGVybmFsRU9iamVjdCkgewotCQkvL292ZXJyaWRkZW4gZnJvbSB0aGUgc3VwZXIgY2xhc3M7IGNhbGwgc3VwZXIuZ2V0VVJJRnJhZ21lbnQgaW5zdGVhZCBvZiB0aGUgaW1wbGVtZW50YXRpb24KLQkJLy9hdCB0aGlzIGxldmVsLCB0byBhdm9pZCBJRCBnZW5lcmF0aW9uIGR1cmluZyB1bmxvYWQKLQkJLy9pbnRlcm5hbEVPYmplY3QuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChnZXRVUklGcmFnbWVudChpbnRlcm5hbEVPYmplY3QpKSk7Ci0JCWludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KHN1cGVyLmdldFVSSUZyYWdtZW50KGludGVybmFsRU9iamVjdCkpKTsKLQkJaW50ZXJuYWxFT2JqZWN0LmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQliYXNpY0RvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZG9Mb2FkKElucHV0U3RyZWFtLCBNYXApfSBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9Mb2FkKGlucHV0U3RyZWFtLCBvcHRpb25zKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlzZXRFbmNvZGluZyhERUZBVUxUX0VOQ09ESU5HKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewotCQlyZXR1cm4gbmV3IENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjcmVtb3ZlUHJlc2VydmluZ0lkcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmVzZXJ2aW5nSWRzKEVPYmplY3Qgcm9vdE9iamVjdCkgewotCQlzZXRQcmVzZXJ2ZUlEcyh0cnVlKTsKLQkJZ2V0Q29udGVudHMoKS5yZW1vdmUocm9vdE9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcmVzZXJ2ZUlEcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlSURzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJRHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByZXNlcnZlSURzCi0JICogICAgICAgICAgICBUaGUgcHJlc2VydmVJRHMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSURzKGJvb2xlYW4gcHJlc2VydmVJRHMpIHsKLQkJdGhpcy5wcmVzZXJ2ZUlEcyA9IHByZXNlcnZlSURzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkZXRhY2hlZEhlbHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXRhY2hlZEhlbHBlcihFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQllT2JqZWN0LmVBZGFwdGVycygpLnJlbW92ZShtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKHVzZVVVSURzKCkpIHsKLQkJCURFVEFDSEVEX0VPQkpFQ1RfVE9fSURfTUFQLnB1dChlT2JqZWN0LCBnZXRJRChlT2JqZWN0KSk7Ci0JCX0KLQotCQlpZiAoIWlzUHJlc2VydmVJRHMoKSAmJiBpZFRvRU9iamVjdE1hcCAhPSBudWxsICYmIGVPYmplY3RUb0lETWFwICE9IG51bGwpIHsKLQkJCWlkVG9FT2JqZWN0TWFwLnJlbW92ZShlT2JqZWN0VG9JRE1hcC5yZW1vdmUoZU9iamVjdCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgICAgICBpZiAoaXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeyAgICAgICAgICAgIAotICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyID09IG51bGwgJiYgIWlzTG9hZGVkKSAKLSAgICAgICAgICAgICAgICBhZGRTeW5jaHJvbml6YXRpb25Mb2FkaW5nQWRhcHRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdXBlci5sb2FkKG9wdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgICAgICB9IGNhdGNoKEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU3luY2hyb25pemF0aW9uTG9hZGluZ0FkYXB0ZXIoKSB7Ci0gICAgICAgIGlmIChSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcykgPT0gbnVsbCkKLSAgICAgICAgICAgIGVBZGFwdGVycygpLmFkZChSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGFwdGVyLmZvcmNlUmVsZWFzZSgpOwotICAgICAgICAgICAgZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FzZSAxOiBMT0FEIFJFU09VUkNFIEZST00gRElTSyB0aGlzLmlzTG9hZGVkID09IGZhbHNlIEFORCBpc0xvYWRlZCA9PQotICAgICAqIHRydWUgKHdoaWNoIG1lYW5zIHdlIGVudGVyZWQgdGhlIGxvYWQoKSBtZXRob2QsIGJ1dCBoYXZlIG5vdCBjb21wbGV0ZWQKLSAgICAgKiB0aGUgbG9hZCksIGFuZCB3ZSdyZSBsb2FkaW5nIGZyb20gYSByZXNvdXJjZSBvbiBkaXNrLCB0aGVuIHdlIGFkZCB0aGUKLSAgICAgKiBhZGFwdGVyIENhc2UgMjogUkVTT1VSQ0UgQ1JFQVRJT04gKE5PVCBBIExPQUQpIENhc2UgNDogUkVTT1VSQ0UgQ1JFQVRJT04sCi0gICAgICogVU5MT0FERUQsIE5FVyBDT05URU5UUyAoTk9UIEEgTE9BRCkgUmVzb3VyY2UgaXMgY3JlYXRlZCBidXQgbm90IGZyb20gYQotICAgICAqIHJlc291cmNlIG9uIGRpc2ssIHNvIGNvbnRlbnRzIGlzIG51bGwgQU5EIG5vdCBlbXB0eSwgc28gbm8gYWRhcHRlcjogVEhJUwotICAgICAqIElTIE5PVCBBIExPQUQgQ2FzZSAzOiBSRVNPVVJDRSBIQVMgQkVFTiBVTkxPQURFRCwgQkVJTkcgUkVMT0FERUQgRlJPTQotICAgICAqIERJU0sgQ29udGVudHMgaXMgTk9UIG51bGwsIGJ1dCBpdCBpcyBFbXB0eSBhbmQgdGhlIHJlc291cmNlIGlzIGJlaW5nCi0gICAgICogbG9hZGVkIGZyb20gZGlzay4gV2UgbXVzdCBhZGQgdGhlIGFkYXB0ZXIuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZUJlaW5nTG9hZGVkKGJvb2xlYW4gaXNMb2FkZWQpIHsKLSAgICAgICAgcmV0dXJuICghdGhpcy5pc0xvYWRlZCAmJiBpc0xvYWRlZCkgJiYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRDb250ZW50cygpCi0gICAgICovCi0gICAgcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotICAgICAgICB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNpc0xvYWRlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0gICAgICAgIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0xvYWRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgbG9hZGluZ0FkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7Ci0gICAgICAgIGlmIChsb2FkaW5nQWRhcHRlciAhPSBudWxsKSBsb2FkaW5nQWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKLSAgICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE3YmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbDsKLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbCBleHRlbmRzIFhNSVNhdmVJbXBsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChNYXAgb3B0aW9ucywgWE1MSGVscGVyIGhlbHBlciwgU3RyaW5nIGVuY29kaW5nKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGhlbHBlciwgZW5jb2RpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2luaXQoWE1MUmVzb3VyY2UsIE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRpb25zKTsKLQkJeG1pVHlwZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1ZFUl9OUywgWE1JUmVzb3VyY2UuVkVSU0lPTl9WQUxVRSk7Ci0JCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1hNTE5TLCBYTUlSZXNvdXJjZS5YTUlfVVJJKTsKLQkJRVBhY2thZ2VbXSBwYWNrYWdlcyA9IGhlbHBlci5wYWNrYWdlcygpOwotCQlTdHJpbmdCdWZmZXIgeHNpU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCQlpZiAoZGVjbGFyZVNjaGVtYUxvY2F0aW9uKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQotCQkJCUVPYmplY3Qgcm9vdCA9IEVjb3JlVXRpbC5nZXRSb290Q29udGFpbmVyKGVQYWNrYWdlKTsKLQkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEVQYWNrYWdlKSB7Ci0JCQkJCUVQYWNrYWdlIHJvb3RFUGFja2FnZSA9IChFUGFja2FnZSkgcm9vdDsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290RVBhY2thZ2UuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQlTdHJpbmcgcm9vdE5zVVJJID0gcm9vdEVQYWNrYWdlLmdldE5zVVJJKCk7Ci0JCQkJCQlpZiAodXJpID09IG51bGwgPyByb290TnNVUkkgIT0gbnVsbCA6ICF1cmkudG9TdHJpbmcoKS5lcXVhbHMocm9vdE5zVVJJKSkgewotCQkJCQkJCWRlY2xhcmVYU0kgPSB0cnVlOwotCQkJCQkJCWlmICh4c2lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZCgnICcpOwotCQkJCQkJCX0KLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQocm9vdE5zVVJJKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoJyAnKTsKLQkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoaGVscGVyLmdldEhSRUYocm9vdEVQYWNrYWdlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVjbGFyZVhTSSkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfWE1MTlMsIFhNTFJlc291cmNlLlhTSV9VUkkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgewotCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKLQkJCS8vTW9kaWZpZWQgZnJvbSBzdXBlcmNsYXNzIC0gZGlzcGF0Y2ggYmFjayB0byBoZWxwZXIgZm9yIGNvbXBhdGliaWxpdHkKLQkJCS8vU3RyaW5nIG5zVVJJID0gZVBhY2thZ2UuZ2V0TnNVUkkoKTsKLQkJCS8vU3RyaW5nIG5zUHJlZml4ID0gZVBhY2thZ2UuZ2V0TnNQcmVmaXgoKTsKLQkJCVN0cmluZ1tdIG5zSW5mbyA9ICgoTWFwcGVkWE1JSGVscGVyKSBoZWxwZXIpLmdldE5TSW5mbyhlUGFja2FnZSk7Ci0JCQlkb2MuYWRkQXR0cmlidXRlTlMoWE1MUmVzb3VyY2UuWE1MX05TLCBuc0luZm9bMF0sIG5zSW5mb1sxXSk7Ci0JCX0KLQotCQlpZiAoeHNpU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgewotCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfU0NIRU1BX0xPQ0FUSU9OLCB4c2lTY2hlbWFMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVIcmVmKEVPYmplY3QgcmVtb3RlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgewotCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOwotCQlpZiAoaHJlZiAhPSBudWxsKSB7Ci0JCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKLQotCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCS8vQ2hhbmdlZCBuZXh0IGxpbmUgdG8gYWx3YXlzIHdyaXRlIHR5cGUgaWYgZXhwZWN0ZWRUeXBlCi0JCQkvL2lzIGRpZmZlcmVudCBmcm9tIGVDbGFzcwotCQkJaWYgKGVDbGFzcyAhPSBleHBlY3RlZFR5cGUpIHsKLQkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOwotCQkJfQotCi0JCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOwotCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2ZjEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIG51bGwsIERPTV9BVFRSSUJVVEUpOwotCQl0aGlzLmF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWJjZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAyMCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpOwotCi0JcHVibGljIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBkb21OYW1lICE9IG51bGwgJiYgZG9tTmFtZS5zdGFydHNXaXRoKFhNTE5TKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2FjY2VwdHMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKSB7Ci0JCXJldHVybiBub3RpZi5nZXRGZWF0dXJlKCkgPT0gTmFtZXNwYWNlQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkjY3JlYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKFN0cmluZyBkb21OYW1lKSB7Ci0JCXJldHVybiBuZXcgTmFtZXNwYWNlVHJhbnNsYXRvcihkb21OYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGUoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbmFtZXNwYWNlcyA9IE5hbWVzcGFjZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygoRU9iamVjdCkgdGFyZ2V0KTsKLQkJaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCB8fCBuYW1lc3BhY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QobmFtZXNwYWNlcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdC5hZGQoY3JlYXRlKChOYW1lc3BhY2UpIG5hbWVzcGFjZXMuZ2V0KGkpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZikgewotCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBub3RpZi5nZXROZXdWYWx1ZSgpOwotCQlyZXR1cm4gY3JlYXRlKG5zKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zbGF0b3IgY3JlYXRlKE5hbWVzcGFjZSBucykgewotCQlyZXR1cm4gbmV3IE5hbWVzcGFjZVRyYW5zbGF0b3IoWE1MTlMgKyBucy5nZXRQcmVmaXgoKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDFjNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVwZW5kZW5jeVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRGVwZW5kZW50RmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCQlkZXBlbmRlbmN5RmVhdHVyZSA9IGFEZXBlbmRlbnRGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKEVPYmplY3QgcGFyZW50KSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QocGFyZW50KTsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlQ2hpbGQocGFyZW50KTsKLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCi0JcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlQ2hpbGQoRU9iamVjdCBwYXJlbnQpIHsKLQkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUVNRk9iamVjdChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JCXBhcmVudC5lU2V0KGRlcGVuZGVuY3lGZWF0dXJlLCBjaGlsZCk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewotCQkvL3JldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihnZXRDaGlsZChtb2ZPYmplY3QpKTsKLQkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TU9GVmFsdWUoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvL3N1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlKTsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSwgdmFsdWUsIC0xKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKLQkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoKEVPYmplY3QpIG93bmVyKSwgdmFsdWUsIG5ld0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXN1cGVyLnJlbW92ZU1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5pc1NldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJc3VwZXIudW5TZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5mZWF0dXJlRXhpc3RzKGdldENoaWxkKGVtZk9iamVjdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewotCQlzdXBlci5jbGVhckxpc3QoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4MmVhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVNRjJET01BZGFwdGVyIGV4dGVuZHMgQWRhcHRlciB7Ci0KLQotCUNsYXNzIEFEQVBURVJfQ0xBU1MgPSBFTUYyRE9NQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG5vZGUgdGhhdCB0aGUgdGFyZ2V0IG9mIHRoaXMgYWRhcHRlciBtYXBzIHRvLiBJZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgbWFwcyB0bwotCSAqIG1vcmUgdGhhbiBvbmUgRE9NIG5vZGUsIHRoaXMgbm9kZSBpcyB0aGUgdG9wLW1vc3Qgbm9kZS4KLQkgKi8KLQlOb2RlIGdldE5vZGUoKTsKLQotCXZvaWQgc2V0Tm9kZShOb2RlIGFOb2RlKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0Jdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIERPTSB0cmVlIGZvciB0aGlzIGFkYXB0ZXIgZnJvbSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIE1PRiBPYmplY3QuIFRoaXMgbWV0aG9kCi0JICogdXBkYXRlcyBBTEwgdGhlIERPTSBub2RlcyBmcm9tIGFsbCB0aGUgTU9GIGF0dHJpYnV0ZXMuCi0JICovCi0Jdm9pZCB1cGRhdGVET00oKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIE1PRiBPYmplY3QgZnJvbSB0aGUgRE9NIHRyZWUuIEFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIERPTSB0cmVlIGFyZSB1cGRhdGVkIGludG8KLQkgKiB0aGUgTU9GIG9iamVjdC4KLQkgKi8KLQl2b2lkIHVwZGF0ZU1PRigpOwotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCk7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KTsKLQotCUVPYmplY3QgZ2V0RU9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCWJvb2xlYW4gaXNNT0ZQcm94eSgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBET00gYWRhcHRlcnMgZnJvbSB0aGUgbm9kZSBBTkQgYWxsIGl0cyBjaGlsZCBub2RlcywgcmVjdXJzaXZlbHkuCi0JICovCi0Jdm9pZCByZW1vdmVBZGFwdGVycyhOb2RlIG5vZGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01BZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmU2ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXRvb2xzQ29weVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5TdHJpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5UcmFuc2xhdG9yU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NQWRhcHRlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEVNRjJET01BZGFwdGVyIHsKLQotCWZpbmFsIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBmRGVidWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGZOb3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBOb2RlIGZOb2RlOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTVJlbmRlcmVyIGZSZW5kZXJlcjsKLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRUcmFuc2xhdG9yczsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdCA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STSA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTUlVOTklORyA9ICJpc1J1bm5pbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIERlcGVuZGVuY3lBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCB7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAiRU1GMkRPTURlcGVuZGVuY3lBZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJRU1GMkRPTUFkYXB0ZXJJbXBsLnRoaXMubm90aWZ5Q2hhbmdlZChtc2cpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBLRVkuZXF1YWxzKHR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHJvb3QgYWRhcHRlcnMuCi0JICovCi0JcHVibGljIEVNRjJET01BZGFwdGVySW1wbChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIERvY3VtZW50IGRvY3VtZW50LCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzKChOb3RpZmllcikgcmVzb3VyY2UsIChOb2RlKSBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCQlpc1Jvb3QgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBBZGFwdGVyIGdpdmVuIGFuIEVPYmplY3QgYW5kIGEgbm9kZQotCSAqLwotCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoTm90aWZpZXIgb2JqZWN0LCBOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRhcmdldChvYmplY3QpOwotCQlmTm9kZSA9IG5vZGU7Ci0JCWZSZW5kZXJlciA9IHJlbmRlcmVyOwotCQlmVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCWluaXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWFkZEVNRkFkYXB0ZXIoKTsKLQkJYWRkRE9NQWRhcHRlcigpOwotCQlhZGREZXBlbmRlbmN5QWRhcHRlcklmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZnJvbSBhIERPTSBOb2RlLiBUaGUgRU9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOwotCQlzZXRUYXJnZXRGcm9tTm9kZSgpOwotCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCQlhZGRFTUZBZGFwdGVyKCk7Ci0JCWFkZERPTUFkYXB0ZXIoKTsKLQkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFmVHJhbnNsYXRvci5pc0RlcGVuZGVuY3lQYXJlbnQoKSkKLQkJCXJldHVybjsKLQkJRU9iamVjdCBjaGlsZCA9IGZUcmFuc2xhdG9yLmJhc2ljR2V0RGVwZW5kZW5jeU9iamVjdChnZXRFT2JqZWN0KCkpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCWFkZERlcGVuZGVuY3lBZGFwdGVyKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2hpbGRUcmFuc2xhdG9ycygpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBpc1J1bm5pbmcgPSBmYWxzZTsgLy9pcyB0aGUgT1NHSSBwbGF0Zm9ybSBydW5uaW5nID8KLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBQbGF0Zm9ybSBjbGFzcyBjYW4gYmUgZm91bmQsIHRoZW4gY29udGludWUgdG8gY2hlY2sgaWYgdGhlIE9TR0kgcGxhdGZvcm0gaXMgcnVubmluZwotCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKFBMQVRGT1JNKTsKLQkJCU1ldGhvZCBtID0gY2xhenouZ2V0TWV0aG9kKElTUlVOTklORywgbnVsbCk7Ci0JCQlpc1J1bm5pbmcgPSAoKEJvb2xlYW4pbS5pbnZva2UoY2xhenosIG51bGwpKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAotCQl9CQotCQkvL0NoZWNrIGZvciBleHRlbmRlZCBjaGlsZCB0cmFuc2xhdG9ycyBiZWNhdXNlIHdlIGFyZSBpbiBPU0dJIG1vZGUKLQkJaWYgKGlzUnVubmluZykgewotCQkJVHJhbnNsYXRvcltdIGV4dGVuZGVkQ2hpbGRyZW4gPSBUcmFuc2xhdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFRyYW5zbGF0b3JzKCk7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkgICAgICAgIAlpZiAoZXh0ZW5kZWRDaGlsZHJlbltpXSAhPSBudWxsKQotCSAgICAgICAgICAgIAljaGlsZHJlbi5hZGQoZXh0ZW5kZWRDaGlsZHJlbltpXSk7Ci0JICAgICAgICB9Ci0JCX0KLQkJCi0JCQotCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChmVHJhbnNsYXRvci5nZXRDaGlsZHJlbihnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKSkpOwotCi0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGZUcmFuc2xhdG9yLmdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRvbU5hbWUgPSBudWxsOwotCQkJTmFtZWROb2RlTWFwIG1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCU5vZGUgYXR0ck5vZGUgPSBtYXAuaXRlbShpKTsKLQkJCQkJZG9tTmFtZSA9IGF0dHJOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCS8vSGFuZGxlIHZhcmlhYmxlIHRyYW5zbGF0b3JzCi0JCQkJCVRyYW5zbGF0b3IgdCA9IGZUcmFuc2xhdG9yLmZpbmRDaGlsZChkb21OYW1lLCBnZXRUYXJnZXQoKSwgZlJlbmRlcmVyLmdldFZlcnNpb25JRCgpKTsKLQkJCQkJaWYgKHQgIT0gbnVsbCAmJiAhY2hpbGRyZW4uY29udGFpbnModCkpCi0JCQkJCQljaGlsZHJlbi5hZGQodCk7Ci0JCQkJfQotCQkJfQotCQkJTGlzdCBjaGlsZHJlbkZyb21FTUYgPSBmYWN0b3J5LmNyZWF0ZShnZXRUYXJnZXQoKSk7Ci0JCQlpZiAoY2hpbGRyZW5Gcm9tRU1GICE9IG51bGwpCi0JCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuRnJvbUVNRik7Ci0JCX0KLQotCQljaGlsZFRyYW5zbGF0b3JzID0gKFRyYW5zbGF0b3JbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgVHJhbnNsYXRvcltjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKLQkgKiBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZOb3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0byBmYWxzZSBhbmQgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZnJvbSBib3RoIHRoZSBET00gbm9kZSBhbmQgdGhlIE1PRiBvYmplY3Qgd2lsbCBiZQotCSAqIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlmTm90aWZpY2F0aW9uRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTID09IHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRU1GQWRhcHRlcigpIHsKLQkJdGFyZ2V0LmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZSh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlzYi5hcHBlbmQoZ2V0Tm9kZSgpLmdldE5vZGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKHNob3J0Q2xhc3NOYW1lKGdldFRhcmdldCgpKSk7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNob3J0Q2xhc3NOYW1lKE9iamVjdCBvKSB7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbiA9IG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlyZXR1cm4gY24uc3Vic3RyaW5nKGkgKyAxLCBjbi5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBQcmludHMgb3V0IGEgTU9GIG5vdGlmaWNhdGlvbiBmb3IgZGVidWdnaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVidWdNT0ZOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlTdHJpbmcgbm90aWZUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJCQlub3RpZlR5cGUgPSAiQUREX01BTlkiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRV9NQU5ZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOiB7Ci0JCQkJCWlmIChtc2cuZ2V0UG9zaXRpb24oKSA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpCi0JCQkJCQlub3RpZlR5cGUgPSAiUkVQTEFDRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJbm90aWZUeXBlID0gIlNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLQkJCQkJbm90aWZUeXBlID0gIlVOU0VUIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiTU9GIENoYW5nZTogIiArIG5vdGlmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bm90aWZpZXIgICAgICA6ICIgKyBtc2cuZ2V0Tm90aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBtc2cuZ2V0RmVhdHVyZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRvbGRWYWx1ZSAgICAgIDogIiArIG1zZy5nZXRPbGRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRuZXdWYWx1ZSAgICAgIDogIiArIG1zZy5nZXROZXdWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGZlYXR1cmUgbWFwcyBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZFRyYW5zbGF0b3JzKCkgewotCQlyZXR1cm4gY2hpbGRUcmFuc2xhdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvciBmaW5kVHJhbnNsYXRvcihOb3RpZmljYXRpb24gbm90KSB7Ci0JCWlmIChub3QuZ2V0RmVhdHVyZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hcHNbaV0uaXNNYXBGb3Iobm90LmdldEZlYXR1cmUoKSwgbm90LmdldE9sZFZhbHVlKCksIG5vdC5nZXROZXdWYWx1ZSgpKSkKLQkJCQlyZXR1cm4gbWFwc1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgTGlzdCBtb2ZDaGlsZHJlbiwgTGlzdCBkb21DaGlsZHJlbiwgTm90aWZpZXIgb3duZXIpIHsKLQotCQkvL1VzZWQgZm9yIGluc2VydGluZyBwcmltaXRpdmVzCi0JCUxpc3QgaW5vcmRlckRPTUNoaWxkcmVuID0gbnVsbDsKLQkJaWYgKCFtYXAuaXNPYmplY3RNYXAoKSB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJaW5vcmRlckRPTUNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW5vcmRlckRPTUNoaWxkcmVuLmFkZEFsbChkb21DaGlsZHJlbik7Ci0JCX0KLQkJTm9kZSBwYXJlbnQgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKLQotCQkvLyBHbyB0aG91Z2ggdGhlIE1PRiBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBjaGlsZCA9IG1vZkNoaWxkcmVuLmdldChpKTsKLQkJCUVPYmplY3QgbW9mQ2hpbGQgPSBudWxsOwotCi0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQotCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBjaGlsZCBpcyBhIE1PRiBPYmplY3QuCi0JCQlpZiAoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCW1vZkNoaWxkID0gKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKTsKLQkJCQlhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKG1vZkNoaWxkKTsKLQkJCX0KLQotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpICYmIGRvbUNoaWxkcmVuLmdldChpKSA9PSBhZGFwdGVyLmdldE5vZGUoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoZG9tQ2hpbGRyZW4uaXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBBIG5vZGUgaGFzIGJlZW4gcmVvcmRlcmVkIGluIHRoZSBsaXN0Ci0JCQkJTm9kZSByZW9yZGVyTm9kZSA9IGFkYXB0ZXIuZ2V0Tm9kZSgpOwotCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IChOb2RlKSBkb21DaGlsZHJlbi5nZXQoaSk7Ci0JCQkJZG9tQ2hpbGRyZW4ucmVtb3ZlKHJlb3JkZXJOb2RlKTsKLQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgcmVvcmRlck5vZGUpOwotCQkJCWlmIChyZW9yZGVyTm9kZSAhPSBpbnNlcnRCZWZvcmVOb2RlKSB7Ci0JCQkJCXJlb3JkZXJET01DaGlsZChwYXJlbnQsIHJlb3JkZXJOb2RlLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQSBuZXcgbm9kZSBoYXMgYmVlbiBhZGRlZCwgY3JlYXRlIGl0Ci0JCQkJcGFyZW50ID0gY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJCWlmIChtb2ZDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKG1vZkNoaWxkLCBtYXApOwotCQkJCQlOb2RlIG5ld05vZGUgPSBhZGFwdGVyLmdldE5vZGUoKTsKLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCBpLCBkb21DaGlsZHJlbik7Ci0JCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5ld05vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgbmV3Tm9kZSk7Ci0JCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRlbnQobmV3Tm9kZSwgbWFwKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJCQkJfQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRoZSBtb2YgZmVhdHVyZSBpcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlcy4KLQkJCQkJLy8gY3JlYXRlIGEgbmV3IGRvbSBub2RlIGFuZCBsaXN0ZW4gdG8gaXQuCi0JCQkJCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobnVsbCwgbWFwKTsKLQkJCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluc2VydEJlZm9yZU5vZGUocGFyZW50LCBtYXAsIG1vZkNoaWxkcmVuLCBpLCBpbm9yZGVyRE9NQ2hpbGRyZW4pOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCQkJaW5kZW50KG5ld05vZGUsIG1hcCk7Ci0JCQkJCWFkZERPTUFkYXB0ZXIobmV3Tm9kZSk7IC8vIEhvb2sgdXAgbGlzdGVuZXJzCi0JCQkJCWRvbUNoaWxkcmVuLmFkZChpLCBuZXdOb2RlKTsKLQkJCQkJaW5vcmRlckRPTUNoaWxkcmVuLmFkZChuZXdOb2RlKTsKLQkJCQkJVGV4dCBuZXdUZXh0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoY2hpbGQsIChFT2JqZWN0KSBvd25lcikpOwotCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShuZXdOb2RlLCBuZXdUZXh0LCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJZm9yICg7IGkgPCBkb21DaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCAoRWxlbWVudCkgZG9tQ2hpbGRyZW4uZ2V0KGkpKTsKLQkJfQotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBNT0YgY2hpbGRyZW4sIHJlbW92ZSBhbnkgdW5uZWNlc3NhcnkgRE9NIG5vZGUgcGF0aHMKLQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA9PSAwICYmIG1hcC5oYXNET01QYXRoKCkpIHsKLQkJCWlmIChtYXAuc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKChFT2JqZWN0KSBvd25lcikpCi0JCQkJY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOwotCQkJZWxzZQotCQkJCXJlbW92ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgotCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIExpc3QgbW9mQ2hpbGRyZW4sIExpc3QgZG9tQ2hpbHJlbikgewotCi0JCUhhc2h0YWJsZSBub2RlVG9BZGFwdGVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCW5vZGVUb0FkYXB0ZXIucHV0KGFkYXB0ZXIuZ2V0Tm9kZSgpLCBhZGFwdGVyKTsKLQkJfQotCi0JCS8vIEdvIHRob3VnaCB0aGUgRE9NIGNoaWxkcmVuIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgY29ycmVzcG9uZGluZwotCQkvLyBNT0YgQWRhcHRlciBjaGlsZHJlbiBleGlzdHMuIElmIG5vdCwgY3JlYXRlIHRoZSBhZGFwdGVyLgotCQkvLyBBbHNvIGhhbmRsZXMgcmVvcmRlcmluZyBjaGlsZHJlbiB0aGF0IGhhdmUgbW92ZWQuCi0JCWludCBpID0gMDsKLQkJaW50IG1vZkluZGV4ID0gMDsKLQkJTGlzdCBhZGFwdGVyc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKDsgaSA8IGRvbUNoaWxyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUVsZW1lbnQgY2hpbGROb2RlID0gKEVsZW1lbnQpIGRvbUNoaWxyZW4uZ2V0KGkpOwotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGkgPCBtb2ZDaGlsZHJlbi5zaXplKCkgPyBnZXRFeGlzdGluZ0FkYXB0ZXIoKEVPYmplY3QpIG1vZkNoaWxkcmVuLmdldChpKSkgOiBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhYWRhcHRlci5pc01PRlByb3h5KCkgJiYgYWRhcHRlci5nZXROb2RlKCkgPT0gY2hpbGROb2RlKSB7Ci0JCQkJLy8gQmVjYXVzZSB0aGUgYWRhcHRlciBpcyBwcm9jZXNzaW5nIFNUUlVDVFVSRV9DSEFOR0VEIGZyb20gdGhlCi0JCQkJLy8gRE9NLCB3ZQotCQkJCS8vIG11c3QgdXBkYXRlIGFsbCB0aGUgd2F5IGRvd24gdGhlIHRyZWUgc2luY2UgYW55dGhpbmcgdW5kZXIKLQkJCQkvLyB0aGUgbm90aWZ5aW5nCi0JCQkJLy8gRE9NIG5vZGUgY291bGQgaGF2ZSBjaGFuZ2VkLgotCQkJCWFkYXB0ZXIudXBkYXRlTU9GKCk7Ci0JCQkJbW9mSW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgbm9kZVRvQWRhcHRlci5nZXQoY2hpbGROb2RlKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZW9yZGVySWZOZWNlc3NhcnkoKEVMaXN0KSBtb2ZDaGlsZHJlbiwgYWRhcHRlci5nZXRFT2JqZWN0KCksIG1vZkluZGV4KTsKLQkJCQltb2ZJbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZE5vZGUsIG1hcCk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJLy9XZSBkb24ndCB3YW50IHRvIHB1c2ggYW55dGhpbmcgYmFjayB0byB0aGUgY2hpbGQgZG9tCi0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQkJbWFwLnNldE1PRlZhbHVlKGdldFRhcmdldCgpLCBhZGFwdGVyLmdldFRhcmdldCgpLCBtb2ZJbmRleCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQlhZGFwdGVyc1RvVXBkYXRlLmFkZChhZGFwdGVyKTsKLQkJCQkJbW9mSW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBhZGFwdGVycy4KLQkJLy9tYWtlIGEgY29weSBzbyB3ZSByZW1vdmUgYWxsIGl0ZW1zIC0gYnVnIDE5MjQ2OCAKLQkJCQlPYmplY3RbXSBjaGlsZHJlbkFycmF5ID0gbW9mQ2hpbGRyZW4udG9BcnJheSgpOwotCQkJCWZvciAoOyBpIDwgY2hpbGRyZW5BcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQlyZW1vdmVNT0ZWYWx1ZSgoRU9iamVjdCkgY2hpbGRyZW5BcnJheVtpXSwgbWFwKTsKLQkJIAkJfQotCi0JCS8vIFRoZSBhZGFwdGVycyBjYW5ub3QgYmUgdXBkYXRlZCBhcyB0aGV5IGNyZWF0ZWQuIFdlIG11c3Qgd2FpdCB1bnRpbAotCQkvLyBhbGwgb2YgdGhlIGFkYXB0ZXJzIGFyZSBjcmVhdGVkIGFuZCByZW1vdmVkIGJlZm9yZSB1cGRhdGluZywKLQkJLy8gb3RoZXJ3aXNlCi0JCS8vIHdlIGNhbiBnZXQgaW4gYSBzdGF0ZSB3aGVyZSB0aGVyZSBhcmUgYWRhcHRlcnMgZmlnaHRpbmcgd2l0aAotCQkvLyBlYWNob3RoZXIKLQkJLy8gKG9uZSBmb3IgdGhlIG9sZCBub2RlIGFuZCBvbmUgZm9yIHRoZSBuZXcgbm9kZSkuCi0JCWZvciAoaW50IGogPSAwOyBqIDwgYWRhcHRlcnNUb1VwZGF0ZS5zaXplKCk7IGorKykgewotCQkJKChFTUYyRE9NQWRhcHRlcikgYWRhcHRlcnNUb1VwZGF0ZS5nZXQoaikpLnVwZGF0ZU1PRigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGZlYXR1cmUncyB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRBZGFwdGVyCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkVNRjJET01BZGFwdGVyIFRoZSBjaGlsZCB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9mQXR0cmlidXRlTmFtZQotCSAqICAgICAgICAgICAgU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2ZBdHRyaWJ1dGUgdG8gcmVtb3ZlIHRoZSBjaGlsZCBmcm9tLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1PRlZhbHVlKEVPYmplY3QgdmFsdWUsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCi0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIodmFsdWUsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGFkYXB0ZXIgZnJvbSBCT1RIIHRoZSBNT0YgT2JqZWN0IGFuZCB0aGUgRE9NIE5vZGVzCi0JCQl2YWx1ZS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlyZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHRyYW5zbGF0b3IuZ2V0RmVhdHVyZSgpOwotCQlib29sZWFuIGRvVW5sb2FkID0gZmVhdHVyZSA9PSBudWxsIHx8ICh0cmFuc2xhdG9yLmlzT2JqZWN0TWFwKCkgJiYgKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpOwotCi0JCS8vIHRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoKSB3YXMgaGVyZSBvcmlnaW5hbGx5Ci0KLQkJLy8gVW5sb2FkIHRoZSBvYmplY3RzLgotCQlpZiAoZG9VbmxvYWQpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC51bmxvYWQodmFsdWUpOwotCi0JCS8vIFJlbW92ZSB0aGUgTU9GIHZhbHVlCi0JCXRyYW5zbGF0b3IucmVtb3ZlTU9GVmFsdWUoZ2V0VGFyZ2V0KCksIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVySWZOZWNlc3NhcnkoRUxpc3QgZW1mQ2hpbGRyZW4sIEVPYmplY3QgZU9iaiwgaW50IGVtZkluZGV4KSB7Ci0JCWludCBjdXJySW5kZXggPSBlbWZDaGlsZHJlbi5pbmRleE9mKGVPYmopOwotCQlpZiAoY3VyckluZGV4ID4gLTEgJiYgY3VyckluZGV4ICE9IGVtZkluZGV4KQotCQkJZW1mQ2hpbGRyZW4ubW92ZShlbWZJbmRleCwgZU9iaik7Ci0JfQotCi0JLyoqCi0JICogZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nOyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudChOb2RlIG5ld05vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShOb2RlIHBhcmVudE5vZGUsIFRyYW5zbGF0b3IgbWFwLCBMaXN0IG1vZkxpc3QsIGludCBtb2ZJbngsIExpc3QgZG9tTGlzdCkgewotCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBudWxsOwotCi0JCS8vIElmIHRoZXJlIGFyZSBubyBjdXJyZW50IGRvbSBjaGlsZHJlbiBmb3IgdGhpcyBtYXAsIGZpbmQgdGhlIGluaXRpYWwKLQkJLy8gaW5zZXJ0IHBvcy4KLQkJaWYgKGRvbUxpc3Quc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudE5vZGUsIG1hcCk7Ci0KLQkJLy8gSWYgc29tZSBkb20gbm9kZXMgdGhlbiBmaW5kIHRoZSBjb3JyZWN0IG9uZSB0byBpbnNlcnQgYmVmb3JlLgotCQlpbnQgaSA9IG1vZklueCArIDE7Ci0JCXdoaWxlIChpIDwgbW9mTGlzdC5zaXplKCkgJiYgaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBTdGFydCBhdCB0aGUgbW9mSW54IHBhc3NlZCBpbiBhbmQgbG9vayBmb3J3YXJkIGZvciB0aGUgZmlyc3QKLQkJCS8vIGFkYXB0ZWQKLQkJCS8vIE1PRiBvYmplY3QuIFVzZSB0aGF0IG5vZGUgYXMgdGhlIGluc2VydCBiZWZvcmUgbm9kZS4KLQkJCU9iamVjdCBvID0gbW9mTGlzdC5nZXQoaSk7Ci0JCQlpZiAoIW1hcC5pc09iamVjdE1hcCgpIHx8IG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKQotCQkJCWJyZWFrOwotCQkJRU9iamVjdCB0TU9GT2JqZWN0ID0gKEVPYmplY3QpIG87Ci0JCQlFTUYyRE9NQWRhcHRlciB0QWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcih0TU9GT2JqZWN0LCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJCWlmICh0QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IHRBZGFwdGVyLmdldE5vZGUoKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCi0JCS8vIEhhbmRsZSBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IERPTVV0aWxpdGllcy5nZXROZXh0Tm9kZVNpYmxpbmcoKE5vZGUpIGRvbUxpc3QuZ2V0KGRvbUxpc3Quc2l6ZSgpIC0gMSkpOwotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlTm9kZSA9ICgoTm9kZSkgZG9tTGlzdC5nZXQoZG9tTGlzdC5zaXplKCkgLSAxKSkuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kSW5pdGlhbEluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnROb2RlLCBUcmFuc2xhdG9yIG1hcE5vZGUpIHsKLQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0KLQkJLy8gRmlyc3QsIHNraXAgcGFzdCBhbGwgdGhlIG1hcHMgaW4gdGhlIG9yZGVyZWQgY29sbGVjdGlvbgotCQkvLyBvZiBtYXBzLiBXZSB3YW50IHRvIGJlZ2luIHRoZSBzZWFyY2ggd2l0aCB0aGlzIG5vZGUuCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWFwc1tpXSA9PSBtYXBOb2RlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gTm93IHNlYXJjaCBnbyB0aHJvdWdoIGVhY2ggbWFwIG5vZGUgdW50aWwgYSBjaGlsZCBub2RlIG1hdGNoaW5nCi0JCS8vIGl0cyBET00gbmFtZSBpcyBmb3VuZC4KLQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaiA9IGk7IGogPCBtYXBzLmxlbmd0aCAmJiBpbnNlcnRCZWZvcmVOb2RlID09IG51bGw7IGorKykgewotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJVHJhbnNsYXRvciBub2RlVG9GaW5kTWFwID0gbWFwc1tqXTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJTm9kZSBub2RlID0gY2hpbGROb2Rlcy5pdGVtKGspOwotCQkJCWlmIChub2RlVG9GaW5kTWFwLmlzTWFwRm9yKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IG5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlTm9kZTsKLQl9Ci0KLQkvKgotCSAqIFRyYXZlcnNlcyB0aGUgcGF0aCB0aGF0IDxtYXA+IHNwZWNpZmllcy4gUmV0dXJucyB0aGUgbGFzdCBub2RlIG9mIHRoZSBwYXRoIHRoYXQgd2FzIGFibGUgdG8KLQkgKiBiZSB0cmF2ZXJzZWQgb3IgbnVsbCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUgdHJhdmVyc2VkLiBUaGUgPGFkZEFkYXB0ZXJzPiBib29sZWFuIGlzIHVzZWQgdG8KLQkgKiBkZXRlcm1pbmUgaWYgdGhlIHJlY2VpdmVyIGlzIGFkZGVkIGFzIGFuIGFkYXB0ZXIgdG8gZXZlcnkgbm9kZSBmb3VuZCBvbiB0aGUgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NUGF0aChOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIGJvb2xlYW4gYWRkQWRhcHRlcnMpIHsKLQotCQlTdHJpbmcgcGF0aCA9IG1hcC5nZXRET01QYXRoKCk7Ci0JCU5vZGUgY3VyTm9kZSA9IHBhcmVudDsKLQkJSXRlcmF0b3IgaXRlciA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IocGF0aCk7Ci0KLQkJd2hpbGUgKGN1ck5vZGUgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdXJOb2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChjdXJOb2RlLCBub2RlTmFtZSk7Ci0JCQlpZiAoYWRkQWRhcHRlcnMgJiYgY3VyTm9kZSAhPSBudWxsKSB7Ci0JCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgRE9NIG5vZGUgY2hpbGRyZW4gdGhhdCBjdXJyZW50bHkgZXhpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZ25hbWUuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RE9NQ2hpbGRyZW4oTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IGZpbmRET01QYXRoKG5vZGUsIG1hcCwgdHJ1ZSk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkcmVuKHBhcmVudCwgbWFwLmdldERPTU5hbWVzKCkpOwotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoRU9iamVjdCByZWZPYmplY3QpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZWZPYmplY3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQlyZWZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJcmVtb3ZlRE9NQWRhcHRlcihhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltQWRkRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZlJlbmRlcmVyLnJlZ2lzdGVyRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCXJldHVybiBmUmVuZGVyZXIuZ2V0RXhpc3RpbmdET01BZGFwdGVyKGFOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQlmUmVuZGVyZXIucmVtb3ZlRE9NQWRhcHRlcihhTm9kZSwgYW5BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKE5vZGUgY2hpbGROb2RlKSB7Ci0KLQkJLy8gT25seSBhZGQgdGhlIGFkYXB0ZXIgaWYgdGhpcyBpcyBhbiBjaGlsZCBub2RlIHRoYXQgd2lsbCBub3QgYmUKLQkJLy8gYWRhcHRlZC4gRm9yIGluc3RhbmNlIGEgc3VidHJlZSB0aGF0IG1hcHMgdG8gYSBNT0YgYXR0cmlidXRlCi0JCS8vIHNldHRpbmcuCi0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkTm9kZSk7Ci0KLQkJCWlmIChhdHRyQWRhcHRlciA9PSBudWxsIHx8IGF0dHJBZGFwdGVyLmdldE5vZGUoKSAhPSBnZXROb2RlKCkpIHsKLQkJCQkvLyBJZiB0aGUgbm9kZSBpcyBhZGFwdGVkLCBidXQgbm90IGJ5IHRoaXMgYWRhcHRlciB0aGVuIHJlbW92ZQotCQkJCS8vIGl0LiBUaGlzIGhhcHBlbnMgdG8gbm9uLW9iamVjdCBjaGlsZHJlbiB3aGVuIHRoZSBwYXJlbnQgdGFnCi0JCQkJLy8gbmFtZSBpcyBjaGFuZ2VkLgotCQkJCXJlbW92ZURPTUFkYXB0ZXIoY2hpbGROb2RlLCBhdHRyQWRhcHRlcik7Ci0KLQkJCQlpZiAoZkRlYnVnKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Q0hJTEQ6IEFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0XHR0bzogIiArIGNoaWxkTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJpbUFkZERPTUFkYXB0ZXIoY2hpbGROb2RlLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlb3JkZXIgYSBjaGlsZCBiZWZvcmUgYSBnaXZlbiBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlckRPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJdHJ5IHsKLQkJCXJlbW92ZURPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld2xpbmVTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLmdldEluZGVudFN0cmluZyhub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjaGlsZCBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSkgewotCQlyZW1vdmVET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNoaWxkIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBib29sZWFuIHJlbW92ZUFkYXB0ZXIpIHsKLQkJdHJ5IHsKLQkJCWlmIChjaGlsZE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBMb29rIGZvciBhbnkgd2hpdGVzcGFjZSBwcmVjZWVkaW5nIHRoZSBub2RlIGJlaW5nCi0JCQkvLyByZW1vdmVkIGFuZCByZW1vdmUgaXQgYXMgd2VsbC4KLQkJCVRleHQgcHJldlRleHQgPSBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNUZXh0U2libGluZyhjaGlsZE5vZGUpOwotCQkJaWYgKHByZXZUZXh0ICE9IG51bGwgJiYgRE9NVXRpbGl0aWVzLmlzV2hpdGVzcGFjZShwcmV2VGV4dCkpIHsKLQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByZXZUZXh0KTsKLQkJCX0KLQkJCS8vIFJlbW92ZSB0aGUgbm9kZS4KLQkJCWlmIChyZW1vdmVBZGFwdGVyKQotCQkJCXJlbW92ZUFkYXB0ZXJzKGNoaWxkTm9kZSk7Ci0JCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgRE9NIGFkYXB0ZXJzIGZyb20gdGhlIG5vZGUgQU5EIGFsbCBpdHMgY2hpbGQgbm9kZXMsIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKE5vZGUgbm9kZSkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJLy8gUmVtb3ZlIHRoZSBhZGFwdGVyIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0YgT2JqZWN0LgotCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCWlmIChhZGFwdGVyLmdldE5vZGUoKSA9PSBub2RlKSB7Ci0JCQkJTm90aWZpZXIgbG9jYWxUYXJnZXQgPSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCWlmIChsb2NhbFRhcmdldCAhPSBudWxsKQotCQkJCQlsb2NhbFRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IG5sLml0ZW0oaSk7Ci0JCQlyZW1vdmVBZGFwdGVycyhuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKLQkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBjcmVhdGVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJSXRlcmF0b3IgaSA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IobWFwLmdldERPTVBhdGgoKSk7Ci0JCU5vZGUgY3VyTm9kZSA9IG5vZGU7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQljdXJOb2RlID0gZmluZE9yQ3JlYXRlTm9kZShub2RlLCBtYXAsIG5vZGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBmaW5kT3JDcmVhdGVOb2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHNlZ21lbnQpIHsKLQkJTm9kZSBub2RlID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChwYXJlbnQsIHNlZ21lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgbm9kZSBkaWQgbm90IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBpdC4KLQkJCURvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoc2VnbWVudCk7Ci0JCQlpZiAobWFwLmlzRW1wdHlUYWcoKSkKLQkJCQlzZXRFbXB0eVRhZygoRWxlbWVudCkgbm9kZSk7Ci0KLQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCk7Ci0JCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBub2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKLQkJCWluZGVudChub2RlLCBtYXApOwotCQkJYWRkRE9NQWRhcHRlcihub2RlKTsgLy8gSG9vayB1cCBsaXN0ZW5lcnMKLQkJfQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBub2RlIHBhc3NlZCBpbiBpZiBpdCBoYXMgb25seSB3aGl0ZXNwYWNlIG5vZGVzIGFzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJZkVtcHR5KE5vZGUgbm9kZSkgewotCQlOb2RlTGlzdCBubCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCi0JCS8vIFJ1biB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgY2hpbGRyZW4uIElmIGEgbm9uLXdoaXRlc3BhY2Ugbm9kZQotCQkvLyBwaXMgZm91bmQsIGJhaWwuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKCFET01VdGlsaXRpZXMuaXNXaGl0ZXNwYWNlKGNoaWxkTm9kZSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBhcmUgbm8gbm9uLXdoaXRlc3BhY2UgY2hhcnMsIHNvCi0JCS8vIHNpbXBseSByZW1vdmUgdGhlIG5vZGUuCi0JCXJlbW92ZURPTUNoaWxkKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIERPTSBwYXRoIHNwZWNpZmllZCBieSA8bWFwPmZyb20gPG5vZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NUGF0aChOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCU5vZGUgY2hpbGROb2RlID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7Ci0JCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCAmJiBjaGlsZE5vZGUgIT0gbm9kZSkgewotCQkJcmVtb3ZlSWZFbXB0eShjaGlsZE5vZGUpOwotCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhZGFwdGVyIGZvciBhIGNoaWxkIERPTSBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIGZvci4KLQkgKi8KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQkvLwlBc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZk9iamVjdCk7Ci0KLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIobW9mT2JqZWN0LmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNNT0ZQcm94eSgpKSB7Ci0JCQltb2ZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJcmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQkJYWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihtb2ZPYmplY3QsIGNoaWxkTWFwKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobW9mT2JqZWN0LCBjaGlsZE1hcCk7Ci0JCXJldHVybiBuZXcgRU1GMkRPTUFkYXB0ZXJJbXBsKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCi0JCS8vQXNzZXJ0LmlzTm90TnVsbChjaGlsZE1hcC5nZXRDaGlsZEFkYXB0ZXJDbGFzcygpKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihub2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc01PRlByb3h5KCkgfHwgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlRE9NQWRhcHRlcihub2RlLCBhZGFwdGVyKTsKLQkJCQlpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOwotCQkJCX0KLQkJCQlhZGFwdGVyID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSBwcmltQ3JlYXRlQWRhcHRlcihub2RlLCBjaGlsZE1hcCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlTmV3Tm9kZShFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCURvY3VtZW50IGRvYyA9IChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoY2hpbGRNYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJaWYgKGNoaWxkTWFwLmlzRW1wdHlUYWcoKSkKLQkJCXNldEVtcHR5VGFnKGVsZW1lbnQpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVtcHR5VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJLy9OZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgd2l0aCBwdXJlIERPTSBhcGlzLCBpZiBpdCBpcwotCQkvLyBwb3NzaWJsZQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgTU9GIG9iamVjdCBpcyBhIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTU9GUHJveHkoKSB7Ci0JCWlmIChpc1Jvb3QgfHwgdGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEludGVybmFsRU9iamVjdCkgdGFyZ2V0KS5lSXNQcm94eSgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKSB7Ci0JCWlmIChpc1Jvb3QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbm9kZSB0aGF0IHRoZSB0YXJnZXQgb2YgdGhpcyBhZGFwdGVyIG1hcHMgdG8uIElmIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBtYXBzIHRvCi0JICogbW9yZSB0aGFuIG9uZSBET00gbm9kZSwgdGhpcyBub2RlIGlzIHRoZSB0b3AtbW9zdCBub2RlLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgYU5vZGUpIHsKLQkJZk5vZGUgPSBhTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVET00oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXByaW1VcGRhdGVNT0YoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NKCkgewotCQlpZiAoaXNSb290KQotCQkJdXBkYXRlRE9NUm9vdEZlYXR1cmUoKTsKLQkJZWxzZSB7Ci0JCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgewotCQkJCXVwZGF0ZURPTUZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbVVwZGF0ZU1PRigpIHsKLQkJaWYgKGlzUm9vdCkKLQkJCXVwZGF0ZU1PRlJvb3RGZWF0dXJlKCk7Ci0JCWVsc2UgewotCQkJVHJhbnNsYXRvcltdIG1hcHMgPSBnZXRDaGlsZFRyYW5zbGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcHNbaV0sIGdldE5vZGUoKSwgZ2V0RU9iamVjdCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTVJvb3RGZWF0dXJlKCkgewotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZURPTU11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSwgbnVsbCk7Ci0JCQl1cGRhdGVET01Eb2N1bWVudFR5cGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZSb290RmVhdHVyZSgpIHsKLQkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpOwotCQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShmVHJhbnNsYXRvciwgZk5vZGUsIGdldFJlc291cmNlQ29udGVudHMoKSwgZ2V0RE9NQ2hpbGRyZW4oZk5vZGUsIGZUcmFuc2xhdG9yKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiAoKERvY3VtZW50KSBmTm9kZSkuZ2V0RG9jdHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoVHJhbnNsYXRvclJlc291cmNlKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUxpc3QgZ2V0UmVzb3VyY2VDb250ZW50cygpIHsKLQkJaWYgKCFpc1Jvb3QpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiAoKFJlc291cmNlKSBnZXRUYXJnZXQoKSkuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoKSB7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbCwgc3lzdGVtSWQgPSBudWxsLCBvbGRQdWJsaWNJZCwgb2xkU3lzdGVtSWQ7Ci0JCW9sZFB1YmxpY0lkID0gZG9jVHlwZSA9PSBudWxsID8gbnVsbCA6IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJb2xkU3lzdGVtSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSByZXNvdXJjZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWlmICghKFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHB1YmxpY0lkLCBvbGRQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIG9sZFN5c3RlbUlkKSkpCi0JCQlmUmVuZGVyZXIucmVwbGFjZURvY3VtZW50VHlwZShyZXNvdXJjZS5nZXREb2N0eXBlKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NRG9jdW1lbnRUeXBlKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gVHJhbnNsYXRvclJlc291cmNlLkRPQ19UWVBFX0ZFQVRVUkUpCi0JCQl1cGRhdGVET01Eb2N1bWVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZEb2N1bWVudFR5cGUoKSB7Ci0KLQkJVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbCwgc3lzdGVtSWQgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCi0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCXB1YmxpY0lkID0gZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSBkb2NUeXBlLmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJaWYgKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIHJlc291cmNlLmdldFB1YmxpY0lkKCkpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkpCi0JCQlyZXNvdXJjZS5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0KLQkJaWYgKGlzUm9vdCkgewotCQkJbm90aWZ5Q2hhbmdlZEZvclJvb3QobXNnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaXNEZXBlbmRlbmN5RmVhdHVyZShtc2cpKQotCQkJaGFuZGxlRGVwZW5kZW5jeUZlYXR1cmUobXNnKTsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnTU9GTm90aWZ5KG1zZyk7Ci0KLQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkUgOgotCQkJCVRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IGZpbmRUcmFuc2xhdG9yKG1zZyk7Ci0JCQkJaWYgKHRyYW5zbGF0b3IgPT0gbnVsbCkKLQkJCQkJdHJhbnNsYXRvciA9IGFkZFZhcmlhYmxlVHJhbnNsYXRvcklmTmVjZXNzYXJ5KG1zZyk7Ci0JCQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCQkJdXBkYXRlRE9NRmVhdHVyZSh0cmFuc2xhdG9yLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGFuZ2VkRm9yUm9vdChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJZGVidWdNT0ZOb3RpZnkobXNnKTsKLQotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6Ci0JCQkJcHJpbVVwZGF0ZURPTSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCQl1cGRhdGVET01Eb2N1bWVudFR5cGUobXNnKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRXRvb2xzQ29weVNlc3Npb24uUkVTT1VSQ0VfQ09QSUVEIDoKLQkJCQl1cGRhdGVET00oKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVuY3lBZGFwdGVyKEVPYmplY3QgY2hpbGQpIHsKLQkJQWRhcHRlciBleGlzdGluZyA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIoY2hpbGQsIERlcGVuZGVuY3lBZGFwdGVyLktFWSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlEZXBlbmRlbmN5QWRhcHRlciBmb3J3YXJkZXIgPSBuZXcgRGVwZW5kZW5jeUFkYXB0ZXIoKTsKLQkJY2hpbGQuZUFkYXB0ZXJzKCkuYWRkKGZvcndhcmRlcik7Ci0JCWZvcndhcmRlci5zZXRUYXJnZXQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERPTUFkYXB0ZXIoKSB7Ci0KLQkJcHJpbUFkZERPTUFkYXB0ZXIoZk5vZGUsIHRoaXMpOwotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJBZGRpbmcgRE9NIGFkYXB0ZXI6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHR0bzogIiArIGZOb2RlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gR28gdGhyb3VnaCB0aGUgbWFwcy4gQWxsIG9mIHRoZSBET00gbm9kZXMgdGhhdCBhcmUgbm90IGxpc3RlbmVkCi0JCS8vIHRvIGJ5IGFub3RoZXIgRE9NIE5vZGUgYWRhcHRlciwgbXVzdCBiZSBsaXN0ZW5lZCB0byBieSB0aGlzIGFkYXB0ZXIuCi0JCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBmTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShqKTsKLQkJCWludCBub2RlVHlwZSA9IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKCFET01VdGlsaXRpZXMuaXNUZXh0Tm9kZShjaGlsZE5vZGUpICYmIG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJVHJhbnNsYXRvciBtYXAgPSBmaW5kVHJhbnNsYXRvcihjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCWlmIChtYXAgIT0gbnVsbCAmJiBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkKLQkJCQkJYWRkRE9NQWRhcHRlcihjaGlsZE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgYWRkVmFyaWFibGVUcmFuc2xhdG9ySWZOZWNlc3NhcnkoTm90aWZpY2F0aW9uIG1zZykgewotCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3QgPSBmVHJhbnNsYXRvci5nZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7Ci0JCVRyYW5zbGF0b3IgdHJhbnMgPSBudWxsOwotCQlpZiAoZmFjdCAhPSBudWxsICYmIGZhY3QuYWNjZXB0cyhtc2cpKSB7Ci0JCQl0cmFucyA9IGZhY3QuY3JlYXRlKG1zZyk7Ci0JCQlpZiAodHJhbnMgIT0gbnVsbCkKLQkJCQljaGlsZFRyYW5zbGF0b3JzID0gKFRyYW5zbGF0b3JbXSkgVHJhbnNsYXRvci5jb25jYXQoY2hpbGRUcmFuc2xhdG9ycywgdHJhbnMpOwotCQl9Ci0JCXJldHVybiB0cmFuczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0Tm9kZShEb2N1bWVudCBkb2MsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbm9ubnVsbHRleHQgPSAodGV4dCAhPSBudWxsKSA/IHRleHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWFwLmlzQ0RBVEFDb250ZW50KCkgPyBkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKG5vbm51bGx0ZXh0KSA6IGRvYy5jcmVhdGVUZXh0Tm9kZShub25udWxsdGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UmVhZEFoZWFkTmFtZSgpIHsKLQkJaWYgKCFmVHJhbnNsYXRvci5oYXNSZWFkQWhlYWROYW1lcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWFkQWhlYWROYW1lID0gbnVsbDsKLQotCQlSZWFkQWhlYWRIZWxwZXIgaGVscGVyID0gZlRyYW5zbGF0b3IuZ2V0UmVhZEFoZWFkSGVscGVyKGZOb2RlLmdldE5vZGVOYW1lKCkpOwotCQlpZiAoaGVscGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGNoaWxkID0gbnVsbDsKLQkJU3RyaW5nW10gbmFtZXMgPSBoZWxwZXIuZ2V0VmFsdWVzKCk7Ci0JCWlmIChoZWxwZXIuZ2V0Q2hpbGRET01OYW1lKCkgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWNoaWxkID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChmTm9kZSwgbmFtZXNbaV0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXJlYWRBaGVhZE5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJY2hpbGQgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKGZOb2RlLCBoZWxwZXIuZ2V0Q2hpbGRET01OYW1lKCkpOwotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJcmVhZEFoZWFkTmFtZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHQoY2hpbGQpOwotCQl9Ci0JCWlmIChyZWFkQWhlYWROYW1lID09IG51bGwpCi0JCQlyZWFkQWhlYWROYW1lID0gbmFtZXNbMF07Ci0JCXJldHVybiByZWFkQWhlYWROYW1lOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3RzIHRoZSB0ZXh0IGZyb20gPG5vZGU+YW5kIGNvbnZlcnRzIGl0IHRvIGFuIG9iamVjdCBzdWl0YWJsZSBmb3Igc2V0dGluZyBpbnRvIDxmZWF0dXJlPgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0cmFjdFZhbHVlKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXAsIEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0KLQkJLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dCBjaGlsZAotCQlOb2RlIHRleHROb2RlID0gRE9NVXRpbGl0aWVzLmdldENoaWxkVGV4dE5vZGUobm9kZSk7Ci0JCVN0cmluZyB0cmltbWVkVmFsdWUgPSBudWxsOwotCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkKLQkJCXRyaW1tZWRWYWx1ZSA9IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG1hcC5jb252ZXJ0U3RyaW5nVG9WYWx1ZSh0cmltbWVkVmFsdWUsIGVtZk9iamVjdCk7Ci0JCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQl0aHJvdyBleDsKLQotCX0KLQotCS8qCi0JICogRmluZHMgdGhlIGNoaWxkIG5vZGUgdGhhdCA8bWFwPiBzcGVjaWZpZXMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hpbGQgdGhhdCBzYXRpc2ZpZXMKLQkgKiA8bWFwPiB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgcmV0dXJuZWQuCi0JICogCi0JICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIHBhc3QgdGhlIGRvbVBhdGggaWYgb25lIGlzIHNwZWNpZmllZCBpbiB0aGUgPG1hcD4uCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZmluZERPTU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCXJldHVybiBmaW5kRE9NTm9kZShwYXJlbnQsIG1hcCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogRmluZHMgdGhlIGNoaWxkIG5vZGUgdGhhdCA8bWFwPiBzcGVjaWZpZXMuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hpbGQgdGhhdCBzYXRpc2ZpZXMKLQkgKiA8bWFwPiB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgcmV0dXJuZWQuIFRoZSA8YWRkQWRhcHRlcnM+IGJvb2xlYW4gaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlCi0JICogcmVjZWl2ZXIgaXMgYWRkZWQgYXMgYW4gYWRhcHRlciB0byBldmVyeSBub2RlIGZvdW5kIG9uIHRoZSBwYXRoLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHRyYXZlcnNlcyBwYXN0IHRoZSBkb21QYXRoIGlmIG9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCBOb2RlIGZpbmRET01Ob2RlKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCwgYm9vbGVhbiBhZGRBZGFwdGVycykgewotCi0JCS8vIEZpcnN0LCB0cmFjZSBkb3duIHRoZSBwYXRoCi0JCU5vZGUgY3VyTm9kZSA9IGZpbmRET01QYXRoKHBhcmVudCwgbWFwLCBhZGRBZGFwdGVycyk7Ci0JCWlmIChtYXAuaXNET01UZXh0VmFsdWUoKSB8fCBtYXAuaXNET01BdHRyaWJ1dGUoKSB8fCBjdXJOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gY3VyTm9kZTsKLQotCQkvLyBOb3cgbG9vayBmb3IgdGhlIGZpcnN0IERPTSBuYW1lIHdlIGNhbiBmaW5kCi0JCVN0cmluZ1tdIGRvbU5hbWVzID0gbWFwLmdldERPTU5hbWVzKCk7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZG9tTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBub2RlTmFtZSA9IGRvbU5hbWVzW2ldOwotCQkJTGlzdCBub2RlcyA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGRyZW4oY3VyTm9kZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGVzICE9IG51bGwgJiYgIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCWlmIChub2Rlcy5zaXplKCkgPiAxKQotCQkJCQloYW5kbGVJbnZhbGlkTXVsdGlOb2Rlcyhub2RlTmFtZSk7Ci0JCQkJbm9kZSA9IChOb2RlKSBub2Rlcy5nZXQoMCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAoYWRkQWRhcHRlcnMgJiYgKG1hcCAhPSBudWxsIHx8IG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSkKLQkJCQkJCWFkZERPTUFkYXB0ZXIoY3VyTm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnZhbGlkTXVsdGlOb2RlcyhTdHJpbmcgbm9kZU5hbWUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRU1GMkRPTUFkYXB0ZXJJbXBsX0VSUk9SXzAsIG5ldyBPYmplY3RbXXtub2RlTmFtZX0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwYXRoIHNwZWNpZmllZCBieSA8bWFwPnVuZGVyIDxub2RlPi4gT25seSB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0aCB0aGF0IGRvZXMgbm90Ci0JICogZXhpc3QgKGlmIGFueSkgaXMgY3JlYXRlZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5UcmFuc2xhdG9yCi0JICovCi0JcHJvdGVjdGVkIFRleHQgZmluZE9yQ3JlYXRlVGV4dE5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgdGV4dCkgewotCQlUZXh0IHRleHROb2RlID0gRE9NVXRpbGl0aWVzLmdldENoaWxkVGV4dE5vZGUocGFyZW50KTsKLQkJaWYgKHRleHROb2RlICE9IG51bGwpIHsKLQkJCXRleHROb2RlLnNldERhdGEodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIWlzRW1wdHlUYWcoKEVsZW1lbnQpIHBhcmVudCkpIHsKLQkJCQlUZXh0IG5ld05vZGUgPSBjcmVhdGVUZXh0Tm9kZShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBtYXAsIHRleHQpOwotCQkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbmV3Tm9kZSwgbnVsbCk7Ci0JCQkJcmV0dXJuIG5ld05vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHROb2RlOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZpbmRUcmFuc2xhdG9yKFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGF0dHJpYnV0ZU1hcCkgewotCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmFuc2xhdG9yIG1hcCA9IG1hcHNbaV07Ci0JCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpICYmIGF0dHJpYnV0ZU1hcCA9PSBtYXAuaXNET01BdHRyaWJ1dGUoKSkKLQkJCQlyZXR1cm4gbWFwc1tpXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoTm9kZSBhTm9kZSkgewotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihhTm9kZSk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKLQkJCXJlbW92ZURPTUFkYXB0ZXIoYU5vZGUsIGFkYXB0ZXIpOwotCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQlhZGFwdGVyID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEZXBlbmRlbmN5RmVhdHVyZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSAhPSBudWxsKQotCQkJcmVtb3ZlRGVwZW5kZW5jeUFkYXB0ZXIoKEVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJaWYgKG1zZy5nZXROZXdWYWx1ZSgpICE9IG51bGwpCi0JCQlhZGREZXBlbmRlbmN5QWRhcHRlcigoRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwZW5kZW5jeUZlYXR1cmUoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLQkJCQlyZXR1cm4gZlRyYW5zbGF0b3IuaXNEZXBlbmRlbmN5UGFyZW50KCkgJiYgZlRyYW5zbGF0b3IuZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKSA9PSBtc2cuZ2V0RmVhdHVyZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJLy9EZXRlcm1pbmUgaG93IHRvIGltcGxlbWVudCB0aGlzIHdpdGggcHVyZSBET00gYXBpcywgaWYgcG9zc2libGUuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0VXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZVVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCU9iamVjdCBhdHRyVmFsdWUgPSBudWxsOwotCQlib29sZWFuIGlzU2V0ID0gZmFsc2U7Ci0JCWlmIChtYXAuaXNJRE1hcCgpKSB7Ci0JCQl0cnkgewotCQkJCWF0dHJWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJfSBjYXRjaCAoSURUcmFuc2xhdG9yLk5vUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKLQkJCQkvL0lmIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSwKLQkJCQkvL05vIG5lZWQgdG8gdXBkYXRlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaXNTZXQgPSBhdHRyVmFsdWUgIT0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWF0dHJWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJaXNTZXQgPSBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQl9Ci0KLQkJaWYgKG1hcC5pc0RPTUF0dHJpYnV0ZSgpKSB7Ci0JCQkvLyBBbiBhdHRyaWJ1dGUgb2YgdGhlIE1PRiBvYmplY3QgbWFwcyB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCi0JCQkvLyBET00gbm9kZS4gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSBhbmQgc2V0IGl0Ci0JCQkvLyBpbnRvIERPTSBub2RlLgotCQkJRWxlbWVudCBlID0gKEVsZW1lbnQpIGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiBpc1NldCkKLQkJCQllLnNldEF0dHJpYnV0ZShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpLCBtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoYXR0clZhbHVlLCBtb2ZPYmplY3QpKTsKLQkJCWVsc2UKLQkJCQllLnJlbW92ZUF0dHJpYnV0ZShtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZURPTVN1YnRyZWUobWFwLCBub2RlLCBtb2ZPYmplY3QsIGF0dHJWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHdpdGggdGhlIHZhbHVlcyBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBNT0YKLQkgKiBvYmplY3QuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01MaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlMaW5rVXBkYXRlclRhcmdldC5JTlNUQU5DRS51cGRhdGVET00obWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0KLQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOwotCQlMaXN0IGRvbUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4obm9kZSwgbWFwKTsKLQotCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mQ2hpbGRyZW4sIGRvbUNoaWxkcmVuLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW1VcGRhdGVNT0ZGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmICghbWFwLmZlYXR1cmVFeGlzdHMobW9mT2JqZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJT2JqZWN0IGRvbVZhbHVlID0gbnVsbDsKLQkJYm9vbGVhbiB1cGRhdGVNT0ZBdHRBZGFwdGVyID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNVbnNldCA9IGZhbHNlOwotCQlFTUYyRE9NQWRhcHRlciBhdHRyQWRhcHRlciA9IG51bGw7Ci0KLQkJTm9kZSBjaGlsZCA9IGZpbmRET01Ob2RlKG5vZGUsIG1hcCwgdHJ1ZSk7Ci0KLQkJaWYgKG1hcC5pc0RPTUF0dHJpYnV0ZSgpICYmIGNoaWxkICE9IG51bGwpIHsKLQkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBtYXBzIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKLQkJCS8vIERPTSBub2RlLiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBET00gYXR0cmlidXRlIGFuZCBzZXQgaXQKLQkJCS8vIGludG8gdGhlIE1PRiBvYmplY3QuCi0KLQkJCUF0dHIgZG9tQXR0ciA9IChBdHRyKSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCQkJaWYgKGRvbUF0dHIgIT0gbnVsbCkgewotCQkJCWRvbVZhbHVlID0gZG9tQXR0ci5nZXRWYWx1ZSgpOwotCQkJCWRvbVZhbHVlID0gbWFwLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKChTdHJpbmcpIGRvbVZhbHVlLCBtb2ZPYmplY3QpOwotCQkJfSBlbHNlCi0JCQkJaXNVbnNldCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBBbiBhdHRyaWJ1dGUgb2YgdGhlIE1PRiBvYmplY3QgaXMgYWN0dWFsbHkgYSBzdWItZWxlbWVudAotCQkJLy8gb2YgdGhlIERPTSBub2RlLiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBzdWItZWxlbWVudCB3aXRoCi0JCQkvLyB0aGUgY29ycmVjdCBuYW1lIHRvIHVzZSBhcyBhbiBhdHRyaWJ1dGUuCi0JCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgc2luZ2xlIHZhbHVlZCBhdHRyaWJ1dGUgdGhhdCBoYXMKLQkJCQkvLyBhIE1PRiBvYmplY3QgYXMgaXRzIHZhbHVlCi0JCQkJaWYgKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCQlhdHRyQWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoY2hpbGQsIG1hcCk7Ci0JCQkJCXVwZGF0ZU1PRkF0dEFkYXB0ZXIgPSB0cnVlOwotCQkJCQlkb21WYWx1ZSA9IGF0dHJBZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY2hpbGQgaXMgYWRhcHRlZC4gSWYgbm90LCBhZGFwdAotCQkJCQkvLyBpdC4KLQkJCQkJYWRkRE9NQWRhcHRlcihjaGlsZCk7Ci0KLQkJCQkJLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dCBjaGlsZAotCQkJCQlkb21WYWx1ZSA9IGV4dHJhY3RWYWx1ZShjaGlsZCwgbWFwLCBtb2ZPYmplY3QpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWlzVW5zZXQgPSB0cnVlOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBhdHRyaWJ1dGUgZXh0cmFjdGVkIGZyb20gdGhlIERPTSB0byB0aGUgTU9GIG9iamVjdC4KLQkJYm9vbGVhbiBoYXNDaGFuZ2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCWlmIChtYXAuaXNJRE1hcCgpKQotCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGRvbVZhbHVlKTsKLQkJCWVsc2UgewotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG51bGw7Ci0JCQkJb2xkVmFsdWUgPSBtYXAuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCQlib29sZWFuIGlzU2V0ID0gbWFwLmlzU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJCQkvL0luIHRoZSBjYXNlIG9mIGVudW1zIHdpdGggZGVmYXVsdCB2YWx1ZXMsIHdlIG5lZWQgdG8gdHJpcAotCQkJCS8vIHRoZSBhdHRyaWJ1dGUgZnJvbQotCQkJCS8vZGVmYXVsdCB0byBhIHNldCB2YWx1ZQotCQkJCWlmIChvbGRWYWx1ZSA9PSBkb21WYWx1ZSkgewotCQkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCBpc1NldCkKLQkJCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKGRvbVZhbHVlID09IG51bGwgJiYgIWlzU2V0KQotCQkJCQkvL0lmIHRoZSBkb21WYWx1ZSBpcyBudWxsIGFuZCB0aGUgZmVhdHVyZSBpcyBub3Qgc2V0LCB0aGVuCi0JCQkJCS8vIHdlIGRvbid0IG5lZWQKLQkJCQkJLy90byBkbyBhbnl0aGluZwotCQkJCQloYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJZWxzZSBpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5lcXVhbHMoZG9tVmFsdWUpICYmIGlzU2V0KQotCQkJCQloYXNDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgJiYgZG9tVmFsdWUgPT0gbnVsbCAmJiBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpID09IGlzVW5zZXQpCi0JCQkJCWhhc0NoYW5nZWQgPSB0cnVlOwotCQkJCWlmIChoYXNDaGFuZ2VkKSB7Ci0JCQkJCWlmICghKG1hcC5pc0RhdGFUeXBlKCkpICYmICFtYXAuaXNTaGFyZWQoKSkKLQkJCQkJCXJlbW92ZU1PRlZhbHVlKChFT2JqZWN0KSBvbGRWYWx1ZSwgbWFwKTsKLQkJCQkJaWYgKGRvbVZhbHVlID09IG51bGwpCi0JCQkJCQltYXAudW5TZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQkJCQllbHNlCi0JCQkJCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBkb21WYWx1ZSk7Ci0KLQkJCQkJaWYgKChkb21WYWx1ZSA9PSBudWxsICYmICEobWFwLmlzRW51bUZlYXR1cmUoKSkpIHx8IGlzVW5zZXQpCi0JCQkJCQltYXAudW5TZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOyAvL3Vuc2V0Ci0JCQkJCS8vIG51bGwKLQkJCQkJLy8gZm9yCi0JCQkJCS8vIG5vbgotCQkJCQkvLyBlbnVtCi0JCQkJCS8vIGZlYXR1cmVzCi0KLQkJCQkJaWYgKHVwZGF0ZU1PRkF0dEFkYXB0ZXIpCi0JCQkJCQlhdHRyQWRhcHRlci51cGRhdGVNT0YoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJCWhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZXgpOwotCQkJbWFwLnVuU2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaGFzQ2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBmcm9tIHRoZSBET00gbm9kZSBzdWJ0cmVlLiBUaGlzIG1ldGhvZCBpcyBvbmx5Ci0JICogY2FsbGVkIGlmIHRoZSBET00gbm9kZSBjaGFuZ2VzIGFuZCB0aGUgbWFwIGlzIGFuIG9iamVjdCBsaW5rIG1hcC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICogQHJldHVybiBSZXR1cm4gdHJ1ZSBpZiB0aGUgTU9GIGZlYXR1cmUgd2FzIHVwZGF0ZWQsIGZhbHNlIGlmIG5vIHVwZGF0ZSB3YXMgZG9uZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlTU9GTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJTGlua1VwZGF0ZXJUYXJnZXQuSU5TVEFOQ0UudXBkYXRlTU9GKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKLQkgKiAKLQkgKiBAbWFwLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvciBEZXNjcmliZXMgdGhlIG1hcHBpbmcgZnJvbSB0aGUgTU9GCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NIG5vZGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJLy8gSWYgdGhlIGZlYXR1cmUgaXMgYSBjb2xsZWN0aW9uIG9mIHN0cmluZ3Mgb3IgaW50cywgY2FsbCBhIHNwZWNpYWwKLQkJLy8gbWV0aG9kCi0JCS8vIHRoYXQgaGFuZGxlcyB0aGlzLgotCQlpZiAobWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCXVwZGF0ZU1PRk11bHRpUHJpbWl0aXZlRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IG5vZGVDaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKG5vZGUsIG1hcCk7Ci0JCUxpc3QgbW9mQ2hpbGRyZW4gPSBtYXAuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQotCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mQ2hpbGRyZW4sIG5vZGVDaGlsZHJlbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVwZW5kZW5jeUFkYXB0ZXIoRU9iamVjdCBvYmopIHsKLQkJQWRhcHRlciBleGlzdGluZyA9IEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIob2JqLCBEZXBlbmRlbmN5QWRhcHRlci5LRVkpOwotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJCW9iai5lQWRhcHRlcnMoKS5yZW1vdmUoZXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHRoZSBET00gY2hpbGRyZW4gZnJvbSA8cGFyZW50PnRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IDxtYXA+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUNoaWxkcmVuKE5vZGUgcGFyZW50LCBUcmFuc2xhdG9yIG1hcCkgewotCQlTdHJpbmdbXSBkb21OYW1lcyA9IG1hcC5nZXRET01OYW1lcygpOwotCQlIYXNoU2V0IGRvbU5hbWVzU2V0ID0gbmV3IEhhc2hTZXQoZG9tTmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb21OYW1lcy5sZW5ndGg7IGkrKykKLQkJCWRvbU5hbWVzU2V0LmFkZChkb21OYW1lc1tpXSk7Ci0KLQkJLy8gV2FsayB0aHJvdWdoIGFsbCB0aGUgY2hpbGRyZW4gYW5kIGZpbmQgYW55IHRoYXQgbWF0Y2ggdGhlIG1hcC4KLQkJTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbmwuaXRlbShpKTsKLQkJCWlmIChkb21OYW1lc1NldC5jb250YWlucyhjaGlsZE5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJdG9SZW1vdmUuYWRkKGNoaWxkTm9kZSk7Ci0JCX0KLQotCQkvLyBSZW1vdmUgYW55IGNoaWxkcmVuIHRoYXQgd2VyZSBmb3VuZC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZE5vZGUgPSAoTm9kZSkgdG9SZW1vdmUuZ2V0KGkpOwotCQkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50LCBjaGlsZE5vZGUsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0RnJvbU5vZGUoKSB7Ci0JCXNldFRhcmdldChmVHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZk5vZGUuZ2V0Tm9kZU5hbWUoKSwgZXh0cmFjdFJlYWRBaGVhZE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgdXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJcHJlVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlpZiAobWFwLmlzTXVsdGlWYWx1ZWQoKSkgewotCQkJCXVwZGF0ZURPTU11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZkRlYnVnKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgRE9NIE5vZGU6ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCXRyeSB7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJcHJpbVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQkJfQotCi0JCQlpZiAobWFwLmlzVGFyZ2V0TGlua01hcCgpKSB7Ci0JCQkJdXBkYXRlRE9NTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcG9zdFVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgotCSAqIG9iamVjdC4gVGhlCi0JICogCi0JICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgRE9NIE5vZGUgKGxpbmspOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcmltVXBkYXRlRE9NTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIERPTSBOb2RlIChtdWx0aSk6ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYSBET00gc3VidHJlZSB0byByZWZsZWN0IHRoZSBtb2ZPYmplY3QgYW5kIG1hcCBwYXNzZWQgaW4uIFRoZSBzdWJ0cmVlIGlzIG9mIDxub2RlPmlzCi0JICogdXBkYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01TdWJ0cmVlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0LCBPYmplY3QgYXR0clZhbHVlKSB7Ci0KLQkJaWYgKG1hcC5mZWF0dXJlRXhpc3RzKG1vZk9iamVjdCkpIHsKLQkJCWlmICgobWFwLmlzRW51bUZlYXR1cmUoKSB8fCBtYXAuaXNCb29sZWFuRmVhdHVyZSgpKSAmJiAobWFwLmlzVW5zZXR0YWJsZSgpICYmICFtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpKSkKLQkJCQlhdHRyVmFsdWUgPSBudWxsOwotCQl9IGVsc2UKLQkJCWF0dHJWYWx1ZSA9IG1hcC5leHRyYWN0U3RyaW5nVmFsdWUobW9mT2JqZWN0KTsKLQotCQkvLyBDcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgRE9NIHN1YnRyZWUKLQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQlOb2RlIHBhcmVudCA9IGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKLQkJCWlmIChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbW9mIHZhbHVlIGlzIG5vdCBhbm90aGVyCi0JCQkJLy8gbW9mIG9iamVjdCAocHJpbWl0aXZlKQotCQkJCWlmIChtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpICE9IG51bGwgJiYgbWFwLmdldERPTU5hbWUobW9mT2JqZWN0KS5zdGFydHNXaXRoKCIjIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCi0JCQkJRWxlbWVudCBjaGlsZCA9IG1hcC5pc0RPTVRleHRWYWx1ZSgpID8gKEVsZW1lbnQpIHBhcmVudCA6IGZpbmRPckNyZWF0ZU5vZGUocGFyZW50LCBtYXAsIG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOwotCi0JCQkJZmluZE9yQ3JlYXRlVGV4dE5vZGUoY2hpbGQsIG1hcCwgbWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGF0dHJWYWx1ZSwgbW9mT2JqZWN0KSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3ZXJlIHRoZSBtb2YgdmFsdWUgaXMgYSBtb2Ygb2JqZWN0LgotCQkJCUVPYmplY3QgbW9mVmFsdWUgPSAoRU9iamVjdCkgYXR0clZhbHVlOwotCQkJCUVNRjJET01BZGFwdGVyIHZhbHVlQWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihtb2ZWYWx1ZSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQkJaWYgKHZhbHVlQWRhcHRlciAhPSBudWxsKQotCQkJCQl2YWx1ZUFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZURPTUNoaWxkcmVuKHBhcmVudCwgbWFwKTsKLQkJCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIobW9mVmFsdWUsIG1hcCk7Ci0JCQkJCUxpc3QgbW9mQ2hpbGRyZW4gPSBtYXAuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKLQkJCQkJTGlzdCBkb21DaGlsZHJlbiA9IGdldERPTUNoaWxkcmVuKHBhcmVudCwgbWFwKTsKLQotCQkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSBmaW5kSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG1hcCwgbW9mQ2hpbGRyZW4sIDAsIGRvbUNoaWxkcmVuKTsKLQkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCwgYWRhcHRlci5nZXROb2RlKCksIGluc2VydEJlZm9yZU5vZGUpOwotCQkJCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBhZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCQl0cnkgewotCQkJCQkJaW5kZW50KGFkYXB0ZXIuZ2V0Tm9kZSgpLCBtYXApOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQkJCQl9Ci0JCQkJCWFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gVGhlIGF0dHJpYnV0ZSB2YWx1ZSB3YXMgc2V0IHRvIG51bGwgb3IgdW5zZXQuIFJlbW92ZSBhbnkKLQkJCS8vIGV4aXN0aW5nIERPTSBub2Rlcy4KLQkJCU5vZGUgY2hpbGQgPSBmaW5kRE9NTm9kZShub2RlLCBtYXApOwotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJcmVtb3ZlRE9NQ2hpbGQoY2hpbGQuZ2V0UGFyZW50Tm9kZSgpLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgYSBmZWF0dXJlIHRoYXQgaXMgc2V0IGJ5IGxpbmtpbmcgdG8gYW5vdGhlciBleGlzdGluZyBvYmplY3QuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZAotCSAqIHdoZW4gdGhlIE1PRiBvYmplY3QgaXMgdXBkYXRlZCBpbiBvcmRlciB0byB1cGRhdGUgRE9NIG5vZGVzLgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRkxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdCAobGluayk6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlwcmltVXBkYXRlTU9GTGlua0ZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQotCSAqIAotCSAqIEBtYXAuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdCAobXVsdGkpOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5Ci0JICogCi0JICogQG1hcC4gVGhlIHJlbGF0aW9uc2hpcCBNVVNUIEJFIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgZm9yIHRoaXMgbWV0aG9kIHRvIHdvcmsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GTXVsdGlQcmltaXRpdmVGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCUxpc3Qgbm9kZUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4obm9kZSwgbWFwKTsKLQotCQltYXAuY2xlYXJMaXN0KG1vZk9iamVjdCk7Ci0KLQkJLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBub2RlcyBhbmQgdXBkYXRlIHRoZSBNT0YgY29sbGVjdGlvbgotCQlpbnQgYWRkSW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVDaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IChOb2RlKSBub2RlQ2hpbGRyZW4uZ2V0KGkpOwotCQkJT2JqZWN0IGF0dHJpYnV0ZVZhbHVlID0gZXh0cmFjdFZhbHVlKGNoaWxkLCBtYXAsIG1vZk9iamVjdCk7Ci0JCQlib29sZWFuIGFkdmFuY2VBZGRJbmRleCA9IHRydWU7Ci0JCQlpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCl7Ci0JCQkJaWYobWFwLmdldEZlYXR1cmUoKSAhPSBudWxsICYmIG1hcC5nZXRGZWF0dXJlKCkuaXNVbmlxdWUoKSAmJiBtb2ZPYmplY3QuZUdldChtYXAuZ2V0RmVhdHVyZSgpKSAhPSBudWxsICYmIG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpIGluc3RhbmNlb2YgTGlzdCAmJiAoKExpc3QpIG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpKS5jb250YWlucyhhdHRyaWJ1dGVWYWx1ZSkpewotCQkJCQlhZHZhbmNlQWRkSW5kZXggPSBmYWxzZTsKLQkJCQkJU3RyaW5nIGRvbU5hbWUgPSBtYXAuZG9tTmFtZUFuZFBhdGggIT0gbnVsbCA/IG1hcC5kb21OYW1lQW5kUGF0aCA6ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICdubyBkdXBsaWNhdGVzJyBjb25zdHJhaW50IGlzIHZpb2xhdGVkIGJ5ICIrZG9tTmFtZSsiID0gIithdHRyaWJ1dGVWYWx1ZSkpOwotCQkJCQloYW5kbGVJbnZhbGlkTXVsdGlOb2RlcyhjaGlsZC5nZXROb2RlTmFtZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBhdHRyaWJ1dGVWYWx1ZSwgYWRkSW5kZXgpOwotCQkJCX0KLQkJCQlpZihhZHZhbmNlQWRkSW5kZXgpewotCQkJCQlhZGRJbmRleCArKzsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIEFkYXB0IHRoZSBub2RlIHNvIHVwZGF0ZSB3aWxsIG9jY3VyLgotCQkJYWRkRE9NQWRhcHRlcihjaGlsZCk7Ci0JCX0KLQkJaWYgKG1hcC5oYXNET01QYXRoKCkgJiYgbm9kZUNoaWxkcmVuLmlzRW1wdHkoKSAmJiBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKSAhPSBudWxsKQotCQkJbWFwLnNldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChtb2ZPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoZQotCSAqIAotCSAqIEBtYXAgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBNT0YgYXR0cmlidXRlIHRvIHVwZGF0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIERPTSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBtYXAKLQkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uQXR0cmlidXRlVHJhbnNsYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRkZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG1hcC5pc011bHRpVmFsdWVkKCkpIHsKLQkJCXVwZGF0ZU1PRk11bHRpRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobWFwLmlzQ29tbWVudCgpKSB7Ci0JCQl1cGRhdGVNT0ZDb21tZW50RmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBUT0RPIE1ERSBBZGQgYSBtYXAuaXNDb21tZW50KCkgYW5kIHVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQotCQlpZiAoZkRlYnVnKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBNT0ZPYmplY3Q6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQlib29sZWFuIGhhc0NoYW5nZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJaGFzQ2hhbmdlZCA9IHByaW1VcGRhdGVNT0ZGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7Ci0JCX0KLQotCQlpZiAobWFwLmlzVGFyZ2V0TGlua01hcCgpICYmIGhhc0NoYW5nZWQpCi0JCQl1cGRhdGVNT0ZMaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG1vZk9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCU5vZGUgY29tbWVudE5vZGUgPSBub2RlOwotCQkvKiBzY2FuIHVwIHRoZSBkb20gdG8gZmluZCB0aGUgZmlyc3QgY29tbWVudCBub2RlIGJlZm9yZSB0aGlzIG5vZGUgKi8KLQkJd2hpbGUgKChjb21tZW50Tm9kZSA9IGNvbW1lbnROb2RlLmdldFByZXZpb3VzU2libGluZygpKSAhPSBudWxsICYmIGNvbW1lbnROb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCS8qIG5vIGNvbW1lbnQgYXZhaWxhYmxlICovCi0JCQlpZiAoY29tbWVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvbW1lbnROb2RlICE9IG51bGwpCi0JCQltYXAuc2V0TU9GVmFsdWUobW9mT2JqZWN0LCBjb21tZW50Tm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJET01SZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZmJkYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01Mb2FkT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXZpc2l0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlciBleHRlbmRzIEFic3RyYWN0UmVuZGVyZXJJbXBsIGltcGxlbWVudHMgUmVuZGVyZXIgewotCi0JcHJvdGVjdGVkIE1hcCBkb21BZGFwdGVyUmVnaXN0cnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNUb0NyZWF0ZURPTSA9IHRydWU7Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERPTVJlbmRlcmVySW1wbC4KLQkgKi8KLQlwdWJsaWMgRU1GMkRPTVJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQlpZiAobWFuYWdlc0RPTUFkYXB0ZXJzKCkpCi0JCQlpbml0RE9NQWRhcHRlclJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChJbnB1dFN0cmVhbSwgTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICgoaW4gIT0gbnVsbCkgfHwgIXVzZVN0cmVhbXNGb3JJTygpKSB7Ci0JCQlsb2FkRG9jdW1lbnQoaW4sIG9wdGlvbnMpOwotCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZVJvb3RET01BZGFwdGVyKCk7Ci0JCQlhZGFwdGVyLnVwZGF0ZU1PRigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCURPTUxvYWRPcHRpb25zIGRvbU9wdHMgPSBuZXcgRE9NTG9hZE9wdGlvbnMoKTsKLQkJCWRvbU9wdHMuc2V0QWxsb3dKYXZhRW5jb2RpbmdzKHRydWUpOwotCQkJZG9tT3B0cy5zZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXModHJ1ZSk7Ci0JCQlkb21PcHRzLnNldFZhbGlkYXRlKGlzVmFsaWRhdGluZygpKTsKLQkJCWRvY3VtZW50ID0gRE9NVXRpbGl0aWVzLmxvYWREb2N1bWVudChpbiwgZG9tT3B0cywgZ2V0UmVzb3VyY2UoKS5nZXRFbnRpdHlSZXNvbHZlcigpKTsKLQkJCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0X3JleCkgewotCQkJdGhyb3cgdF9yZXg7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewotCQkJdGhyb3cgaW94OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvU2F2ZShPdXRwdXRTdHJlYW0sIE1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpOwotCQlzZXJpYWxpemVEb2N1bWVudChvdXRwdXRTdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIGFkYXB0ZXJzIGFyZSBub3QgY2FjaGVkIHdpdGhpbiB0aGlzIHJlbmRlcmVyLCBlLmcuLCB0aGV5IGFyZQotCSAqIHN0b3JlZCBpbiBub3RpZnlpbmcgTm9kZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW5hZ2VzRE9NQWRhcHRlcnMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRET01BZGFwdGVyUmVnaXN0cnkoKSB7Ci0JCWlmIChkb21BZGFwdGVyUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWRvbUFkYXB0ZXJSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJET01BZGFwdGVyKE5vZGUgbm9kZSwgRU1GMkRPTUFkYXB0ZXIgYWRhcHRlcikgewotCQlkb21BZGFwdGVyUmVnaXN0cnkucHV0KG5vZGUsIGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NQWRhcHRlciBnZXRFeGlzdGluZ0RPTUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoRU1GMkRPTUFkYXB0ZXIpIGRvbUFkYXB0ZXJSZWdpc3RyeS5nZXQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJZG9tQWRhcHRlclJlZ2lzdHJ5LnJlbW92ZShhTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZXBhcmVUb0FkZENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpIHsKLQkJLy8gY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY3JlYXRlRE9NVHJlZSgpIHsKLQkJY3JlYXRlRG9jdW1lbnQoKTsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZVJvb3RET01BZGFwdGVyKCk7Ci0JCWFkYXB0ZXIudXBkYXRlRE9NKCk7Ci0JCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZVJvb3RET01BZGFwdGVyKCkgewotCQlFTUYyRE9NQWRhcHRlciByb290ID0gbmV3IEVNRjJET01BZGFwdGVySW1wbChnZXRSZXNvdXJjZSgpLCBkb2N1bWVudCwgdGhpcywgZ2V0UmVzb3VyY2UoKS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQkJcmVnaXN0ZXJET01BZGFwdGVyKGRvY3VtZW50LCByb290KTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChuZWVkc1RvQ3JlYXRlRE9NKQotCQkJY3JlYXRlRE9NVHJlZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBEb2N1bWVudCBnaXZlbgotCSAqIAotCSAqIEBhUmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCVRyYW5zbGF0b3JSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZSgpOwotCQlyZXMuc2V0RGVmYXVsdHMoKTsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRE9NVXRpbGl0aWVzLmNyZWF0ZU5ld0RvY3VtZW50KHJlcy5nZXREb2N0eXBlKCksIHJlcy5nZXRQdWJsaWNJZCgpLCByZXMuZ2V0U3lzdGVtSWQoKSk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemVEb2N1bWVudChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKgotCQkgKiBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gY3JlYXRlT3V0cHV0Rm9ybWF0KCk7IFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9Ci0JCSAqIFNlcmlhbGl6ZXJGYWN0b3J5LmdldFNlcmlhbGl6ZXJGYWN0b3J5KE1ldGhvZC5YTUwpLm1ha2VTZXJpYWxpemVyKG91dCwgZm9ybWF0KTsKLQkJICogc2VyaWFsaXplci5hc0RPTVNlcmlhbGl6ZXIoKS5zZXJpYWxpemUoZG9jdW1lbnQpOwotCQkgKi8KLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQkvKgotCQkJICogdHJ5IHsgZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaAotCQkJICogKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7IH0KLQkJCSAqLwotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJubyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1BVQkxJQywgZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpKTsKLQkJCWlmIChnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIAotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQkvKiBzb3VyY2Uuc2V0U3lzdGVtSWQoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsgKi8KLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIE91dHB1dEZvcm1hdCBjcmVhdGVPdXRwdXRGb3JtYXQoKSB7IE91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT3V0cHV0Rm9ybWF0KCk7Ci0JICogZm9ybWF0LnNldEluZGVudGluZyh0cnVlKTsgZm9ybWF0LnNldExpbmVTZXBhcmF0b3IoRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HKTsKLQkgKiAvLyROT04tTkxTLTEkIGZvcm1hdC5zZXRFbmNvZGluZyhnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOwotCSAqIGZvcm1hdC5zZXRWZXJzaW9uKGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsgcmV0dXJuIGZvcm1hdDsgfQotCSAqLwotCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCVJldmlzaXQucmV2aXNpdCgpOwotCQlEb2N1bWVudCBuZXdEb2MgPSBudWxsOwotCQkvLyBOZWVkIGJlIGFibGUgdG8gdXBkYXRlIHRoZSBkb2N0eXBlIGRpcmVjdGx5IG9uIHRoZSBleGlzdGluZyBkb2N1bWVudDsgcmlnaHQgbm93IGNhbid0Ci0JCS8vIGJlY2F1c2UKLQkJLy8gb2YgbGltaXRhdGlvbnMgb24gcGFyc2VyIG5ldXRyYWwgYXBpcwotCi0JCXRyeSB7Ci0JCQluZXdEb2MgPSBET01VdGlsaXRpZXMuY3JlYXRlTmV3RG9jdW1lbnQoZG9jVHlwZU5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCX0KLQotCi0JCXJlcGxhY2VOb2RlKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLCBuZXdEb2MsIG5ld0RvYyk7Ci0JCXJlYWRhcHQoZG9jdW1lbnQsIG5ld0RvYyk7Ci0JCWRvY3VtZW50ID0gbmV3RG9jOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKE5vZGUgb2xkQ2hpbGQsIE5vZGUgbmV3UGFyZW50LCBEb2N1bWVudCBuZXdEb2MpIHsKLQkJTm9kZSBuZXdDaGlsZCA9IG5ld0RvYy5pbXBvcnROb2RlKG9sZENoaWxkLCBmYWxzZSk7Ci0JCW5ld1BhcmVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7Ci0JCXJlYWRhcHQob2xkQ2hpbGQsIG5ld0NoaWxkKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBvbGRDaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBsZW5ndGggPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcmVwbGFjZU5vZGUoY2hpbGRyZW4uaXRlbShpKSwgbmV3Q2hpbGQsIG5ld0RvYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVVbmxvYWQoKSB7Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHJlc291cmNlLmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5yZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWFkYXB0KE5vZGUgb2xkQ2hpbGQsIE5vZGUgbmV3Q2hpbGQpIHsKLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nRE9NQWRhcHRlcihvbGRDaGlsZCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJlZ2lzdGVyRE9NQWRhcHRlcihuZXdDaGlsZCwgYWRhcHRlcik7Ci0JCQkvLyBTb21lIG5vZGVzIGFyZSBtYW5hZ2VkIGJ5IHRoZSBwYXJlbnQgYW5kIHRodXMgdGhlCi0JCQkvLyBub2RlIHNob3VsZCBub3QgYmUgc2V0IG9uIHRoZSBwYXJlbnQgYWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIuZ2V0Tm9kZSgpID09IG9sZENoaWxkKQotCQkJCWFkYXB0ZXIuc2V0Tm9kZShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCkuZ2V0VmVyc2lvbklEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTU2MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSBleHRlbmRzIFJlbmRlcmVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJET01SZW5kZXJlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSgpOwotCi0JcHVibGljIEVNRjJET01SZW5kZXJlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSNjcmVhdGVSZW5kZXJlcigpCi0JICovCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgRU1GMkRPTVJlbmRlcmVyKCk7Ci0JCXJlbmRlcmVyLnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOwotCQlyZXR1cm4gcmVuZGVyZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1N2EwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIElOU1RBTkNFID0gbmV3IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyI2dldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWERvY3VtZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWERvY3VtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjViYjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGUgRU1GMlNBWERvY3VtZW50SGFuZGxlciBpcyB1dGlsaXplZCBieSB0aGUgU0FYIHBhcnNlciB0byBhbm5vdW5jZSBYTUwgRXZlbnRzLCBzdWNoIGFzCi0gKiBiZWdpbm5pbmcgYW5kIGVuZCBvZiBYTUwgZWxlbWVudHMgYW5kIHRoZSBjb250ZW50cyBvZiB0aG9zZSBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgZmluYWwgQ2FjaGVFdmVudFN0YWNrIGV2ZW50U3RhY2sgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7Ci0JcHJpdmF0ZSBDYWNoZUV2ZW50UG9vbCBhdmFpbGFibGVFdmVudFBvb2wgPSBuZXcgQ2FjaGVFdmVudFBvb2woKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIHRvIHBvcHVsYXRlIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAgCi0JICovCi0JcHVibGljIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJdGhpcy5yZXNvdXJjZS5zZXREb2N0eXBlVmFsdWVzKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0KLQkJdHJ5IHsKLQkJCUVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gdGhpcy5yZXNvdXJjZS5nZXRFbnRpdHlSZXNvbHZlcigpOwotCi0JCQlpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBlbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oaW9lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIFRoZSBlbmREb2N1bWVudCgpIG1ldGhvZCBzaG91bGQgaGF2ZSBmcm96ZW4gdGhlIHBvb2wsIG9yIGl0IG1heSBub3QgYmUgd2FybWVkIHlldC4gSW4KLQkJICogZWl0aGVyIGNhc2UsIHRoaXMgbWV0aG9kIGNhbGwgd2lsbCBkbyBhcyBsaXR0bGUgd29yayBhcyBuZWNlc3NhcnkKLQkJICovCi0JCWF2YWlsYWJsZUV2ZW50UG9vbC53YXJtUG9vbCgpOwotCi0JCS8qIFRoaXMgbGluZSBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IGlzIGxlZnQgZm9yIHNhZnR5ICovCi0JCWV2ZW50U3RhY2suY2xlYXIoKTsKLQkJdGhpcy5jcmVhdGVSb290KHRoaXMucmVzb3VyY2UpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJYWRkVG9TdGFjayhxTmFtZSwgYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjdXJyZW50UmVjb3JkID0gZ2V0Q3VycmVudFJlY29yZCgpOwotCQlpZiAoY3VycmVudFJlY29yZCAhPSBudWxsKSB7Ci0JCQljdXJyZW50UmVjb3JkLmFwcGVuZFRvQnVmZmVyKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlDYWNoZUV2ZW50Tm9kZSBjdXJyZW50UmVjb3JkID0gbnVsbDsKLQotCQkvKgotCQkgKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgRE9NUGF0aCB3YXMgaWdub3JlZCBzbyB0aGUgc3RhY2sgZG9lcyBub3QKLQkJICogcXVpdGUgbWF0Y2ggd2l0aCB0aGUgWE1MIGRhdGEgc3RydWN0dXJlLiBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90aGluZwotCQkgKi8KLQkJaWYgKHFOYW1lLmVxdWFscyh0aGlzLmdldEN1cnJlbnRSZWNvcmQoKS5nZXROb2RlTmFtZSgpKSkgewotCQkJY3VycmVudFJlY29yZCA9IHRoaXMucmVtb3ZlQ3VycmVudFJlY29yZCgpOwotCQkJaWYgKGN1cnJlbnRSZWNvcmQgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRSZWNvcmQuY29tbWl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlDYWNoZUV2ZW50Tm9kZSBsYXN0UmVjb3JkID0gdGhpcy5yZW1vdmVDdXJyZW50UmVjb3JkKCk7Ci0JCWxhc3RSZWNvcmQuY29tbWl0KCk7Ci0JCWF2YWlsYWJsZUV2ZW50UG9vbC5mcmVlemVQb29sKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNmYXRhbEVycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhleCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSb290KFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZUFyZykgewotCQl0aGlzLmV2ZW50U3RhY2sucHVzaChhdmFpbGFibGVFdmVudFBvb2wuY3JlYXRlQ2FjaGVFdmVudE5vZGUocmVzb3VyY2VBcmcpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1N0YWNrKFN0cmluZyBub2RlTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCUNhY2hlRXZlbnROb2RlIHBhcmVudCA9IHRoaXMuZ2V0Q3VycmVudFJlY29yZCgpOwotCQlpZiAoIXBhcmVudC5pc0NoaWxkSWdub3JhYmxlKG5vZGVOYW1lKSkgewotCQkJdGhpcy5ldmVudFN0YWNrLnB1c2goYXZhaWxhYmxlRXZlbnRQb29sLmNyZWF0ZUNhY2hlRXZlbnROb2RlKHBhcmVudCwgbm9kZU5hbWUsIGF0dHJpYnV0ZXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBDRU5PIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgZXZlbnQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBDRU5PIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVFdmVudE5vZGUgZ2V0Q3VycmVudFJlY29yZCgpIHsKLQkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCF0aGlzLmV2ZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmV2ZW50U3RhY2sucGVlaygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IENFTk8gYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBldmVudCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IENFTk8gYW5kIHJlbW92ZSBpdAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUV2ZW50Tm9kZSByZW1vdmVDdXJyZW50UmVjb3JkKCkgewotCQlDYWNoZUV2ZW50Tm9kZSByZXN1bHQgPSBudWxsOwotCQlpZiAoIXRoaXMuZXZlbnRTdGFjay5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZXZlbnRTdGFjay5wb3AoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCXByaXZhdGUgZmluYWwgdm9pZCBwcmludFN0YWNrKCkgewotCS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50aW5nIHN0YWNrIC4uLiIpOwotCS8vCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXZlbnRTdGFjay5zaXplKCk7IGkrKykgewotCS8vCQkvLyBkZWJ1Zygic3RhY2tbIiArIGkgKyAiXTogIiArIGV2ZW50U3RhY2suZ2V0KGkpKTsKLQkvLwkJLy8gfQotCS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLiBQcmludGVkIHN0YWNrIik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBkZWJ1ZyhPYmplY3Qgb2JqKSB7Ci0JLy8JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihvYmopOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgd2FybihPYmplY3Qgb2JqKSB7Ci0JLy8JCS8vU3lzdGVtLmVyci5wcmludGxuKG9iaik7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY3MjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWFJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUYyU0FYUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcoKSk7Ci0JCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJLyoKLQkJCSAqIENhdXNlcyBlcnJvcnMgaW4gSUJNIEpESyB0cnkgeyBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwKLQkJCSAqIFczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQotCQkJICovCi0JCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRU1GMlNBWERvY3VtZW50SGFuZGxlcih0aGlzLmdldFJlc291cmNlKCkpOwotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBpc1ZhbGlkYXRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIGlzVmFsaWRhdGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0cnkgewotCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLyoKLQkJCSAqIHRyeSB7IHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7IH0KLQkJCSAqIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsgfQotCQkJICovCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9yZWFkZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihoYW5kbGVyKTsKLQkJCUlucHV0U291cmNlIHRlc3Rzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOwotCQkJcmVhZGVyLnBhcnNlKHRlc3Rzb3VyY2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHRfcmV4KSB7Ci0JCQl0aHJvdyB0X3JleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9TYXZlKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkvKgotCQkgKiB0cnkgeyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQotCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXRwdXRTdHJlYW0sCi0JCSAqIGNyZWF0ZU91dHB1dEZvcm1hdCgpKTsgc2VyaWFsaXplci5zZXRPdXRwdXRCeXRlU3RyZWFtKG91dHB1dFN0cmVhbSk7IENvbnRlbnRIYW5kbGVyCi0JCSAqIGhhbmRsZXIgPSBzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKTsKLQkJICovCi0KLQkJVHJhbnNmb3JtZXJIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlTQVhUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJCWhhbmRsZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOwotCi0JCQkJaGFuZGxlci5zZXRSZXN1bHQobmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGhhbmRsZXIuZ2V0VHJhbnNmb3JtZXIoKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAgICAgCi0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7Ci0JCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQotCQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOwotCi0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoIlNBWCBXcml0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJRU1GMlNBWFdyaXRlciB3cml0ZXIgPSBuZXcgRU1GMlNBWFdyaXRlcigpOwotCQkJd3JpdGVyLnNlcmlhbGl6ZSh0aGlzLnJlc291cmNlLCBoYW5kbGVyKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNheGUpIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKHNheGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcm90ZWN0ZWQgT3V0cHV0Rm9ybWF0IGNyZWF0ZU91dHB1dEZvcm1hdCgpIHsgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKLQkgKiBmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOyBmb3JtYXQuc2V0TGluZVNlcGFyYXRvcihET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkcpOwotCSAqIC8vJE5PTi1OTFMtMSQgZm9ybWF0LnNldEVuY29kaW5nKGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7Ci0JICogZm9ybWF0LnNldFZlcnNpb24oZ2V0UmVzb3VyY2UoKS5nZXRYTUxWZXJzaW9uKCkpOyBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKQotCSAqIGZvcm1hdC5zZXREb2N0eXBlKHRoaXMucmVzb3VyY2UuZ2V0UHVibGljSWQoKSwgdGhpcy5yZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsgcmV0dXJuIGZvcm1hdDsgfQotCSAqLwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZXBhcmVUb0FkZENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZ2V0VmVyc2lvbklEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCkuZ2V0VmVyc2lvbklEKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhSZW5kZXJlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDE5LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLS8qKgotICogVXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoZSBFTUYyU0FYUmVuZGVyZXIKLSAqIAotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwcm90ZWN0ZWQgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5I2NyZWF0ZVJlbmRlcmVyKCkKLQkgKi8KLQlwdWJsaWMgUmVuZGVyZXIgY3JlYXRlUmVuZGVyZXIoKSB7Ci0JCUVNRjJTQVhSZW5kZXJlciByZW5kZXJlciA9IG5ldyBFTUYyU0FYUmVuZGVyZXIoKTsKLQkJcmVuZGVyZXIuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcoKSk7Ci0JCXJldHVybiByZW5kZXJlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYV3JpdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NTU3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7Ci0KLS8qKgotICogVGhlIEVNRjJTQVhXcml0ZXIgaGFuZGxlcyB0aGUgc2VyaWFsaXphdGlvbiBvZiBFTUYgUmVzb3VyY2VzIHVzaW5nIFNBWCBldmVudHMuIFNBWCBldmVudHMgYXJlCi0gKiB0cmlnZ2VyZWQgdG8gdGhlIGNvbnRlbnQgaGFuZGxlciBhcyB0aGUgdHJlZSBpcyBiZWluZyBwYXJzZWQuIFRoZXNlIGV2ZW50cyBjYW4gdGhlbiBiZSB3cml0dGVuCi0gKiBpbnRvIGFueSBzdHJlYW0gd3JhcHBlZCBieSB0aGUgQ29udGVudEhhbmRsZXIuCi0gKiAKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRU1GMlNBWFdyaXRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAiIjsvLyJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogVXNlZCBpbiB0aG9zZSBjYXNlcyB3aGVyZSBubyBBdHRyaWJ1dGVzIGFyZSBuZWNlc3NhcnkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVzIEVNUFRZX0FUVFJJQlVURVMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKLQotCS8qKgotCSAqIFNlcmlhbGl6ZSBhbiBFTUYgcmVzb3VyY2UgaW50byBhbiBYTUwgU3RyZWFtIHVzaW5nIHRoZSBnaXZlbiBDb250ZW50SGFuZGxlci4gTm90ZSB0aGF0IHRoaXMKLQkgKiBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCB0byBjb3B5IGEgZ2l2ZW4gRU1GIFJlc291cmNlIGlmIHRoZSBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGlzIHVzZWQgYXMKLQkgKiB0aGUgZ2l2ZW4gQ29udGVudEhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBDb250ZW50SGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlUcmFuc2xhdG9yIHJvb3RUcmFuc2xhdG9yID0gcmVzb3VyY2UuZ2V0Um9vdFRyYW5zbGF0b3IoKTsKLQkJRUxpc3QgY29udGVudHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCi0JCWlmIChjb250ZW50cy5zaXplKCkgIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGNvbnRlbnRzIG9mIGEgcmVzb3VyY2UgbWF5IG9ubHkgY29udGFpbiBvbmUgRU1GIE1vZGVsIE9iamVjdC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWhhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlzZXJpYWxpemUoaGFuZGxlciwgZWxlbWVudCwgcm9vdFRyYW5zbGF0b3IsIG5ldyBXcml0ZXJIaW50cyhyZXNvdXJjZSkpOwotCQloYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VyaWFsaXplKENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIEVPYmplY3QgdGFyZ2V0LCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIFdyaXRlckhpbnRzIGhpbnRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlMaXN0IG1vZkNoaWxkcmVuID0gbnVsbDsKLQkJT2JqZWN0IHJhd1ZhbHVlID0gbnVsbDsKLQkJRU9iamVjdCBuZXdUYXJnZXQgPSBudWxsOwotCQlUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgPSBudWxsOwotCQlUcmFuc2xhdG9yIG5leHRUcmFuc2xhdG9yID0gbnVsbDsKLQkJY2hhcltdIGNoYXJhY3RlckRhdGEgPSBudWxsOwotCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBudWxsOwotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBudWxsOwotCQlTdHJpbmcgY2hpbGREb21OYW1lID0gbnVsbDsKLQkJZmluYWwgaW50IHZlcnNpb24gPSBoaW50cy5nZXRWZXJzaW9uKCk7Ci0KLQkJLyoKLQkJICogUHJvY2Vzc2luZyBoaW50cyBhcmUgdXNlZCB0byByZW1lbWJlciB3aGVyZSBhcmUgaW4gdGhlIGl0ZXJhdGlvbiBvZiB0aGUgdHJhbnNsYXRvcidzCi0JCSAqIGNoaWxkcmVuLiBzZWUgdGhlIFRyYW5zbGF0b3JGaWx0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRoaXMgYXJyYXkgaXMgdXNlZC4KLQkJICovCi0JCWludFtdIHByb2Nlc3NpbmdIaW50cyA9IFRyYW5zbGF0b3JGaWx0ZXIuY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCk7Ci0KLQkJU3RyaW5nIHRhcmdldERvbU5hbWUgPSB0cmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKLQotCQlhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcyh0cmFuc2xhdG9yLCB0YXJnZXQsIGhpbnRzKTsKLQotCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIHRhcmdldERvbU5hbWUsIHRhcmdldERvbU5hbWUsIGF0dHJpYnV0ZXMpOwotCi0JCWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgPSBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRPYmplY3RUcmFuc2xhdG9yKHRyYW5zbGF0b3IsIHByb2Nlc3NpbmdIaW50c1tUcmFuc2xhdG9yRmlsdGVyLk5FWFRfU1RBUlRfSElOVF9JTkRYXSwgcHJvY2Vzc2luZ0hpbnRzLCB0YXJnZXQsIHZlcnNpb24pOwotCQl3aGlsZSAoY3VycmVudENoaWxkVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQkvKiBGb3IgZWFjaCBDaGlsZCBUcmFuc2xhdG9yIG9mIHRoZSBUcmFuc2xhdG9yIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgbWV0aG9kICovCi0KLQkJCS8qIERvZXMgdGhlIFRyYW5zbGF0b3IgaGF2ZSBhbnkgTU9GIENoaWxkcmVuPyAqLwotCQkJbW9mQ2hpbGRyZW4gPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldE1PRkNoaWxkcmVuKHRhcmdldCk7Ci0JCQlvcGVuRG9tUGF0aElmTmVjZXNzYXJ5KGhhbmRsZXIsIGhpbnRzLCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCB0YXJnZXQsIG1vZkNoaWxkcmVuKTsKLQotCQkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgewotCQkJCS8qCi0JCQkJICogVHJhbnNsYXRvcnMgd2hpY2ggYXJlIG1hbmFnZWQgYnkgdGhlaXIgcGFyZW50cyByZXF1aXJlIGxlc3MgcHJvY2Vzc2luZyAtLSBqdXN0Ci0JCQkJICogY29udmVydCB0aGVpciB2YWx1ZSB0byBhIHN0cmluZyBhbmQgd3JpdGUgaXQgb3V0IGFzIHRoZSBjb250ZW50IG9mIGFuIFhNTCBlbGVtZW50Ci0JCQkJICovCi0JCQkJY2hpbGREb21OYW1lID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0JCQkJaWYgKCFjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzRW1wdHlUYWcoKSkgewotCQkJCQkvKiBUaGUgVHJhbnNsYXRvciBpcyBub3QgYW4gRW1wdHkgdGFnLiBJdHMgdGV4dCBjb250ZW50IGlzIHNpZ25pZmljYW50ICovCi0KLQkJCQkJaWYgKG1vZkNoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQotCQkJCQkJCS8qIFRleHQgb25seSB0cmFuc2xhdG9ycyB3aWxsIG5vdCBoYXZlIG9wZW4gYW5kIGNsb3NlIFhNTCBlbGVtZW50cyAqLwotCQkJCQkJCWlmICghY3VycmVudENoaWxkVHJhbnNsYXRvci5pc0RPTVRleHRWYWx1ZSgpKQotCQkJCQkJCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCBFTVBUWV9BVFRSSUJVVEVTKTsKLQotCQkJCQkJCXJhd1ZhbHVlID0gbW9mQ2hpbGRyZW4uZ2V0KGopOwotCQkJCQkJCS8qIGNvbnZlcnRWYWx1ZVRvU3RyaW5nIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgbm9uLW51bGwgU3RyaW5nICovCi0JCQkJCQkJY29udmVydGVkVmFsdWUgPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHJhd1ZhbHVlLCB0YXJnZXQpOwotCQkJCQkJCWNoYXJhY3RlckRhdGEgPSBYTUxFbmNvZGVyRGVjb2Rlci5lc2NhcGUoY29udmVydGVkVmFsdWUpLnRvQ2hhckFycmF5KCk7Ci0JCQkJCQkJaGFuZGxlci5jaGFyYWN0ZXJzKGNoYXJhY3RlckRhdGEsIDAsIGNoYXJhY3RlckRhdGEubGVuZ3RoKTsKLQotCQkJCQkJCWlmICghY3VycmVudENoaWxkVHJhbnNsYXRvci5pc0RPTVRleHRWYWx1ZSgpKQotCQkJCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBUaGUgVHJhbnNsYXRvciBpcyBhbiBFbXB0eSBFbGVtZW50IChpdHMgbWVyZSBwcmVzZW5jZSBoYXMgc2lnbmlmaWNhbmNlKSAoZS5nLgotCQkJCQkgKiA8Y2FzY2FkZS1kZWxldGUvPgotCQkJCQkgKi8KLQotCQkJCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5pc0Jvb2xlYW5GZWF0dXJlKCkpIHsKLQkJCQkJCS8qIEJvb2xlYW4gZmVhdHVyZXMgbWF5IG9yIG1heSBub3QgYmUgcmVuZGVyZWQgKi8KLQkJCQkJCXJhd1ZhbHVlID0gbW9mQ2hpbGRyZW4uZ2V0KDApOwotCQkJCQkJaWYgKHJhd1ZhbHVlICE9IG51bGwgJiYgKChCb29sZWFuKSByYXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCBFTVBUWV9BVFRSSUJVVEVTKTsKLQkJCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIEFsd2F5cyByZW5kZXIgYW55IG90aGVyIEVtcHR5IGVsZW1lbnRzICovCi0JCQkJCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCBFTVBUWV9BVFRSSUJVVEVTKTsKLQkJCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0KLQkJCQkvKiBUaGUgVHJhbnNsYXRvciBpcyBhIG1vcmUgY29tcGxleCBmZWF0dXJlLCBoYW5kbGUgaXRzIHByb2Nlc3NpbmcgcmVjdXJzaXZlbHkgKi8KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7Ci0JCQkJCW5ld1RhcmdldCA9IChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaik7Ci0JCQkJCXNlcmlhbGl6ZShoYW5kbGVyLCBuZXdUYXJnZXQsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIGhpbnRzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIEZldGNoIHRoZSBuZXh0IHBlZXIgdHJhbnNsYXRvciAqLwotCQkJbmV4dFRyYW5zbGF0b3IgPSBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRPYmplY3RUcmFuc2xhdG9yKHRyYW5zbGF0b3IsIHByb2Nlc3NpbmdIaW50c1tUcmFuc2xhdG9yRmlsdGVyLk5FWFRfU1RBUlRfSElOVF9JTkRYXSwgcHJvY2Vzc2luZ0hpbnRzLCB0YXJnZXQsIHZlcnNpb24pOwotCi0JCQljbG9zZURvbVBhdGhJZk5lY2Vzc2FyeShoYW5kbGVyLCBoaW50cywgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbmV4dFRyYW5zbGF0b3IsIHRhcmdldCwgbW9mQ2hpbGRyZW4pOwotCi0JCQkvKgotCQkJICogV2UgbmVlZGVkIHRvIGludm9rZSBjbG9zZURvbVBhdGhJZk5lY2Vzc2FyeSgpIHdpdGggdGhlIHBlZXIsIG5vdyB3ZSBtb3ZlIG9uIHRvCi0JCQkgKiBwcm9jZXNzIHRoYXQgcGVlcgotCQkJICovCi0JCQljdXJyZW50Q2hpbGRUcmFuc2xhdG9yID0gbmV4dFRyYW5zbGF0b3I7Ci0KLQkJfQotCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCB0YXJnZXREb21OYW1lLCB0YXJnZXREb21OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgRE9NIFBhdGggc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsCi0JICogZm9yIGRldGVybWluaW5nIHdoZXRoZXIgRW1wdHkgWE1MIGVsZW1lbnRzIGFyZSByZWxldmFudCBhbmQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIFhNTAotCSAqIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KLQkgKiBAcGFyYW0gY3VycmVudENoaWxkVHJhbnNsYXRvcgotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgVHJhbnNsYXRvcgotCSAqIEBwYXJhbSBtb2ZDaGlsZHJlbgotCSAqICAgICAgICAgICAgVGhlIG1vZkNoaWxkcmVuIHRoYXQgd2VyZSBmb3VuZCBmb3IgdGhlIFRyYW5zbGF0b3Igb24gdGhlIFRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUmVuZGVyRG9tUGF0aChFT2JqZWN0IHRhcmdldCwgVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBMaXN0IG1vZkNoaWxkcmVuKSB7Ci0JCXJldHVybiAgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3Iuc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKHRhcmdldCkgfHwgbW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogb3BlbkRvbVBhdGhJZk5lY2Vzc2FyeSB3aWxsIHdyaXRlIHRoZSBjdXJyZW50IERPTSBQYXRoIHRvIHRoZSBzZXJpYWxpemF0aW9uIHN0cmVhbSBpZiBpdCBoYXMKLQkgKiBub3QgYmVlbiB3cml0dGVuIGJ5IGEgcHJldmlvdXMgcGVlciB0cmFuc2xhdG9yLiBUaGUgcHJvY2Vzc2luZyByZXN1bHRzIGluIHRoZSBjb2xsYXBzZSBvZgotCSAqIFBlZXIgVHJhbnNsYXRvcnMgd2l0aCBtYXRjaGluZyBET00gUGF0aHMgaW50byBhIHNpbmdsZSBYTUwgcGFyZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiAgICAgICAgICAgIFRoZSBDb250ZW50SGFuZGxlciB3aGljaCBpcyB3cml0aW5nIHRoZSBYTUwgcmVzdWx0Ci0JICogQHBhcmFtIGhpbnRzCi0JICogICAgICAgICAgICBBIEdsb2JhbCBjb250YWluZXIgZm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgc2luZ2xlIFhNTCBkb2N1bWVudAotCSAqIEBwYXJhbSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgYWN0aXZlIFRyYW5zbGF0b3IgYmVpbmcgcHJvY2Vzc2VkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkRvbVBhdGhJZk5lY2Vzc2FyeShDb250ZW50SGFuZGxlciBoYW5kbGVyLCBXcml0ZXJIaW50cyBoaW50cywgVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBFT2JqZWN0IHRhcmdldCwgTGlzdCBtb2ZDaGlsZHJlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJLyogSWYgdGhlIHRyYW5zbGF0b3IgZG9lcyBub3QgaGF2ZSBhIERPTSBQYXRoLCB0aGVuIHdlIGRvIG5vdGhpbmcgKi8KLQkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaGFzRE9NUGF0aCgpICYmIHNob3VsZFJlbmRlckRvbVBhdGgodGFyZ2V0LCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBtb2ZDaGlsZHJlbikpIHsKLQotCQkJU3RyaW5nIGNoaWxkRG9tUGF0aCA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOwotCi0JCQkvKgotCQkJICogSXNEb21QYXRoQWN0aXZlKCkgd2lsbCB2ZXJpZnkgd2hldGhlciB0aGlzIERPTSBQYXRoIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUKLQkJCSAqIFhNTCBzdHJlYW0KLQkJCSAqLwotCQkJaWYgKCFoaW50cy5pc0RvbVBhdGhBY3RpdmUoY2hpbGREb21QYXRoKSkgewotCi0JCQkJLyoKLQkJCQkgKiBXcml0ZSBhbiBvcGVuIGVsZW1lbnQgZm9yIHRoZSBET00gUGF0aCBhbmQgInJlbWVtYmVyIiB0aGF0IHdlIGhhdmUgd3JpdHRlbiBpdAotCQkJCSAqLwotCQkJCWhhbmRsZXIuc3RhcnRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21QYXRoLCBjaGlsZERvbVBhdGgsIEVNUFRZX0FUVFJJQlVURVMpOwotCQkJCWhpbnRzLnB1c2hEb21QYXRoKGNoaWxkRG9tUGF0aCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5IHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5leHQgcGVlciBUcmFuc2xhdG9yIHNoYXJlcyB0aGUgYWN0aXZlIERPTQotCSAqIFBhdGggb2YgdGhlIGN1cnJlbnQgVHJhbnNsYXRvci4gSWYgdGhlIG5leHQgcGVlciBUcmFuc2xhdG9yIGhhcyB0aGUgc2FtZSBET00gUGF0aCwgbm8gYWN0aW9uCi0JICogd2lsbCBiZSB0YWtlbiAoaGVuY2UgY29uZGVuc2luZyB0aGUgZWxlbWVudHMgaW50byBhIHNpbmdsZSBYTUwgcGFyZW50KS4gSG93ZXZlciwgaWYgdGhlIERPTQotCSAqIFBhdGggZGlmZmVycyAoaW5jbHVkaW5nIHRoZSBOZXh0IFBlZXIgVHJhbnNsYXRvciBoYXMgbm8gRE9NIFBhdGgpIHRoZW4gdGhlIGN1cnJlbnQgRE9NIFBhdGgKLQkgKiB3aWxsIGJlIGNsb3NlZCAoYSBjbG9zZSBYTUwgZWxlbWVudCBpcyBnZW5lcmF0ZWQuCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiAgICAgICAgICAgIFRoZSBDb250ZW50SGFuZGxlciB3aGljaCBpcyB3cml0aW5nIHRoZSBYTUwgcmVzdWx0Ci0JICogQHBhcmFtIGhpbnRzCi0JICogICAgICAgICAgICBBIEdsb2JhbCBjb250YWluZXIgZm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgc2luZ2xlIFhNTCBkb2N1bWVudAotCSAqIEBwYXJhbSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yCi0JICogICAgICAgICAgICBUaGUgbGFzdCBUcmFuc2xhdG9yIHRvIGhhdmUgY29tcGxldGVkIHByb2Nlc3NpbmcKLQkgKiBAcGFyYW0gbmV4dFRyYW5zbGF0b3IKLQkgKiAgICAgICAgICAgIFRoZSBuZXh0IHBlZXIgVHJhbnNsYXRvciB0aGF0IHdpbGwgYmVjb21lIGFjdGl2ZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlRG9tUGF0aElmTmVjZXNzYXJ5KENvbnRlbnRIYW5kbGVyIGhhbmRsZXIsIFdyaXRlckhpbnRzIGhpbnRzLCBUcmFuc2xhdG9yIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIFRyYW5zbGF0b3IgbmV4dFRyYW5zbGF0b3IsIEVPYmplY3QgdGFyZ2V0LCBMaXN0IG1vZkNoaWxkcmVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlpZiAoY3VycmVudENoaWxkVHJhbnNsYXRvci5oYXNET01QYXRoKCkgJiYgc2hvdWxkUmVuZGVyRG9tUGF0aCh0YXJnZXQsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG1vZkNoaWxkcmVuKSkgewotCQkJU3RyaW5nIGNoaWxkRG9tUGF0aCA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOwotCQkJaWYgKG5leHRUcmFuc2xhdG9yICE9IG51bGwpIHsgLyoKLQkJCQkJCQkJCQkgICAqIFRoZXJlIGFyZSBtb3JlIHBlZXJzIGFmdGVyIHRoaXMgZWxlbWVudCwgd2UgY2FuIHBlZWsKLQkJCQkJCQkJCQkgICAqIGFoZWFkCi0JCQkJCQkJCQkJICAgKi8KLQkJCQlTdHJpbmcgbmV4dFBlZXJEb21QYXRoID0gbmV4dFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOwotCQkJCWlmIChuZXh0UGVlckRvbVBhdGggPT0gbnVsbCB8fCAhbmV4dFBlZXJEb21QYXRoLmVxdWFscyhjaGlsZERvbVBhdGgpKSB7Ci0JCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tUGF0aCwgY2hpbGREb21QYXRoKTsKLQkJCQkJaGludHMucG9wRG9tUGF0aCgpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsgLyogVGhpcyB3YXMgdGhlIGxhc3QgY2hpbGQgZWxlbWVudCwgd2UgbXVzdCBjbG9zZSB0aGUgZG9tcGF0aCAqLwotCQkJCWhhbmRsZXIuZW5kRWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tUGF0aCwgY2hpbGREb21QYXRoKTsKLQkJCQloaW50cy5wb3BEb21QYXRoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZ2dyZWdhdGUgdGhlIEF0dHJpYnV0ZSB0cmFuc2xhdG9yIGNoaWxkcmVuIGZyb20gYSBnaXZlbiB0cmFuc2xhdG9yLiBUaGlzIG1ldGhvZCB3aWxsIHJlcXVlc3QKLQkgKiB0aGUgQXR0cmlidXRlc0ltcGwgb2JqZWN0IGZyb20gdGhlIFdyaXRlckhpbnRzIG9iamVjdC4gVGhlIFdyaXRlckhpbnRzIG1haW50YWlucyB0aGlzCi0JICogcmV1c2FibGUgY29sbGVjdGlvbiB0byBsaW1pdCB0aGUgcmVxdWlyZW1lbnQgZm9yIG5ldyBvYmplY3QgY3JlYXRpb24uCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0b3IKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIGhpbnRzCi0JICogQHJldHVybiBhbiBpbml0aWFsaXplZCBzZXQgb2YgQXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIFRyYW5zbGF0b3IgYW5kIEVNRiBUYXJnZXQKLQkgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIEVPYmplY3QgdGFyZ2V0LCBXcml0ZXJIaW50cyBoaW50cykgewotCi0JCUF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXMgPSBoaW50cy5nZXRBdHRyaWJ1dGVIb2xkZXIoKTsKLQkJaW50IHZlcnNpb24gPSBoaW50cy5nZXRWZXJzaW9uKCk7Ci0JCU9iamVjdCByYXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBjaGlsZERvbU5hbWUgPSBudWxsOwotCQlUcmFuc2xhdG9yIGF0dHJpYnV0ZVRyYW5zbGF0b3IgPSBudWxsOwotCQlpbnRbXSBwcm9jZXNzaW5nSGludHMgPSBUcmFuc2xhdG9yRmlsdGVyLmNyZWF0ZVByb2Nlc3NpbmdIaW50cygpOwotCi0JCXdoaWxlICgoYXR0cmlidXRlVHJhbnNsYXRvciA9IFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IodHJhbnNsYXRvciwgcHJvY2Vzc2luZ0hpbnRzW1RyYW5zbGF0b3JGaWx0ZXIuTkVYVF9TVEFSVF9ISU5UX0lORFhdLCBwcm9jZXNzaW5nSGludHMsIHRhcmdldCwgdmVyc2lvbikpICE9IG51bGwpIHsKLQotCQkJTGlzdCBtb2ZDaGlsZHJlbiA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0TU9GQ2hpbGRyZW4odGFyZ2V0KTsKLQkJCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgewotCi0JCQkJCWNoaWxkRG9tTmFtZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOwotCQkJCQlyYXdWYWx1ZSA9IG1vZkNoaWxkcmVuLmdldChqKTsKLQkJCQkJY29udmVydGVkVmFsdWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHJhd1ZhbHVlLCB0YXJnZXQpOwotCQkJCQljb252ZXJ0ZWRWYWx1ZSA9IFhNTEVuY29kZXJEZWNvZGVyLmVzY2FwZShjb252ZXJ0ZWRWYWx1ZSk7Ci0JCQkJCWF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsICJTdHJpbmciLCBjb252ZXJ0ZWRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGREb21OYW1lID0gYXR0cmlidXRlVHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7Ci0JCQkJY29udmVydGVkVmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldE1PRlZhbHVlKHRhcmdldCk7Ci0JCQkJaWYgKGNvbnZlcnRlZFZhbHVlICE9IG51bGwpCi0JCQkJCWF0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUsICJTdHJpbmciLCBjb252ZXJ0ZWRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXJIaW50cyBpcyB1c2VkIHRvICJyZW1lbWJlciIgY2VydGFpbiBwaWVjZXMgb2YgaW5mb3JtYXRpb24gd2hpbGUgdGhlIHdyaXRlciBpcwotCSAqIHByb2Nlc3NpbmcuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgYXJlIHRoZSB2ZXJzaW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIERPTSBQYXRoIG91dHB1dC4KLQkgKiBDb25zZWN1dGl2ZSBlbGVtZW50cyB3aXRoIGNvbnNpc3RlbnQgKGlkZW50aWNhbCkgRE9NIFBhdGhzIGFyZSBjb2xsYXBzZWQgdW5kZXIgYSBzaW5nbGUgWE1MCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBUaGUgV3JpdGVySGludHMgcHJvdmlkZXMgZ2xvYmFsIHN0YXRlIGJldHdlZW4gcmVjdXJzaXZlIGludm9jYXRpb25zIG9mIHNlcmlhbGl6ZSgpLiBJdCBzaG91bGQKLQkgKiBiZSBub3QgYmUgdXNlZCB0byBzdG9yZSBsb2NhbCBkYXRhIChlLmcuIGRhdGEgdGhhdCBpcyBvbmx5IHJlbGV2YW50IHRvIGEgc2luZ2xlIFRyYW5zbGF0b3IgaW4KLQkgKiBhIGdpdmVuIGNvbnRleHQpLgotCSAqIAotCSAqIFRoZSBXcml0ZXJIaW50cyBhbHNvIHN0b3JlcyBhbiBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgdGhhdCBpcyByZS11c2VkIHRvIHN0b3JlIGF0dHJpYnV0ZXMuIFRoZQotCSAqIGdldEF0dHJpYnV0ZXMoKSBtZXRob2Qgd2lsbCByZXF1ZXN0IHRoZSBBdHRyaWJ1dGVzIEhvbGRlci4KLQkgKiAKLQkgKiBAYXV0aG9yIG1kZWxkZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgY2xhc3MgV3JpdGVySGludHMgewotCQlwcml2YXRlIGZpbmFsIFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBTdGFjayBkb21TdGFjayA9IG5ldyBTdGFjaygpOwotCQlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZXNJbXBsIGF0dHJpYnV0ZXNJbXBsID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7Ci0KLQkJcHVibGljIFdyaXRlckhpbnRzKFRyYW5zbGF0b3JSZXNvdXJjZSByZXMpIHsKLQkJCXRoaXMucmVzb3VyY2UgPSByZXM7Ci0JCX0KLQotCQkvKioKLQkJICogUHVzaCBhIG5ldyBkb21QYXRoIG9udG8gdGhlIHN0YWNrCi0JCSAqIAotCQkgKiBAcGFyYW0gZG9tUGF0aAotCQkgKiAgICAgICAgICAgIGEgRE9NUGF0aCB3aGljaCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBYTUwgc3RyZWFtCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwdXNoRG9tUGF0aChTdHJpbmcgZG9tUGF0aCkgewotCi0JCQlpZiAoZG9tUGF0aCAhPSBudWxsICYmIGRvbVBhdGgubGVuZ3RoKCkgPiAwKQotCQkJCWRvbVN0YWNrLnB1c2goZG9tUGF0aCk7Ci0JCX0KLQotCQkvKioKLQkJICogUG9wIHRoZSBjdXJyZW50IGRvbVBhdGggZnJvbSB0aGUgQXJyYXkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBvcERvbVBhdGgoKSB7Ci0KLQkJCWlmICghZG9tU3RhY2suaXNFbXB0eSgpKQotCQkJCWRvbVN0YWNrLnBvcCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIERPTVBhdGggaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBYTUwgc3RyZWFtCi0JCSAqIAotCQkgKiBAcGFyYW0gZG9tUGF0aAotCQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIERPTVBhdGggaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBYTUwgc3RyZWFtCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0RvbVBhdGhBY3RpdmUoU3RyaW5nIGRvbVBhdGgpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoIWRvbVN0YWNrLmlzRW1wdHkoKSkgewotCi0JCQkJU3RyaW5nIGN1cnJlbnREb21QYXRoID0gKFN0cmluZykgZG9tU3RhY2sucGVlaygpOwotCQkJCWlmIChjdXJyZW50RG9tUGF0aCAhPSBudWxsICYmIGRvbVBhdGggIT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY3VycmVudERvbVBhdGguZXF1YWxzKGRvbVBhdGgpOwotCQkJCWVsc2UgaWYgKCEoY3VycmVudERvbVBhdGggPT0gbnVsbCBeIGRvbVBhdGggPT0gbnVsbCkpCi0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgRU1GIFJlc291cmNlCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRWZXJzaW9uSUQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGFuIGVtcHR5IEF0dHJpYnV0ZXNJbXBsIG9iamVjdCB0byBzdG9yZSBhdHRyaWJ1dGVzLiBXaXRoaW4gdGhlIGNvbnRleHQgb2YgYSBnaXZlbgotCQkgKiBXcml0ZXJIaW50cyBvYmplY3QgKGFuZCBoZW5jZSBzaW5nbGUgWE1MIGRvY3VtZW50KSwgdGhlIG9iamVjdCByZXR1cm5lZCBpcyBhIHNpbmdsZXRvbi4KLQkJICogVGhlIHNhbWUgQXR0cmlidXRlc0ltcGwgb2JqZWN0IGlzIGNsZWFyZWQgYW5kIHJldXNlZCBmb3IgZWFjaCBpbnZvY2F0aW9uLgotCQkgKiAKLQkJICogQHJldHVybiBhbiBlbXB0eSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgdG8gc3RvcmUgYXR0cmlidXRlcwotCQkgKi8KLQkJcHVibGljIEF0dHJpYnV0ZXNJbXBsIGdldEF0dHJpYnV0ZUhvbGRlcigpIHsKLQkJCXRoaXMuYXR0cmlidXRlc0ltcGwuY2xlYXIoKTsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNJbXBsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEyMThlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0ZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIE1hcC8qPFN0cmluZyBzaG9ydE5hbWUsIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3I+Ki8gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOyAKLQlwcml2YXRlIE1hcC8qPFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IsIFJlc291cmNlLkZhY3Rvcnk+Ki8gZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBSZXNvdXJjZS5GYWN0b3J5IHRoYXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIFVSSSdzIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCNnZXRGYWN0b3J5KFVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEZpbGVOYW1lRmFjdG9yeShVUkkgdXJpKSB7Ci0KLQkJaWYodXJpICE9IG51bGwpIHsKLQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKLQkJCQotCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEZhY3RvcnkoZGVzY3JpcHRvcik7CQotCQkJfQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgewotCi0JCVJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gbnVsbDsKLQkJaWYodXJpICE9IG51bGwgJiYgdXJpLmxhc3RTZWdtZW50KCkgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJCi0JCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBnZXRGYWN0b3J5KGRlc2NyaXB0b3IpOwkKLQkJCX0JCi0JCX0KLQkJaWYocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpCi0JCQlyZXNvdXJjZUZhY3RvcnkgPSBzdXBlci5nZXRGYWN0b3J5KHVyaSk7Ci0JCXJldHVybiByZXNvdXJjZUZhY3Rvcnk7IAotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgZmlsZSBuYW1lIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgVVJJIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChTdHJpbmcgYVNpbXBsZUZpbGVOYW1lLCBSZXNvdXJjZS5GYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGFTaW1wbGVGaWxlTmFtZSk7Ci0JCVN0cmluZyBsYXN0U2VnbWVudCA9IHVyaS5sYXN0U2VnbWVudCgpOyAKLQkJYWRkRGVzY3JpcHRvcihuZXcgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihsYXN0U2VnbWVudCwgYUZhY3RvcnkpKTsJCQotCX0gCi0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihVUkkgdXJpKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KHVyaS5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBNYXAgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3luY2hyb25pemVkIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsgIAotCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSAoRmFjdG9yeSkgZmFjdG9yaWVzLmdldChkZXNjcmlwdG9yKTsKLQkJaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3JpZXMucHV0KGRlc2NyaXB0b3IsIChmYWN0b3J5ID0gZGVzY3JpcHRvci5jcmVhdGVGYWN0b3J5KCkpKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdG9yKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeyAKLQkJZGVzY3JpcHRvcnMucHV0KGRlc2NyaXB0b3IuZ2V0U2hvcnRTZWdtZW50KCksIGRlc2NyaXB0b3IpOwotCX0KLSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9HZW5lcmljVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZlMDlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjAsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogU3BlY2lhbGl6ZWQgdHJhbnNsYXRvciBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gc2ltcGxlIG1hcHBpbmdzIHdpdGggbm8gc3BlY2lhbGl6ZWQgYmVoYXZpb3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICogQHBhcmFtIHBhdGhzCi0JICovCi0JcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHBhdGhzKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aHMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVHJhbnNsYXRvcltdCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoaWxkcmVuLgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqICAgICAgICAgICAgVGhlIGNoaWxkcmVuIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYXBwZW5kQ2hpbGRyZW4oR2VuZXJpY1RyYW5zbGF0b3IgdHJhbiwgVHJhbnNsYXRvcltdIGNoaWxkKSB7Ci0JCVRyYW5zbGF0b3JbXSBvcmdDaGlsZCA9IHRyYW4uZ2V0Q2hpbGRyZW4oKTsKLQkJVHJhbnNsYXRvcltdIG5ld0NoaWxkcmVuID0gKFRyYW5zbGF0b3JbXSkgY29uY2F0KG9yZ0NoaWxkLCBjaGlsZCk7Ci0JCXRyYW4uc2V0Q2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gdHJhbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYXBwZW5kQ2hpbGQoR2VuZXJpY1RyYW5zbGF0b3IgdHJhbiwgVHJhbnNsYXRvciBjaGlsZCkgewotCQlPYmplY3RbXSBvcmdDaGlsZCA9IHRyYW4uZ2V0Q2hpbGRyZW4oKTsKLQkJVHJhbnNsYXRvcltdIG5ld0NoaWxkcmVuID0gKFRyYW5zbGF0b3JbXSkgY29uY2F0KG9yZ0NoaWxkLCBjaGlsZCk7Ci0JCXRyYW4uc2V0Q2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gdHJhbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSURUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZjZhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTksIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBJRFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQlwdWJsaWMgY2xhc3MgTm9SZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JCXB1YmxpYyBOb1Jlc291cmNlRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBOb1Jlc291cmNlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIElEX0ZFQVRVUkUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FSURBdHRyaWJ1dGUoKTsKLQlzdGF0aWMgZmluYWwgcHVibGljIElEVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBJRFRyYW5zbGF0b3IoKTsKLQotCXB1YmxpYyBJRFRyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCJpZCIsIElEX0ZFQVRVUkUsIERPTV9BVFRSSUJVVEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGVtZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vUmVzb3VyY2VFeGNlcHRpb24oKTsKLQkJU3RyaW5nIGlkID0gcmVzLmdldElEKGVtZk9iamVjdCk7Ci0JCWlmIChpZCA9PSBudWxsICYmIHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICgoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKHZhbHVlKSkgfHwgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhpZCkpKQotCQkJcmVzLnNldElEKGVtZk9iamVjdCwgKFN0cmluZykgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGVtZk9iamVjdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE5vUmVzb3VyY2VFeGNlcHRpb24oKTsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBlbWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOb1Jlc291cmNlRXhjZXB0aW9uKCk7Ci0JCXJldHVybiByZXMuZ2V0SUQoZW1mT2JqZWN0KTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJRE1hcCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQ4MTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lSb290T2JqZWN0UmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElSb290T2JqZWN0UmVzb3VyY2UgewotCi0JcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTGlua1VwZGF0ZXJUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjZDFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIExpbmtVcGRhdGVyVGFyZ2V0IGV4dGVuZHMgT2JqZWN0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlua1VwZGF0ZXJUYXJnZXQgSU5TVEFOQ0UgPSBuZXcgTGlua1VwZGF0ZXJUYXJnZXQoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMaW5rVXBkYXRlck11bHRpVGFyZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICovCi0JcHJpdmF0ZSBMaW5rVXBkYXRlclRhcmdldCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZWZyZXNoU291cmNlT2JqZWN0cyhtYXAsIG5vZGUsIG1vZk9iamVjdCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlTU9GKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXJlZnJlc2hTb3VyY2VPYmplY3RzKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNvdXJjZU9iamVjdHMoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QsIGJvb2xlYW4gZG9tVXBkYXRlKSB7Ci0JCVRyYW5zbGF0b3JQYXRoW10gcGF0aHMgPSBtYXAuZ2V0VHJhbnNsYXRvclBhdGhzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3JQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCUxpc3QgYWxsU291cmNlT2JqZWN0cyA9IHBhdGguZmluZE9iamVjdHMobW9mT2JqZWN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFNvdXJjZU9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBjdXJPYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJRU1GMkRPTUFkYXB0ZXIgY3VyQWRhcHRlciA9IChFTUYyRE9NQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoY3VyT2JqZWN0LmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGN1ckFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoZG9tVXBkYXRlKQotCQkJCQkJY3VyQWRhcHRlci51cGRhdGVET00oKTsKLQkJCQkJZWxzZQotCQkJCQkJY3VyQWRhcHRlci51cGRhdGVNT0YoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTWFwcGVkWE1JSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5MzlhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkWE1JSGVscGVyIGV4dGVuZHMgWE1MSGVscGVySW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1NQQUNFX1BST1RPQ09MID0gIndvcmtzcGFjZTovIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBOVUxMX0ZFQVRVUkUgPSBuZXcgVW5zdXBwb3J0ZWRGZWF0dXJlKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXNpbmdNYXBzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgTWFwIGNhY2hlZFJlbGF0aXZlVVJJczsKLQlwcm90ZWN0ZWQgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNYXBwZWRYTUxIZWxwZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIE1hcHBlZFhNSUhlbHBlcihYTUxSZXNvdXJjZSByZXNvdXJjZSwgTWFwIHByZWZpeGVzVG9VUklzKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJdGhpcy5wcmVmaXhlc1RvVVJJcy5wdXRBbGwocHJlZml4ZXNUb1VSSXMpOwotCQlwdXNoQ29udGV4dCgpOyAvL05lZWRlZCB0byBpbml0aWFsaXplIHRoZSBjb250ZXh0IHRvIHplcm8KLQkJU2V0IGtleXMgPSBwcmVmaXhlc1RvVVJJcy5rZXlTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBwcmVmaXhlc1RvVVJJcy5nZXQocHJlZml4KTsKLQkJCW5hbWVzcGFjZVN1cHBvcnQuZGVjbGFyZVByZWZpeChwcmVmaXgsIHVyaSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgcmVsYXRpdmUsIFVSSSBiYXNlKSB7Ci0JCVVSSSByZXNvbHZlZCA9IG51bGw7Ci0JCWJvb2xlYW4gaXNNYXBwZWQgPSBmYWxzZTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCVVSSSBsb2NhbHJlc291cmNlVVJJID0gbnVsbDsKLQkJCWlmIChyZWxhdGl2ZS5oYXNGcmFnbWVudCgpKQotCQkJCWxvY2FscmVzb3VyY2VVUkkgPSByZWxhdGl2ZS50cmltRnJhZ21lbnQoKTsKLQkJCWVsc2UKLQkJCQlsb2NhbHJlc291cmNlVVJJID0gcmVsYXRpdmU7Ci0JCQlpc01hcHBlZCA9ICEoKChVUklDb252ZXJ0ZXJJbXBsLlVSSU1hcCkgc2V0LmdldFVSSUNvbnZlcnRlcigpLmdldFVSSU1hcCgpKS5nZXRVUkkobG9jYWxyZXNvdXJjZVVSSSkuZXF1YWxzKGxvY2FscmVzb3VyY2VVUkkpKTsKLQkJfQotCQlpZiAoIWlzTWFwcGVkKSB7Ci0JCQlpZiAoaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMoKSAmJiBzZXQgIT0gbnVsbCkKLQkJCQlyZXNvbHZlZCA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUocmVsYXRpdmUpOwotCQl9IGVsc2UgewotCQkJcmVzb2x2ZWQgPSByZWxhdGl2ZTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWQgPT0gbnVsbCA/IHN1cGVyLnJlc29sdmUocmVsYXRpdmUsIGJhc2UpIDogcmVzb2x2ZWQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocygpIHsKLQkJcmV0dXJuICgoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSByZXNvdXJjZSkuZ2V0Rm9ybWF0KCkgPT0gQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1IHx8IHVzaW5nTWFwczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCQkvKgotCQkgKiBwcm9ibGVtIC0gdGhlIGluY29taW5nIGtleSB2YWx1ZSBwYWlyIGlzIGVqYmJuZC0+ZWpiYm5kLnhtaTsgaG93ZXZlciwgdGhlIG1hcCBhbHJlYWR5IGhhcwotCQkgKiBhIGtleSB2YWx1ZSBwYWlyIG9mIGVqYmJuZC0+aHR0cDovLy9lamJibmQuZWNvcmUKLQkJICovCi0JCWlmICh1cmkuZW5kc1dpdGgoIi5lY29yZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXVzaW5nTWFwcyA9IGZhbHNlOwotCQl9Ci0JCVN0cmluZyBleGlzdGluZyA9IChTdHJpbmcpIHByZWZpeGVzVG9VUklzLmdldChwcmVmaXgpOwotCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJcHJlZml4ZXNUb1VSSXMucHV0KHByZWZpeCwgdXJpKTsKLQkJCW5hbWVzcGFjZVN1cHBvcnQuZGVjbGFyZVByZWZpeChwcmVmaXgsIHVyaSk7Ci0JCX0gZWxzZSBpZiAoIWV4aXN0aW5nLmVxdWFscyh1cmkpKSB7Ci0JCQlnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS5hZGRPcmlnaW5hbFBhY2thZ2VVUkkoZXhpc3RpbmcsIHVyaSk7Ci0JCQlnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkgewotCQlyZXR1cm4gKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldEhSRUYoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhSRUYoRU9iamVjdCBvYmopIHsKLQkJaWYgKCFnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKSB7Ci0JCQlVUklDb252ZXJ0ZXIgY29udiA9IGdldFVSSUNvbnZlcnRlcigpOwotCQkJaWYgKGNvbnYgIT0gbnVsbCAmJiBjb252IGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcikgewotCQkJCVN0cmluZyBocmVmID0gZ2V0Q29tcGF0aWJsaWx0eUhSRUYob2JqLCAoQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlcikgY29udik7Ci0JCQkJcmV0dXJuIHVzZVdvcmtzcGFjZVByb3RvY29sSWZOZWNlc3NhcnkoaHJlZik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob2JqKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNlV29ya3NwYWNlUHJvdG9jb2xJZk5lY2Vzc2FyeShTdHJpbmcgaHJlZikgewotCQlpZiAoaHJlZiAhPSBudWxsICYmIGhyZWYuc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCkpCi0JCQlyZXR1cm4gV09SS1NQQUNFX1BST1RPQ09MICsgaHJlZi5zdWJzdHJpbmcoMTkpOwotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb21wYXRpYmxpbHR5SFJFRihFT2JqZWN0IG9iaiwgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciBjb252KSB7Ci0JCS8vSW1wbGVtZW50YXRpb24gY29waWVkIGZyb20gc3VwZXIuZ2V0SFJFRihFT2JqZWN0KQotCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG9iajsKLQotCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBvdGhlclJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJaWYgKG90aGVyUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCW9iamVjdFVSSSA9IGhhbmRsZURhbmdsaW5nSFJFRihvYmopOwotCQkJCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlvYmplY3RVUkkgPSBvdGhlclJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KG90aGVyUmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQob2JqKSk7Ci0JCX0KLQotCQkvL01vZGlmaWVkIHRvIGRpc3BhdGNoIGJhY2sgdG8gVVJJIENvbnZlcnRlcgotCQlpZiAoIW9iamVjdFVSSS5pc1JlbGF0aXZlKCkpIHsKLQkJCW9iamVjdFVSSSA9IG1ha2VSZWxhdGl2ZShvYmplY3RVUkksIGNvbnYpOwotCQl9Ci0JCXJldHVybiBvYmplY3RVUkkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJJIG1ha2VSZWxhdGl2ZShVUkkgb2JqZWN0VVJJLCBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGNvbnYpIHsKLQkJU3RyaW5nIGZyYWdtZW50ID0gb2JqZWN0VVJJLmZyYWdtZW50KCk7Ci0JCW9iamVjdFVSSSA9IG9iamVjdFVSSS50cmltRnJhZ21lbnQoKTsKLQkJVVJJIHJlbGF0aXZlID0gKFVSSSkgZ2V0Q2FjaGVkUmVsYXRpdmVVUklzKCkuZ2V0KG9iamVjdFVSSSk7Ci0JCWlmIChyZWxhdGl2ZSA9PSBudWxsKSB7Ci0JCQlyZWxhdGl2ZSA9IGNvbnYuZGVOb3JtYWxpemUob2JqZWN0VVJJKTsKLQkJCWlmIChyZWxhdGl2ZS5pc1JlbGF0aXZlKCkpCi0JCQkJY2FjaGVkUmVsYXRpdmVVUklzLnB1dChvYmplY3RVUkksIHJlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gcmVsYXRpdmUuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotCX0KLQotCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChzZXQgIT0gbnVsbCkKLQkJCXJldHVybiBzZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0Q2FjaGVkUmVsYXRpdmVVUklzKCkgewotCQlpZiAoY2FjaGVkUmVsYXRpdmVVUklzID09IG51bGwpCi0JCQljYWNoZWRSZWxhdGl2ZVVSSXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gY2FjaGVkUmVsYXRpdmVVUklzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0SUQoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKQotCQkJcmV0dXJuIHN1cGVyLmdldElEKG9iaik7Ci0JCXJldHVybiBJRFV0aWwuZ2V0T3JBc3NpZ25JRChvYmosIHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TlNJbmZvKEVQYWNrYWdlIHBrZykgewotCQlTdHJpbmcgcHJlZml4ID0gZ2V0TWFwcGVkUHJlZml4KHBrZyk7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117cGtnLmdldE5zUHJlZml4KCksIHBrZy5nZXROc1VSSSgpfTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtwcmVmaXgsIHByZWZpeCArICIueG1pIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFByZWZpeChFUGFja2FnZSBwa2cpIHsKLQkJU3RyaW5nIG5zVVJJID0gcGtnLmdldE5zVVJJKCk7Ci0JCWlmICh1c2luZ01hcHMgfHwgIWdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpLnVzZXNEZWZhdWx0Rm9ybWF0KCkpCi0JCQlyZXR1cm4gKFN0cmluZykgcGFja2FnZVVSSXNUb1ByZWZpeGVzLmdldChuc1VSSSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGVkUHJlZml4T3JEZWZhdWx0KEVQYWNrYWdlIHBrZykgewotCQlTdHJpbmcgcHJlZml4ID0gZ2V0TWFwcGVkUHJlZml4KHBrZyk7Ci0JCXJldHVybiBwcmVmaXggPT0gbnVsbCA/IHBrZy5nZXROc1ByZWZpeCgpIDogcHJlZml4OwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzLgotCSAqIAotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrYWdlVVJJc1RvUHJlZml4ZXMKLQkgKiAgICAgICAgICAgIFRoZSBwYWNrYWdlVVJJc1RvUHJlZml4ZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXMpIHsKLQkJdGhpcy5wYWNrYWdlVVJJc1RvUHJlZml4ZXMgPSBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRTmFtZShFQ2xhc3MgYykgewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoYyk7Ci0KLQkJaWYgKHhtbE1hcCAhPSBudWxsKSB7Ci0JCQlYTUxSZXNvdXJjZS5YTUxJbmZvIGNsc0luZm8gPSB4bWxNYXAuZ2V0SW5mbyhjKTsKLQotCQkJaWYgKGNsc0luZm8gIT0gbnVsbCkgewotCQkJCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBjbHNJbmZvLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkJCXJldHVybiBnZXRRTmFtZSh0YXJnZXROYW1lc3BhY2UsIG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJRVBhY2thZ2UgcCA9IGMuZ2V0RVBhY2thZ2UoKTsKLQkJcGFja2FnZXMucHV0KHAsIG51bGwpOwotCi0JCWlmIChwLmdldE5zUHJlZml4KCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJCAKLQkJCXJldHVybiBuYW1lOwotCi0JCS8vTW9kaWZpZWQgZnJvbSBzdXBlcmNsYXNzCi0JCS8vcmV0dXJuIHAuZ2V0TnNQcmVmaXgoKSArICI6IiArIG5hbWU7Ci0JCXJldHVybiBnZXRNYXBwZWRQcmVmaXhPckRlZmF1bHQocCkgKyAiOiIgKyBuYW1lOyAvLyROT04tTkxTLTEkIAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjc2V0VmFsdWUoRU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBwb3NpdGlvbikgewotCQlpZiAoZmVhdHVyZSA9PSBOVUxMX0ZFQVRVUkUpCi0JCQlyZXR1cm47Ci0JCWlmICghZmVhdHVyZS5pc1RyYW5zaWVudCgpKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBmZWF0dXJlLmdldEVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpICE9IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpKQotCQkJCS8vRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNT0Y1IHdoZXJlIHR5cGVzIGxpa2UgSW50ZWdlciBtaWdodCBoYXZlIGJlZW4gc2V0Ci0JCQkJLy9hbmQgc2VyaWFsaXplZCBhcyAieHNpOm5pbCIKLQkJCQlyZXR1cm47Ci0KLQkJCXN1cGVyLnNldFZhbHVlKG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIHBvc2l0aW9uKTsKLQkJfQotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyI2dldEZlYXR1cmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKEVDbGFzcyBlQ2xhc3MsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBuYW1lLCBib29sZWFuIGlzRWxlbWVudCkgewotCQlpZiAoVW5zdXBwb3J0ZWRGZWF0dXJlLmlzVW5zdXBwb3J0ZWQoZUNsYXNzLCBuYW1lKSkKLQkJCXJldHVybiBOVUxMX0ZFQVRVUkU7Ci0JCXJldHVybiBzdXBlci5nZXRGZWF0dXJlKGVDbGFzcywgbmFtZXNwYWNlVVJJLCBuYW1lLCBpc0VsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXIjZ2V0RmVhdHVyZUtpbmQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZlYXR1cmVLaW5kKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IE5VTExfRkVBVFVSRSkKLQkJCXJldHVybiBYTUxIZWxwZXIuREFUQVRZUEVfU0lOR0xFOwotCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZUtpbmQoZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NdWx0aU9iamVjdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlZDViYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NdWx0aU9iamVjdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpT2JqZWN0VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW117fTsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBNdWx0aU9iamVjdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihFT2JqZWN0IG8pOwotCi0JcHVibGljIGFic3RyYWN0IFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoU3RyaW5nIGRvbU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKTsKLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewotCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3Iobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpLmNyZWF0ZUVNRk9iamVjdChub2RlTmFtZSwgcmVhZEFoZWFkTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uKSB7Ci0JCWlmIChvID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFlfVFJBTlNMQVRPUlM7Ci0JCXJldHVybiBnZXREZWxlZ2F0ZUZvcigoRU9iamVjdCkgbykuZ2V0Q2hpbGRyZW4obywgdmVyc2lvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRET01OYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3IoKEVPYmplY3QpIHZhbHVlKS5nZXRET01OYW1lKHZhbHVlKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYW5hZ2VkQnlQYXJlbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhnZXRET01QYXRoKCkpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpOwotCQl9Ci0JCVRyYW5zbGF0b3IgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZUZvcihub2RlLmdldE5vZGVOYW1lKCksIG51bGwpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL05hbWVzcGFjZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL05hbWVzcGFjZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyM2VkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9OYW1lc3BhY2VUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyAxNCwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBOYW1lc3BhY2VUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lKSB7Ci0JCXN1cGVyKGRvbU5hbWUsIE5hbWVzcGFjZUFkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkUsIERPTV9BVFRSSUJVVEUpOwotCQlpbml0UHJlZml4KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcmVmaXgoKSB7Ci0JCVN0cmluZyBkTmFtZSA9IGdldERPTU5hbWUobnVsbCk7Ci0JCXByZWZpeCA9IGROYW1lLnN1YnN0cmluZyhEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuWE1MTlMubGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJTmFtZXNwYWNlQWRhcHRlci5hZGROYW1lc3BhY2UocHJlZml4LCAoU3RyaW5nKSB2YWx1ZSwgZW1mT2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gZ2V0TU9GVmFsdWUoZW1mT2JqZWN0KSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgewotCQlyZXR1cm4gTmFtZXNwYWNlQWRhcHRlci5nZXROYW1lc3BhY2VVUklBdFRoaXNMZXZlbChwcmVmaXgsIG1vZk9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciN1blNldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJTmFtZXNwYWNlQWRhcHRlci5yZW1vdmVOYW1lc3BhY2UocHJlZml4LCBlbWZPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZmVhdHVyZUV4aXN0cyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNEYXRhVHlwZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc01hcEZvcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihPYmplY3QgYUZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChhRmVhdHVyZSA9PSBmZWF0dXJlKSB7Ci0JCQlOYW1lc3BhY2UgbmFtZXNwYWNlID0gKE5hbWVzcGFjZSkgKG9sZFZhbHVlID09IG51bGwgPyBuZXdWYWx1ZSA6IG9sZFZhbHVlKTsKLQkJCWlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJlZml4LmVxdWFscyhuYW1lc3BhY2UuZ2V0UHJlZml4KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9PYmplY3RUcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9PYmplY3RUcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGI5Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdFRyYW5zbGF0b3JGaWx0ZXIgZXh0ZW5kcyBUcmFuc2xhdG9yRmlsdGVyIHsKLQotCXB1YmxpYyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKCkgewotCQlzdXBlcihudWxsLCAtMSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFRyYW5zbGF0b3JGaWx0ZXIoVHJhbnNsYXRvciB0cmFucywgaW50IHZlcnNpb24pIHsKLQkJc3VwZXIodHJhbnMsIHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBmaW5hbCBpbnQgc2Nhbk5leHRUcmFuc2xhdG9yKFRyYW5zbGF0b3JbXSBjaGlsZHJlbiwgaW50IHN0YXJ0KSB7Ci0JCWludCBmb3VuZCA9IHN0YXJ0ICsgMTsKLQkJZm9yICg7IGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2ZvdW5kKSB7Ci0JCQlpZiAoIWNoaWxkcmVuW2ZvdW5kXS5pc0RPTUF0dHJpYnV0ZSgpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWZvdW5kID0gKGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoKSA/IGZvdW5kIDogLTE7Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWFkQWhlYWRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkMWEyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWFkQWhlYWRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICovCi1wdWJsaWMgY2xhc3MgUmVhZEFoZWFkSGVscGVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50RE9NTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOwotCXByb3RlY3RlZCBTdHJpbmcgY2hpbGRET01OYW1lOwotCi0JcHVibGljIFJlYWRBaGVhZEhlbHBlcihTdHJpbmcgcGFyZW50RE9NTmFtZSwgU3RyaW5nW10gdmFsdWVzLCBTdHJpbmcgY2hpbGRET01OYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGFyZW50RE9NTmFtZSA9IHBhcmVudERPTU5hbWU7Ci0JCXRoaXMudmFsdWVzID0gdmFsdWVzOwotCQl0aGlzLmNoaWxkRE9NTmFtZSA9IGNoaWxkRE9NTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGlsZERPTU5hbWUoKSB7Ci0JCXJldHVybiBjaGlsZERPTU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50RE9NTmFtZSgpIHsKLQkJcmV0dXJuIHBhcmVudERPTU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkRE9NTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWNoaWxkRE9NTmFtZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RE9NTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXBhcmVudERPTU5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoU3RyaW5nW10gc3RyaW5ncykgewotCQl2YWx1ZXMgPSBzdHJpbmdzOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gbm9kZVZhbHVlSXNSZWFkQWhlYWROYW1lKFN0cmluZyBub2RlTmFtZSkgewotCi0JCXJldHVybiAoY2hpbGRET01OYW1lICE9IG51bGwpID8gY2hpbGRET01OYW1lLmVxdWFscyhub2RlTmFtZSkgOiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBub2RlTmFtZUlzUmVhZEFoZWFkTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChub2RlTmFtZS5lcXVhbHModmFsdWVzW2ldKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZhZjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlZFJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UsIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSB7Ci0JLy9UT0RPIC0gcmVuYW1lIHBhY2thZ2VkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEX0VSUk9SX01TRyA9ICJUaGlzIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZC4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9XQVNfU0FWRUQgPSA2MDE7Ci0JCi0JLyoqCi0JICogQSBmbGFnIHVzZWQgdG8gaW5kaWNhdGUgYSBSZWZlcmVuY2VkUmVzb3VyY2UgaXMgYWJvdXQKLQkgKiB0byBzYXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0FCT1VUX1RPX1NBVkUgPSA2MDI7Ci0JCi0JLyoqCi0JICogQSBmbGFnIHVzZWQgdG8gaW5kaWNhdGUgYSBSZWZlcmVuY2VkUmVzb3VyY2UgaGFzIGZhaWxlZAotCSAqIHRvIHNhdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfU0FWRV9GQUlMRUQgPSA2MDM7Ci0KLQkvKioKLQkgKiBBY2Nlc3MgdGhpcyByZXNvdXJjZSBmb3IgcmVhZCBvbmx5LiBUaGlzIGNhbGwgaW5jcmVtZW50cyB0aGUgdXNlIHJlYWQgY291bnQgb2YgdGhpcyByZXNvdXJjZS4KLQkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGV5IHVzZSB0aGUgcmVzb3VyY2UuIFRoZXkgc2hvdWxkIGNhbGwKLQkgKiByZWxlYXNlRnJvbVJlYWQoKSBhZnRlciB0aGV5IGFyZSBkb25lIG1vZGlmeWluZyB0aGlzIHJlc291cmNlLgotCSAqLwotCXZvaWQgYWNjZXNzRm9yUmVhZCgpOwotCi0JLyoqCi0JICogQWNjZXNzIHRoaXMgcmVzb3VyY2UgZm9yIHdyaXRlIG9ubHkuIFRoaXMgY2FsbCBpbmNyZW1lbnRzIHRoZSB1c2Ugd3JpdGUgY291bnQgb2YgdGhpcwotCSAqIHJlc291cmNlLiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGV5IG1vZGlmeSB0aGUgcmVzb3VyY2UuIFRoZXkgc2hvdWxkIGNhbGwKLQkgKiByZWxlYXNlRnJvbVdyaXRlKCkgYWZ0ZXIgdGhleSBhcmUgZG9uZSBtb2RpZnlpbmcgdGhpcyByZXNvdXJjZS4KLQkgKi8KLQl2b2lkIGFjY2Vzc0ZvcldyaXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGhhcyBqdXN0IGJlZW4gbG9hZGVkIGFuZCBub3QgeWV0IGFjY2Vzc2VkIGZvciByZWFkIG9yIHdyaXRlLgotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhbnkgd3JpdGUgcmVmZXJlbmNlcy4KLQkgKi8KLQlib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaXMgc2hhcmVkIGZvciByZWFkIG9yIHdyaXRlIGJ5IG1vcmUgdGhhbiBvbmUgYWNjZXNzb3IuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBzaGFyZWQgZm9yIHdyaXRlIGJ5IG1vcmUgdGhhbiBvbmUgYWNjZXNzb3IuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHJlYWQgdGhlIGFjY2VzcyB0byB0aGlzIHJlc291cmNlLiBUaGlzIGNhbGwgZGVjcmVtZW50cyB0aGUgdXNlIGNvdW50IG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBhbmQgd2lsbCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gaXRzIHJlc291cmNlIHNldCBpZiB0aGUgdXNlIGNvdW50IGdvZXMgdG8gMC4gQ2xpZW50cyBzaG91bGQKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlIGFuZCBvbmx5IGFmdGVyIHRoZXkgaGF2ZSBjYWxsZWQKLQkgKiBhY2Nlc3NGb3JSZWFkKCkgdG8gb2J0YWluIGFjY2Vzcy4KLQkgKi8KLQl2b2lkIHJlbGVhc2VGcm9tUmVhZCgpOwotCi0JLyoqCi0JICogUmVsZWFzZSB3cml0ZSB0aGUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMgY2FsbCBkZWNyZW1lbnRzIHRoZSB3cml0ZSBjb3VudCBvZiB0aGlzCi0JICogcmVzb3VyY2UgYW5kIHdpbGwgcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIGl0cyByZXNvdXJjZSBzZXQgaWYgdGhlIHVzZSBjb3VudCBnb2VzIHRvIDAuCi0JICogQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZXkgYXJlIGRvbmUgYWNjZXNzaW5nIHRoZSByZXNvdXJjZSBhbmQgb25seSBhZnRlciB0aGV5Ci0JICogaGF2ZSBjYWxsZWQgYWNjZXNzRm9yV3JpdGUoKSB0byBvYnRhaW4gYWNjZXNzLgotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhpcyByZXNvdXJjZSBvbmx5IGlmIHRoZSB3cml0ZSBjb3VudCBpcyBlcXVhbCB0byAxLgotCSAqLwotCXZvaWQgc2F2ZUlmTmVjZXNzYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkgYW5kIGlzIG5vdCBzaGFyZWQgZm9yIHdyaXRlLgotCSAqLwotCWJvb2xlYW4gbmVlZHNUb1NhdmUoKTsKLQotCi0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgYSByZWZyZXNoIHRvIHRha2UgcGxhY2UgZXZlbiB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKi8KLQl2b2lkIHNldEZvcmNlUmVmcmVzaChib29sZWFuIGIpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGFsbG93IGEgcmVmcmVzaCB0byB0YWtlIHBsYWNlIGV2ZW4gd2hlbiB0aGlzIHJlc291cmNlIGlzIGRpcnR5LgotCSAqLwotCWJvb2xlYW4gc2hvdWxkRm9yY2VSZWZyZXNoKCk7Ci0KLQlib29sZWFuIHdhc1JldmVydGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiByZWFkIGFjY2Vzc2VzIG9uIHRoaXMgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFJlYWRDb3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9wZW4gd3JpdGUgYWNjZXNzZXMgb24gdGhpcyByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0V3JpdGVDb3VudCgpOwotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBiZWluZyBhY2Nlc3NlZCwgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgcmVzb3VyY2Ugc2V0LgotCSAqLwotCXZvaWQgdW5sb2FkSWZOZWNlc3NhcnkoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTFjMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzOwotCXByb3RlY3RlZCBMaXN0IGxvY2FsQWRhcHRlckZhY3RvcmllczsKLQotCS8qKgotCSAqIFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgYSBuZXcgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsI2NyZWF0ZVJlc291cmNlKFVSSSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXMgPSBkb0NyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCWFkYXB0TmV3KHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHROZXcoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChnbG9iYWxBZGFwdGVyRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5zaXplKCk7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWZhY3RvcnkuYWRhcHRBbGxOZXcocmVzKTsKLQkJCX0KLQkJfQotCQlpZiAobG9jYWxBZGFwdGVyRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxBZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChBZGFwdGVyRmFjdG9yeSkgbG9jYWxBZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKLQkJCQlmYWN0b3J5LmFkYXB0QWxsTmV3KHJlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWwgYWRhcHRlciBmYWN0b3J5IGlzIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlvdSB1c2UgdG8gb25seSBhZGFwdCB0aGUgcmVzb3VyY2UKLQkgKiBzcGVjaWZpYyB0byB0aGUgUmVzb3VyY2VGYWN0b3J5IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9jYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvY2FsQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCWxvY2FsQWRhcHRlckZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgIT0gbnVsbCkKLQkJCWxvY2FsQWRhcHRlckZhY3Rvcmllcy5yZW1vdmUoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQSBnbG9iYWwgYWRhcHRlciBmYWN0b3J5IHdpbGwgYmUgdXNlZCB0byBhZGFwdCBhbnkgcmVzb3VyY2UgY3JlYXRlZCBieSBhbnkgUmVzb3VyY2VGYWN0b3J5Ci0JICogaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkR2xvYmFsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAoZ2xvYmFsQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKQotCQkJZ2xvYmFsQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVHbG9iYWxBZGFwdGVyRmFjdG9yeShBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWlmIChnbG9iYWxBZGFwdGVyRmFjdG9yaWVzICE9IG51bGwpCi0JCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLnJlbW92ZShmYWN0b3J5KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1NjM2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlZFJlc291cmNlIHsKLQkvL1RPRE8gQWRkIHRvU3RyaW5nIGhvb2sKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9fU1RSSU5HID0gIlJlZmVyZW5jZWRYTUlSZXNvdXJjZSwgZmlsZSA9ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT1VOVF9UT19TVFJJTkcgPSAiIFI9ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09VTlRfVE9fU1RSSU5HID0gIiBXPSAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCByZWFkUmVmZXJlbmNlQ291bnQgPSAxOwotCXByaXZhdGUgaW50IGVkaXRSZWZlcmVuY2VDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXcgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGZvcmNlUmVmcmVzaDsKLQkKLQkgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0IGV4dGVuZHMgRUFkYXB0ZXJMaXN0Ci0JICB7Ci0KLQkgICAgcHVibGljIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgewotCQkJc3VwZXIobm90aWZpZXIpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShvYmplY3QpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkgICAgewotCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKQotCSAgICB7Ci0JICAgICBzdXBlci5jbGVhcigpOwotCSAgICB9Ci0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIG9iamVjdCk7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbW92ZShpbnQgbmV3UG9zaXRpb24sIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2JqZWN0KTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBpbnQgb2xkUG9zaXRpb24pCi0JICAgIHsKLQkgICAgcmV0dXJuIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9sZFBvc2l0aW9uKTsKLQkgICAgfQotCSAgfQotCi0JIAotCS8qKgotCSAqIFJlZmVyZW5jYWJsZVhNSVJlc291cmNlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNnZXRSZWFkQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVhZENvdW50KCkgewotCQlyZXR1cm4gcmVhZFJlZmVyZW5jZUNvdW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2dldFdyaXRlQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V3JpdGVDb3VudCgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JSZWFkCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJY2hlY2tEZWxldGVkKCk7Ci0JCWlmICghaXNOZXcoKSkKLQkJCXJlYWRSZWZlcmVuY2VDb3VudCsrOwotCQlpc05ldyA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yV3JpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKLQkJY2hlY2tEZWxldGVkKCk7Ci0JCWVkaXRSZWZlcmVuY2VDb3VudCsrOwotCQlpZiAoaXNOZXcpCi0JCQlyZWxlYXNlRnJvbVJlYWQoKTsKLQkJaXNOZXcgPSBmYWxzZTsKLQkJaWYgKCFpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCkpCi0JCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGRvZXMgbm90IGhhdmUgYQotCSAqIFJlc291cmNlU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrRGVsZXRlZCgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKERFTEVURURfRVJST1JfTVNHKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgY29sbGVjdENvbnRhaW5lZE9iamVjdHMoamF2YS51dGlsLkxpc3QgY29sbGVjdGluZywgRU9iamVjdCBwYXJlbnRPYmplY3QpIHsKLQotCQlqYXZhLnV0aWwuSXRlcmF0b3IgY2hpbGRyZW4gPSBwYXJlbnRPYmplY3QuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQljb2xsZWN0aW5nLmFkZChjaGlsZCk7Ci0JCQljb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhjb2xsZWN0aW5nLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZW5zdXJlRnVsbElESHlkcmF0aW9uKCkgewotCQlMaXN0IGFsbFJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIHJvb3RPYmplY3RzID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocm9vdE9iamVjdHMuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHJvb3RPYmplY3RzLm5leHQoKTsKLQkJCWFsbFJlZk9iamVjdHMuYWRkKGNoaWxkKTsKLQkJCWNvbGxlY3RDb250YWluZWRPYmplY3RzKGFsbFJlZk9iamVjdHMsIGNoaWxkKTsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhbGxSZWZPYmplY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJCUlEVXRpbC5hc3NpZ25JRCgoRU9iamVjdCkgaXRlci5uZXh0KCksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgYmVpbmcgYWNjZXNzZWQsIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIHJlc291cmNlIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKChnZXRUb3RhbFJlZmVyZW5jZUNvdW50KCkgPD0gMCkgfHwgKGVkaXRSZWZlcmVuY2VDb3VudCA8PSAwICYmIGlzTW9kaWZpZWQoKSkpCi0JCQl1bmxvYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3cml0ZSBhY2Nlc3NlcyB0byB0aGlzIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSB7Ci0JCXJldHVybiBlZGl0UmVmZXJlbmNlQ291bnQgKyByZWFkUmVmZXJlbmNlQ291bnQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc05ldwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgewotCQlyZXR1cm4gaXNOZXc7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1JlYWRPbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCA8PSAwOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNTaGFyZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSA+IDE7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1NoYXJlZEZvcldyaXRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCA+IDE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcHJlRGVsZXRlCi0JICovCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgewotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcmVsZWFzZUZyb21SZWFkCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlyZWFkUmVmZXJlbmNlQ291bnQtLTsKLQkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA8IDApCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVhZCByZWZlcmVuY2UgY291bnQgZXJyb3I6ICAiICsgdGhpcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl1bmxvYWRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcmVsZWFzZUZyb21Xcml0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7Ci0JCWVkaXRSZWZlcmVuY2VDb3VudC0tOwotCQlpZiAoZWRpdFJlZmVyZW5jZUNvdW50IDwgMCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcml0ZSByZWZlcmVuY2UgY291bnQgZXJyb3I6ICAiICsgdGhpcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl1bmxvYWRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2F2ZUlmTmVjZXNzYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghaXNTaGFyZWRGb3JXcml0ZSgpKSAvLyBjYWxsZXIgaXMgdGhlIG9ubHkgcmVmZXJlbmNlcgotCQkJc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBUT19TVFJJTkcgKyBnZXRVUkkoKS50b1N0cmluZygpICsgUkVBRF9DT1VOVF9UT19TVFJJTkcgKyBuZXcgSW50ZWdlcihyZWFkUmVmZXJlbmNlQ291bnQpICsgV1JJVEVfQ09VTlRfVE9fU1RSSU5HICsgbmV3IEludGVnZXIoZWRpdFJlZmVyZW5jZUNvdW50KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI25lZWRzVG9TYXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1RvU2F2ZSgpIHsKLQkJcmV0dXJuIGlzTW9kaWZpZWQoKSAmJiAhaXNTaGFyZWRGb3JXcml0ZSgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYikgewotCQlmb3JjZVJlZnJlc2ggPSBiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3Nob3VsZEZvcmNlUmVmcmVzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRm9yY2VSZWZyZXNoKCkgewotCQlyZXR1cm4gZm9yY2VSZWZyZXNoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGFyZzAsIE1hcCBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQl0cnkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXN1cGVyLmJhc2ljRG9Mb2FkKGFyZzAsIGFyZzEpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvVW5sb2FkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJaWYgKGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSAmJiBlZGl0UmVmZXJlbmNlQ291bnQgPCAxKSAvL2RvIG5vdCB0dXJuIG9mZiBtb2RpZmljYXRpb24gaWYKLQkJCS8vIHdlIHN0aWxsIGhhdmUgYSB3cml0ZSBjb3VudAotCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQlzdXBlci5kb1VubG9hZCgpOwotCQlzZXRGb3JjZVJlZnJlc2goZmFsc2UpOwotCQlzZXRNb2RpZmllZChmYWxzZSk7IC8vZGNiIC0gdGhpcyBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCByZXNvdXJjZXMgd2l0aG91dCBmaWxlcyBhcmUKLQkJLy8gbWFya2VkIGFzIG5vdCBtb2RpZmllZC4KLQkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA9PSAwICYmIGVkaXRSZWZlcmVuY2VDb3VudCA9PSAwKSB7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZSh0aGlzKTsKLQkJfQotCQkJCi0JfQotCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgaGFzIGJlZW4gdW5sb2FkZWQsIGFuZCB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcy4gVHJlYXQgdGhlIHJlc291cmNlIGxpa2UgYSBuZXcKLQkgKiBSZXNvdXJjZQotCSAqLwotCS8vIG5ldmVyIHVzZWQKLS8vCXByaXZhdGUgdm9pZCByZXNldEFzTmV3KCkgewotLy8JCXJlYWRSZWZlcmVuY2VDb3VudCA9IDE7Ci0vLwkJaXNOZXcgPSB0cnVlOwotLy8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2Ujc2F2ZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbm90aWZ5QWJvdXRUb1NhdmUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnNhdmUob3B0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2F2ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTYXZlZCgpIHsKLQkJbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX1dBU19TQVZFRCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUFib3V0VG9TYXZlKCkgewotICAgICAgICBub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRSk7Ci0gICAgfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVNhdmVGYWlsZWQoKSB7Ci0gICAgICAgIG5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9TQVZFX0ZBSUxFRCk7Ci0gICAgfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlTYXZlRXZlbnQoaW50IGV2ZW50VHlwZSkgewotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0KLQkJCW5ldyBOb3RpZmljYXRpb25JbXBsKGV2ZW50VHlwZSwgdGhpcywgdGhpcykKLQkJCXsKLQkJCSAgcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpCi0JCQkgIHsKLQkJCQlyZXR1cm4gUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbC50aGlzOwotCQkJICB9Ci0JCQkgIHB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKENsYXNzIGV4cGVjdGVkQ2xhc3MpCi0JCQkgIHsKLQkJCQlyZXR1cm4gZXZlbnRUeXBlOwotCQkJICB9Ci0JCQl9OwotCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5SZWZlcmVuY2VkUmVzb3VyY2Ujd2FzUmV2ZXJ0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhc1JldmVydGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBFTGlzdCBlQWRhcHRlcnMoKQotCSAgewotCSAgICBpZiAoZUFkYXB0ZXJzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQWRhcHRlcnMgPSAgbmV3IEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUFkYXB0ZXJzOwotCSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTljMzdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIGFwaSBmb3IgcmVuZGVyaW5nIGFuIEVNRiBvYmplY3QgdG8gWE1MIGFuZCB2aWNlIHZlcnNhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUF9TQ0hFTUFfTEFOR1VBR0UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYUxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNDX1hNTF9TQ0hFTUEgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQl2b2lkIHNldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSBhUmVzb3VyY2UpOwotCi0JVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCk7Ci0KLQl2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlib29sZWFuIHVzZVN0cmVhbXNGb3JJTygpOwotCi0Jdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpOwotCi0JaW50IGdldFZlcnNpb25JRCgpOwotCi0JYm9vbGVhbiBpc01vZGlmaWVkKCk7Ci0KLQl2b2lkIGFjY2Vzc0ZvcldyaXRlKCk7Ci0KLQl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsKLQotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQl2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKTsKLQotCXZvaWQgcHJlRGVsZXRlKCk7Ci0KLQl2b2lkIHByZVVubG9hZCgpOwotCi0JYm9vbGVhbiBpc1NoYXJlZCgpOwotCi0JYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCk7Ci0KLQl2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpOwotCQotCWJvb2xlYW4gaXNCYXRjaE1vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjk0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVuZGVyZXJGYWN0b3J5IGRlZmF1bHRSZW5kZXJlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBkZWZhdWx0SGFuZGxlcjsKLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKLQotCS8qKgotCSAqIEludGVyZXN0ZWQgcGFydGllcyBjYW4gdXNlIHRoZQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgTm90aWZpZXIgTm90aWZpY2F0aW9uRW5naW5lID0gTm90aWZpZXIuSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJaWYgKGRlZmF1bHRSZW5kZXJlckZhY3RvcnkgPT0gbnVsbCkKLQkJCWRlZmF1bHRSZW5kZXJlckZhY3RvcnkgPSBnZXREZWZhdWx0SGFuZGxlcigpLmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGRlZmF1bHRSZW5kZXJlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJcblxuKioqU2V0dGluZyBmYWN0b3J5OiAiICsgZmFjdG9yeSk7Ci0JCU5vdGlmaWNhdGlvbkVuZ2luZS5ub3RpZnlMaXN0ZW5lcnMoZmFjdG9yeSk7Ci0JCWRlZmF1bHRSZW5kZXJlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUmVuZGVyZXJGYWN0b3J5IGluc3RhbmNlOiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdGlmaWVyIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOb3RpZmllciBJTlNUQU5DRSA9IG5ldyBOb3RpZmllcigpOwotCi0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiByZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBOb3RpZmllcigpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhSZW5kZXJlckZhY3RvcnkgcmVuZGVyZXJGYWN0b3J5KSB7Ci0KLQkJCWZpbmFsIGludCBsZW5ndGggPSByZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMuc2l6ZSgpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmeWluZyAiICsgbGVuZ3RoICsgIiBsaXN0ZW5lcnMiKTsKLQotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkvKgotCQkJCSAqIFNpbmNlIHRoZSByZW5kZXJlciBmYWN0b3JpZXMgYXJlIHNpbmdsZXRvbnMsIHRoaXMgcmVmZXJlbmNlIGNoZWNrIHNob3VsZCBhbHdheXMKLQkJCQkgKiB3b3JrCi0JCQkJICovCi0JCQkJaWYgKHJlbmRlcmVyRmFjdG9yeSAhPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSB7Ci0JCQkJCVdlYWtSZWZlcmVuY2Ugd3JlZiA9IG51bGw7Ci0JCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlRmFjdG9yeUxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCQl3cmVmID0gKFdlYWtSZWZlcmVuY2UpIGkubmV4dCgpOwotCQkJCQkJCWxpc3RlbmVyID0gKExpc3RlbmVyKSB3cmVmLmdldCgpOwotCQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZnlpbmcgTGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCQkJCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJCQkJCWxpc3RlbmVyLnVwZGF0ZVJlbmRlcmVyRmFjdG9yeShyZW5kZXJlckZhY3RvcnkpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJaS5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGwpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgbGlzdGVuZXI6ICIgKyBsKTsKLQkJCXN5bmNocm9uaXplZCAocmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzKSB7Ci0JCQkJcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZShsKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lclRvUmVtb3ZlKSB7Ci0JCQlmaW5hbCBpbnQgbGVuZ3RoID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLnNpemUoKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJV2Vha1JlZmVyZW5jZSB3cmVmID0gbnVsbDsKLQkJCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQkJd3JlZiA9IChXZWFrUmVmZXJlbmNlKSBpLm5leHQoKTsKLQkJCQkJCWxpc3RlbmVyID0gKExpc3RlbmVyKSB3cmVmLmdldCgpOwotCQkJCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobGlzdGVuZXIgPT0gbGlzdGVuZXJUb1JlbW92ZSkgewotCQkJCQkJCQlpLnJlbW92ZSgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWkucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgewotCQl2b2lkIHVwZGF0ZVJlbmRlcmVyRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgbmV3UmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgewotCQlyZXR1cm4gdmFsaWRhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiBiKSB7Ci0JCXZhbGlkYXRpbmcgPSBiOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGdldERlZmF1bHRIYW5kbGVyKCkgewotCQlpZiAoZGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkKLQkJCWRlZmF1bHRIYW5kbGVyID0gRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLklOU1RBTkNFOwotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEhhbmRsZXIoUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgaGFuZGxlcikgewotCQlkZWZhdWx0SGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NWRmNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7Ci0KLQlSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk4NGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciB7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgaXMgYXBwbGljYWJsZSB0byB0aGUgZ2l2ZW4gZmlsZVVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSSSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3VycmVudCBkZXNjcmlwdG9yIGRlY2xhcmVzIGEgcmVzb3VyY2UgZmFjdG9yeSBhcHBsaWNhYmxlIHRvIHRoZSBnaXZlbiBVUkkuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmFibGVkRm9yKFVSSSBmaWxlVVJJKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudFR5cGUgaXMgb25lIG9wdGlvbmFsIHdheSB0aGF0IGEgUmVzb3VyY2VGYWN0b3J5Ci0JICogbWlnaHQgYXBwbHkgdG8gYSBVUkkuIENsaWVudHMgc2hvdWxkIGNhbGwge0BsaW5rIGlzRW5hYmxlZEZvcn0gCi0JICogaW5zdGVhZCBvZiBjb21wYXJpbmcgdGhlIGNvbnRlbnQgVHlwZXMgd2hlbiBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXBwbGljYWJsZSBkZXNjcmlwdG9yIGZyb20gYSBzZXQuICAKLQkgKiAKLQkgKiA8cD48Yj5TdWJjbGFzc2VzIG1heSByZXR1cm4gbnVsbC4ob3B0aW9uYWwpPC9iPjwvcD4KLQkgKiAgCi0JICogQHJldHVybiBUaGUgY29udGVudCB0eXBlIHRoYXQgdGhpcyBkZXNjcmlwdG9yIGlzIGFwcGxpY2FibGUgdG8uCi0JICovCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW4gdGhlIGNhc2Ugd2hlcmUgbW9yZSB0aGFuIG9uZSBmYWN0b3J5IGlzIGRlZmluZWQgZm9yIHRoZSBzYW1lIGZpbGVOYW1lLCAKLQkgKiBhbmQgY3JlYXRpb24gaXMgcGFzc2VkIGEgdXJpIG9ubHkgYSBkZWZhdWx0IGZhY3RvcnkgaXMgbmVlZGVkCi0JICogCi0JICogIAotCSAqIEByZXR1cm4gVGhlIGJvb2xlYW4gZGVzY3JpYmluZyB0aGUgZGVmYXVsdCBmYWN0b3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2hvcnQgc2VnbWVudCBpcyBvbmUgcG9zc2libGUgd2F5IHRoYXQgYSBSZXNvdXJjZUZhY3RvcnkKLQkgKiBtaWdodCBhcHBseSB0byBhIFVSSS4gQ2xpZW50cyBzaG91bGQgY2FsbCB7QGxpbmsgaXNFbmFibGVkRm9yfSAKLQkgKiBpbnN0ZWFkIG9mIGNvbXBhcmluZyB0aGUgc2hvcnQgc2VnbWVudHMgd2hlbiBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXBwbGljYWJsZSBkZXNjcmlwdG9yIGZyb20gYSBzZXQuICAKLQkgKiAKLQkgKiA8cD48Yj5TdWJjbGFzc2VzIG1heSBOT1QgcmV0dXJuIG51bGwuPC9iPjwvcD4KLQkgKiAgCi0JICogQHJldHVybiBUaGUgc2hvcnQgc2VnbWVudCB0aGF0IHRoaXMgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRTZWdtZW50KCk7Ci0JCi0JCi0JLyoqCi0JICogVGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuRmFjdG9yeS4gVGhlIGluc3RhbmNlIHJldHVybmVkCi0JICogbWF5IG9yIG1heSBub3QgYmUgdW5pcXVlLCBzbyBpZiB5b3UgcmVxdWlyZSB0aGUgc2FtZSBpbnN0YW5jZSAKLQkgKiBmb3IgZWFjaCBjYWxsLCB5b3Ugc2hvdWxkIGNhY2hlIHRoZSB2YWx1ZSByZXR1cm5lZCB0aGUgZmlyc3QKLQkgKiB0aW1lIGZyb20gdGhpcyBtZXRob2QuIAotCSAqIAotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2UuRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCk7Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldFNob3J0U2VnbWVudCgpLmhhc2hDb2RlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikKLQkJCXJldHVybiBnZXRTaG9ydFNlZ21lbnQoKS5lcXVhbHMoKChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKW8pLmdldFNob3J0U2VnbWVudCgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Sb290VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTY0MGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFJvb3RUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUm9vdFRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGVDbGFzcwotCSAqLwotCXB1YmxpYyBSb290VHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGVDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShOb3RpZmllciwgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7Ci0JCSgoUmVzb3VyY2UpIG93bmVyKS5nZXRDb250ZW50cygpLmFkZChuZXdJbmRleCwgKEVPYmplY3QpdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjcmVtb3ZlTU9GVmFsdWUoTm90aWZpZXIsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCSgoUmVzb3VyY2UpIG93bmVyKS5nZXRDb250ZW50cygpLnJlbW92ZSh2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoUmVzb3VyY2UgcmVzLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCi0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpdmFsdWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNdWx0aVZhbHVlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVZhbHVlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Tb3VyY2VMaW5rVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWQ2OTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VMaW5rVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKLQkgKiBAcGFyYW0gYUZlYXR1cmUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIFNvdXJjZUxpbmtUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKLQkJZlN0eWxlIHw9IHN0eWxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgc3R5bGUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0KLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKHN0clZhbHVlICE9IG51bGwpCi0JCQkvLyBGaW5kIHRoZSBvYmplY3Qgd2l0aCB0aGUgbmFtZSB0aGF0IG1hdGNoZXMgbWF0Y2hOYW1lCi0JCQl2YWx1ZSA9IGZUcmFuc2xhdG9yUGF0aHNbMF0uZmluZE9iamVjdChvd25lciwgc3RyVmFsdWUudHJpbSgpKTsKLQkJaWYgKChmU3R5bGUgJiBUcmFuc2xhdG9yLlNUUklOR19SRVNVTFRfT0spICE9IDApCi0JCQlyZXR1cm4gKCh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogc3RyVmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJVHJhbnNsYXRvclBhdGggcGF0aCA9IGZUcmFuc2xhdG9yUGF0aHNbMF07Ci0JCU9iamVjdCBhdHRyVmFsdWUgPSBwYXRoLmdldExhc3RNYXAoKS5nZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdmFsdWUpOwotCQlyZXR1cm4gcGF0aC5nZXRMYXN0TWFwKCkuY29udmVydFZhbHVlVG9TdHJpbmcoYXR0clZhbHVlLCBvd25lcik7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWY0ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotLyoqCi0gKiBEZWNsYXJlcyBhIHN1YmNsYXNzIHRvIGNyZWF0ZSBSZXNvdXJjZS5GYWN0b3J5KGllcykgZnJvbSBhbiBleHRlbnNpb24uIAotICovCi1jbGFzcyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2hvcnRTZWdtZW50OwotCXByaXZhdGUgZmluYWwgUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5OwotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzaG9ydFNlZ21lbnQgQSBub24tbnVsbCBuYW1lIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmFjdG9yeQotCSAqIEBwYXJhbSBmYWN0b3J5IEEgbm9uLW51bGwgUmVzb3VyY2UuRmFjdG9yeSB0aGF0IGNhbiBsb2FkIGZpbGVzIG9mIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IoU3RyaW5nIHNob3J0U2VnbWVudCwgUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc2hvcnRTZWdtZW50KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5KTsKLQkJdGhpcy5zaG9ydFNlZ21lbnQgPSBzaG9ydFNlZ21lbnQ7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfSAgCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoVVJJIGZpbGVVUkkpIHsKLQkJLyogc2hvcnRTZWdtZW50IG11c3QgYmUgbm9uLW51bGwgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGNyZWF0ZWQsIAotCQkgKiBhIHZhbGlkYXRpb24gY2hlY2sgaW4gaW5pdCgpIHZlcmlmaWVzIHRoaXMgcmVxdWlyZW1lbnQgKi8KLQkJaWYoZmlsZVVSSSAhPSBudWxsICYmIGZpbGVVUkkubGFzdFNlZ21lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIHNob3J0U2VnbWVudC5lcXVhbHMoZmlsZVVSSS5sYXN0U2VnbWVudCgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gCi0JCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpIHsKLQkJIHJldHVybiBmYWN0b3J5OwkJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRTZWdtZW50KCkgewotCQlyZXR1cm4gc2hvcnRTZWdtZW50OwotCX0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjI4MDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVydGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFRyYW5zbGF0b3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fU1RZTEUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPTV9BVFRSSUJVVEUgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVNUFRZX1RBRyA9IDEgPDwgMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDREFUQV9DT05URU5UID0gMSA8PCAyOwotCS8qKgotCSAqIFN0eWxlIGJpdCB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBlbmQgdGFnIHNob3VsZCBOT1QgYmUgaW5kZW50ZWQ7IGJ5IGRlZmF1bHQgaXQgaXMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5EX1RBR19OT19JTkRFTlQgPSAxIDw8IDM7Ci0JLyoqCi0JICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYm9vbGVhbnMgc2hvdWxkIE5PVCBiZSBjb252ZXJ0ZWQgYXMgIlRydWUiIGFuZCAiRmFsc2UiOyBkZWZhdWx0Ci0JICogaXMgdGhhdCB0aGV5IGFyZQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJPT0xFQU5fTE9XRVJDQVNFID0gMSA8PCA0OwotCS8qKgotCSAqIFN0eWxlIGJpdCB0aGF0IGluZGljYXRlcyBhbiBlbnVtIHZhbHVlIGNvbnRhaW5zIGh5cGhlbnMgSWYgdGhpcyBpcyB0cnVlLCB0aGVuIGludGVybmFsbHkgdGhlCi0JICogaHlwaGVucyBhcmUgcmVwbGFjZWQgd2l0aCB1bmRlcnNjb3JlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVU1fRkVBVFVSRV9XSVRIX0hZUEhFTlMgPSAxIDw8IDU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBPQkpFQ1RfTUFQID0gMSA8PCA2OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEJPT0xFQU5fRkVBVFVSRSA9IDEgPDwgNzsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNIQVJFRF9SRUZFUkVOQ0UgPSAxIDw8IDg7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZmVhdHVyZSBtYXkgYmUgc2lnbmlmaWNhbnQgZXZlbiBpZiBpdCBpcyBlbXB0eQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQgPSAxIDw8IDk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgZmVhdHVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb21tZW50IG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBDT01NRU5UX0ZFQVRVUkUgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGlzIG51bGwsIHRoZW4gYW4gZVVuc2V0KCkgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5TRVRfSUZfTlVMTCA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgY29udGVudHMgYXMgYSBTdHJpbmcgaWYgdGhlIGZlYXR1cmUgaXMgdW5yZXNvbHZlYWJsZSAoVXNlZCBieSB0aGUKLQkgKiBTb3VyY2VMaW5rVHJhbnNsYXRvcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFJJTkdfUkVTVUxUX09LID0gMSA8PCAxMjsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBmRE9NTmFtZXM7Ci0JcHJvdGVjdGVkIFN0cmluZyBmRE9NUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIE1hcCByZWFkQWhlYWROYW1lczsKLQlwcm90ZWN0ZWQgaW50IGZTdHlsZSA9IE5PX1NUWUxFOwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclBhdGhbXSBmVHJhbnNsYXRvclBhdGhzOwotCXByb3RlY3RlZCBFQ2xhc3MgZW1mQ2xhc3M7Ci0JcHJvdGVjdGVkIFN0cmluZyBmTmFtZVNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBhZGRlZCBieSBNREUKLQlwcm90ZWN0ZWQgU3RyaW5nIGRvbU5hbWVBbmRQYXRoID0gbnVsbDsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbnkgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgVHJhbnNsYXRvciBhcmUgdGhlbXNlbHZlcyBEZXBlbmRlbmN5VHJhbnNsYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0RlcGVuZGVuY3lQYXJlbnQ7Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXBlbmRlbmN5RmVhdHVyZTsKLQlwcm90ZWN0ZWQgc3RhdGljIEVjb3JlUGFja2FnZSBFQ09SRV9QQUNLQUdFID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQotCS8vIFVzZSB0aGlzIGlkZW50aWZpZXIgZm9yIHRoZSBET01OYW1lIHdoZW4gdGhlIGF0dHJpYnV0ZQotCS8vIHZhbHVlIGlzIHRvIGJlIGV4dHJhY3RlZCBkaXJlY3RseSBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBub2RlLgotCS8vIFRoaXMgaXMgcmFyZSwgYnV0IG9jY3VycyBpbiB0aGUgd2ViLnhtbCBpbiB0aGUgY2FzZSBvZiBhCi0JLy8gV2VsY29tZUZpbGUuCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgVEVYVF9BVFRSSUJVVEVfVkFMVUUgPSAiJFRFWFRfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgQ09OVEFJTkVSX0ZFQVRVUkUgPSBuZXcgQ29udGFpbmVyRmVhdHVyZSgpOwotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgUk9PVF9GRUFUVVJFID0gbmV3IFJvb3RGZWF0dXJlKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbnRhaW5lckZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKLQkJcHJvdGVjdGVkIENvbnRhaW5lckZlYXR1cmUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSb290RmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgewotCQlwcm90ZWN0ZWQgUm9vdEZlYXR1cmUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgZmluZENoaWxkKFN0cmluZyB0YWdOYW1lLCBPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0KLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkcmVuKHRhcmdldCwgdmVyc2lvbklEKTsKLQotCQlpZiAobWFwcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmFuc2xhdG9yIG1hcCA9IG1hcHNbaV07Ci0JCQkJaWYgKG1hcC5pc01hcEZvcih0YWdOYW1lKSkgewotCQkJCQlyZXN1bHQgPSBtYXA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwgJiYgZmFjdG9yeS5hY2NlcHRzKHRhZ05hbWUpKSB7Ci0JCQkJcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGUodGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBzdHJpbmcgdG9nZXRoZXIgYXJyYXlzIG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksIGFycmF5MS5sZW5ndGggKyBhcnJheTIubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBuZXcgT2JqZWN0W117b2JqZWN0Mn07Ci0JCXJldHVybiBjb25jYXQoYXJyYXkxLCBuZXdBcnJheSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBhcmVudEFuZFRleHRBdHRyaWJ1dGVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgcGFyZW50RmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciBwYXJlbnQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoZG9tTmFtZSwgcGFyZW50RmVhdHVyZSwgRU5EX1RBR19OT19JTkRFTlQpOwotCQlwYXJlbnQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXXtuZXcgVHJhbnNsYXRvcihURVhUX0FUVFJJQlVURV9WQUxVRSwgY2hpbGRGZWF0dXJlKX0pOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlpbml0aWFsaXplRE9NTmFtZUFuZFBhdGgoZG9tTmFtZUFuZFBhdGgpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCXNldEZlYXR1cmUoYUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXRoaXMoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKLQkJc2V0RU1GQ2xhc3MoZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCkgewotCQl0aGlzKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgbmV3IFRyYW5zbGF0b3JQYXRoW117cGF0aH0pOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHBhdGhzKSB7Ci0JCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7Ci0JCWZUcmFuc2xhdG9yUGF0aHMgPSBwYXRoczsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSkgewotCQlpbml0aWFsaXplRE9NTmFtZUFuZFBhdGgoZG9tTmFtZUFuZFBhdGgpOwotCQlmU3R5bGUgPSBzdHlsZTsKLQkJc2V0RmVhdHVyZShhRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFY29yZVBhY2thZ2UgZ2V0RWNvcmVQYWNrYWdlKCkgewotCQlyZXR1cm4gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBmRE9NTmFtZXNbMF07Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldERPTU5hbWVzKCkgewotCQlyZXR1cm4gZkRPTU5hbWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RE9NUGF0aCgpIHsKLQkJcmV0dXJuIGZET01QYXRoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0RPTVBhdGgoKSB7Ci0JCXJldHVybiBmRE9NUGF0aCAhPSBudWxsICYmIGZET01QYXRoLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgRE9NIG5hbWVzIGFuZCBwYXRoIG91dCBvZiA8ZG9tTmFtZUFuZFBhdGg+YW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgZmllbGRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVET01OYW1lQW5kUGF0aChTdHJpbmcgZG9tTmFtZUFuZFBhdGhBcmcpIHsKLQkJaWYgKGRvbU5hbWVBbmRQYXRoQXJnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbnggPSBkb21OYW1lQW5kUGF0aEFyZy5sYXN0SW5kZXhPZignLycpOwotCQlpZiAoaW54ICE9IC0xKSB7Ci0JCQlmRE9NTmFtZXMgPSBwYXJzZURPTU5hbWVzKGRvbU5hbWVBbmRQYXRoQXJnLnN1YnN0cmluZyhpbnggKyAxKSk7Ci0JCQlmRE9NUGF0aCA9IGRvbU5hbWVBbmRQYXRoQXJnLnN1YnN0cmluZygwLCBpbngpOwotCQl9IGVsc2UgewotCQkJZkRPTU5hbWVzID0gcGFyc2VET01OYW1lcyhkb21OYW1lQW5kUGF0aEFyZyk7Ci0JCQlmRE9NUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gYWRkZWQgYnkgTURFCi0JCXRoaXMuZG9tTmFtZUFuZFBhdGggPSBkb21OYW1lQW5kUGF0aEFyZzsKLQotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSB3cml0dGVuIGFzIGFuIGVtcHR5IHRhZzsgZWcsIDxkaXN0cmlidXRhYmxlLz4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NEQVRBQ29udGVudCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBDREFUQV9DT05URU5UKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBET01OYW1lIHJlcHJlc2VudHMgYSBzdWIgZWxlbWVudCBuYW1lIG9yIGFuIGF0dHJpYnV0ZSBuYW1lCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIERPTU5hbWUgaXMgYW4gYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNET01BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRE9NX0FUVFJJQlVURSkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgd3JpdHRlbiBhcyBhbiBlbXB0eSB0YWc7IGVnLCA8ZGlzdHJpYnV0YWJsZS8+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eVRhZygpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBFTVBUWV9UQUcpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuVXBwZXJjYXNlKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEJPT0xFQU5fRkVBVFVSRSkgIT0gMCAmJiAoZlN0eWxlICYgQk9PTEVBTl9MT1dFUkNBU0UpID09IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuRmVhdHVyZSgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBCT09MRUFOX0ZFQVRVUkUpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIEVORF9UQUdfTk9fSU5ERU5UKSA9PSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudEVuZFRhZyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIHNob3VsZEluZGVudEVuZFRhZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHlDb250ZW50U2lnbmlmaWNhbnQoKSB7Ci0JCXJldHVybiAoKGZTdHlsZSAmIEVNUFRZX1RBRykgIT0gMCkgfHwgKChmU3R5bGUgJiBFTVBUWV9DT05URU5UX0lTX1NJR05JRklDQU5UKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgaXMgdG8gYW5vdGhlciBNT0Ygb2JqZWN0IChub3QgYSBwcmltaXRpdmUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPYmplY3RNYXAoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgT0JKRUNUX01BUCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgaXMgZm9yIGEgc2hhcmVkIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gKGZTdHlsZSAmIFNIQVJFRF9SRUZFUkVOQ0UpICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnVtV2l0aEh5cGhlbnMoKSB7Ci0JCXJldHVybiAoZlN0eWxlICYgRU5VTV9GRUFUVVJFX1dJVEhfSFlQSEVOUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWFwIHJlcHJlc2VudHMgYSBjYXNlIHdoZXJlIHRoZSB0ZXh0IG9mIHRoZSBET01Ob2RlIHJlcHJlc2VudHMgdGhlCi0JICogb2JqZWN0cyBvbmUgYW5kIG9ubHkgYXR0cmlidXRlIHZhbHVlLiBBbiBleGFtcGxlIG9mIHRoaXMgY2FzZSBpcyBhIDx3ZWxjb21lLWZpbGU+ZmlsZS50eHQKLQkgKiA8L3dlbGNvbWUtZmlsZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNET01UZXh0VmFsdWUoKSB7Ci0JCXJldHVybiBmRE9NTmFtZXNbMF0gPT0gVEVYVF9BVFRSSUJVVEVfVkFMVUU7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkIGlzIHRoZSBtb2YgYXR0cmlidXRlIHRoYXQgc2hvdWxkIGJlIHNldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lETWFwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlkIGlzIHRoZSBtb2YgYXR0cmlidXRlIHRoYXQgc2hvdWxkIGJlIHNldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtNYXAoKSB7Ci0JCXJldHVybiBmVHJhbnNsYXRvclBhdGhzICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRMaW5rTWFwKCkgewotCQlyZXR1cm4gaXNMaW5rTWFwKCkgJiYgIWlzT2JqZWN0TWFwKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBtYXAgaXMgdGhlIG9uZSByZXByZXNlbnRpbmcgYSBub2RlIHdpdGggdGhlIG5hbWUgPGRvbU5hbWU+LiBCeSBkZWZhdWx0Ci0JICogdGhpcyBtZXRob2Qgc2ltcGx5IGNvbXBhcmVzIHRoZSBET00gbmFtZSBvZiB0aGUgbWFwIGFnYWluc3QgdGhlIDxkb21OYW1lPnBhcmFtZXRlcgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBkb21OYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoU3RyaW5nIGRvbU5hbWUpIHsKLQkJaWYgKGRvbU5hbWUuZXF1YWxzKGdldERPTVBhdGgoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRE9NTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkb21OYW1lLmVxdWFscyhmRE9NTmFtZXNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihPYmplY3QgYUZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IGFGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIGZlYXR1cmUgYmVpbmcgbWFwcGVkIGlzIGEgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBtdWx0aSB2YWx1ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVZhbHVlZCgpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCXJldHVybiBmZWF0dXJlLmlzTWFueSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGNvbW1hIHNlcGFyYXRlZCBuYW1lcyBmcm9tIDxkb21OYW1lc1N0cmluZz4uIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbmFtZXMuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZG9tTmFtZXNTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VET01OYW1lcyhTdHJpbmcgZG9tTmFtZXNTdHJpbmcpIHsKLQkJaW50IHN0YXJ0SW54ID0gMDsKLQkJaW50IGlueCA9IGRvbU5hbWVzU3RyaW5nLmluZGV4T2YoJywnKTsKLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQl3aGlsZSAoaW54ICE9IC0xKSB7Ci0JCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZy5zdWJzdHJpbmcoc3RhcnRJbngsIGlueCkpOwotCQkJc3RhcnRJbnggPSBpbnggKyAxOwotCQkJaW54ID0gZG9tTmFtZXNTdHJpbmcuaW5kZXhPZignLCcsIHN0YXJ0SW54KTsKLQkJfQotCQlpZiAoc3RhcnRJbnggPT0gMCkKLQkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nKTsKLQkJZWxzZQotCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcuc3Vic3RyaW5nKHN0YXJ0SW54KSk7Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgY24gPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOwotCQljbiA9IGNuLnN1YnN0cmluZygrK2ksIGNuLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKGNuKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXNiLmFwcGVuZChmRE9NTmFtZXNbMF0pOwotCQlmb3IgKGludCBqID0gMTsgaiA8IGZET01OYW1lcy5sZW5ndGg7IGorKykgewotCQkJc2IuYXBwZW5kKCd8Jyk7Ci0JCQlzYi5hcHBlbmQoZkRPTU5hbWVzW2pdKTsKLQkJfQotCQlzYi5hcHBlbmQoJywnKTsKLQkJc2IuYXBwZW5kKGhhc2hDb2RlKCkpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVHJhbnNsYXRvclBhdGguCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgVHJhbnNsYXRvclBhdGgKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclBhdGhbXSBnZXRUcmFuc2xhdG9yUGF0aHMoKSB7Ci0JCXJldHVybiBmVHJhbnNsYXRvclBhdGhzOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2xhdG9yKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJVHJhbnNsYXRvciBtYXBJbmZvID0gKFRyYW5zbGF0b3IpIG9iamVjdDsKLQkJcmV0dXJuIGZET01OYW1lcy5lcXVhbHMobWFwSW5mby5nZXRET01OYW1lcygpKSAmJiAoZmVhdHVyZSA9PSBudWxsICYmIG1hcEluZm8uZ2V0RmVhdHVyZSgpID09IG51bGwgfHwgZmVhdHVyZS5lcXVhbHMobWFwSW5mby5nZXRGZWF0dXJlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpc01hbmFnZWRCeVBhcmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKG51bGwsIC0xKSA9PSBudWxsOwotCX0KLQotCS8qCi0JICogSW4gdGhlIDk5JSBjYXNlIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUgbmFtZSB0byBiZSBjb25jZXJuZWQgd2l0aCwgYnV0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0JICogZm9yIHRoZSBjYXNlcyB3aGVyZSBtdWx0aXBsZSBkb20gbmFtZXMgbWFwIHRvIG9uZSBmZWF0dXJlCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKLQkJaWYgKGVtZkNsYXNzID09IG51bGwpIHsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaXNPYmplY3RNYXAoKSkKLQkJCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KGZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVFTUZPYmplY3QoZW1mQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCWlmIChhRmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdCgoKEVSZWZlcmVuY2UpIGFGZWF0dXJlKS5nZXRFUmVmZXJlbmNlVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KEVDbGFzcyBhbkVDbGFzcykgewotCQlpZiAoYW5FQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYW5FQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKGFuRUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0VmFsdWVJZk5lY2Vzc2FyeShTdHJpbmcgdGV4dFZhbHVlLCBOb3RpZmllciBvd25lciwgaW50IHZlcnNpb25JZCkgewotCQlUcmFuc2xhdG9yIHRleHRUcmFuc2xhdG9yID0gdGhpcy5maW5kQ2hpbGQoVHJhbnNsYXRvci5URVhUX0FUVFJJQlVURV9WQUxVRSwgb3duZXIsIHZlcnNpb25JZCk7Ci0JCWlmICh0ZXh0VHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0VmFsdWUgPSB0ZXh0VHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZSh0ZXh0VmFsdWUsIChFT2JqZWN0KSBvd25lcik7Ci0JCQl0ZXh0VHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShvd25lciwgb2JqZWN0VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGZlYXR1cmUgaXMgdmFsaWQgb24gYSBwYXJ0aWN1bGFyIG1vZk9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgc3BlY2lmaWVkIGV4aXN0cyBvbiB0aGUgTU9GIG9iamVjdC4KLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZW1mT2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlLmdldE5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2xhdG9ycyB3aGljaCBkbyBub3QgaGF2ZSBhIGZlYXR1cmUgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggY3VzdG9tIGJlaGF2aW9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZ1ZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWlmIChpc0VtcHR5VGFnKCkgJiYgZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvL0Zha2UgaXQgb3V0IHdpdGggYSB2YWx1ZSAvLyROT04tTkxTLTEkCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSwgU3RyaW5nIHZhbHVlLCBOb3RpZmllciBvd25lcikgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQotCQkJaWYgKCF0aGlzLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVFTUZPYmplY3Qobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBjb252ZXJ0U3RyaW5nVG9WYWx1ZSh2YWx1ZSwgKEVPYmplY3QpIG93bmVyKTsKLQkJCX0KLQotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7Ci0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdCBUaGUgY29udmVydGVkIHZhbHVlCi0JICogQHBhcmFtIHN0clZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIHN0clZhbHVlOwotCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQkJc3RyVmFsdWUgPSBzdHJWYWx1ZS5yZXBsYWNlKCctJywgJ18nKTsKLQkJCWlmICghaXNDREFUQUNvbnRlbnQoKSkgewotCQkJCXN0clZhbHVlID0gc3RyVmFsdWUudHJpbSgpOwotCQkJfQotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5ERUZBVUxULmNvbnZlcnRWYWx1ZShzdHJWYWx1ZSwgZmVhdHVyZSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNFbXB0eVRhZygpICYmICFpc0RPTUF0dHJpYnV0ZSgpICYmICFpc0RPTVRleHRWYWx1ZSgpICYmIGlzQm9vbGVhbkZlYXR1cmUoKSkKLQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJRU9iamVjdCBjb252ZXJ0VG9UeXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJaWYgKGNvbnZlcnRUb1R5cGUgPT0gbnVsbCkKLQkJCQl2YWx1ZSA9IHN0clZhbHVlOwotCQkJZWxzZSBpZiAoY29udmVydFRvVHlwZS5lcXVhbHMoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RVN0cmluZygpKSkgewotCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSB2YWx1ZSBvZiBhIHNwZWNpZmllZCB0eXBlIHRvIGEgc3RyaW5nIHZhbHVlLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBmb3Igc3BlY2lhbAotCSAqIGNhc2VzIHdoZXJlIHNwZWNpYWwgY29udmVyc2lvbiBuZWVkcyB0byBvY2N1ciBiYXNlZCBvbiB0aGUgZmVhdHVyZSBhbmQgb3Igb2JqZWN0IHR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgVGhlIGNvbnZlcnRlZCB2YWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCB2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGlzRW51bVdpdGhIeXBoZW5zKCkpCi0JCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCdfJywgJy0nKTsKLQkJZWxzZSBpZiAoaXNCb29sZWFuVXBwZXJjYXNlKCkpCi0JCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgPyAiVHJ1ZSIgOiAiRmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldFZhcmlhYmxlQ2hpbGRyZW4oTm90aWZpZXIgdGFyZ2V0LCBpbnQgdmVyc2lvbikgewotCQlUcmFuc2xhdG9yW10gcmVzdWx0cyA9IG51bGw7Ci0JCVZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZmFjdG9yeSA9IGdldFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkoKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJTGlzdCB2YXJpYWJsZVRyYW5zbGF0b3JzID0gZmFjdG9yeS5jcmVhdGUodGFyZ2V0KTsKLQkJCWlmICh2YXJpYWJsZVRyYW5zbGF0b3JzICE9IG51bGwgJiYgdmFyaWFibGVUcmFuc2xhdG9ycy5zaXplKCkgPiAwKSB7Ci0JCQkJT2JqZWN0W10gdnRvYSA9IHZhcmlhYmxlVHJhbnNsYXRvcnMudG9BcnJheSgpOwotCi0JCQkJcmVzdWx0cyA9IG5ldyBUcmFuc2xhdG9yW3Z0b2EubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspCi0JCQkJCXJlc3VsdHNbaV0gPSAoVHJhbnNsYXRvcikgdnRvYVtpXTsKLQkJCX0KLQotCQl9Ci0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXN1bHRzID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbnVsbCBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byByZXR1cm4gc3BlY2lmaWMgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIE1PRiBjaGlsZHJlbiB0aGF0IGN1cnJlbnRseSBleGlzdCBmb3IgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0TU9GQ2hpbGRyZW4oRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlPYmplY3QgdmFsdWUgPSBnZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmIChpc011bHRpVmFsdWVkKCkpCi0JCQlyZXN1bHQgPSAoTGlzdCkgdmFsdWU7Ci0JCWVsc2UgaWYgKHZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSB2YWx1ZSBvZiBhIGZlYXR1cmUgaW4gYSBtb2Ygb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGZTdHlsZSAmIFVOU0VUX0lGX05VTEwpICE9IDAgJiYgdmFsdWUgPT0gbnVsbCkKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQlFeHRlbmRlZEVjb3JlVXRpbC5lU2V0T3JBZGQoKEVPYmplY3QpIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwgbmV3SW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoRU9iamVjdCkgb3duZXIsIHZhbHVlKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlzZXRNT0ZWYWx1ZSgoUmVzb3VyY2UpIG93bmVyLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkvLwkJCWVtZk9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJc2V0TU9GVmFsdWUoZW1mT2JqZWN0LCB2YWx1ZSwgLTEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKFJlc291cmNlIHJlcywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KXZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQlFeHRlbmRlZEVjb3JlVXRpbC5lVW5zZXRPclJlbW92ZSgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCWJvb2xlYW4gaXNTZXQgPSBmZWF0dXJlICE9IG51bGwgJiYgZW1mT2JqZWN0LmVJc1NldChmZWF0dXJlKTsKLQkJaWYgKGlzRW1wdHlUYWcoKSkKLQkJCXJldHVybiBpc1NldCAmJiAoKEJvb2xlYW4pIGVtZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5ib29sZWFuVmFsdWUoKTsKLQkJcmV0dXJuIGlzU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCWVtZk9iamVjdC5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMaXN0KEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkoKExpc3QpIG1vZk9iamVjdC5lR2V0KGZlYXR1cmUpKS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGFGZWF0dXJlOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvL1RoaXMgd2F5IGFuIGluc3RhbmNlIGNoZWNrIGhhcHBlbnMgb25seSBvbmNlCi0JCWlmIChhRmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWZTdHlsZSB8PSBPQkpFQ1RfTUFQOwotCQkJaWYgKCEoKEVSZWZlcmVuY2UpIGFGZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpCi0JCQkJZlN0eWxlIHw9IFNIQVJFRF9SRUZFUkVOQ0U7Ci0JCX0KLQotCQlpZiAoZ2V0RWNvcmVQYWNrYWdlKCkuZ2V0RUJvb2xlYW4oKSA9PSBmZWF0dXJlLmdldEVUeXBlKCkpCi0JCQlmU3R5bGUgfD0gQk9PTEVBTl9GRUFUVVJFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVNRkNsYXNzKEVDbGFzcyBhbkVDbGFzcykgewotCQl0aGlzLmVtZkNsYXNzID0gYW5FQ2xhc3M7Ci0JCWlmIChhbkVDbGFzcyAhPSBudWxsKQotCQkJZlN0eWxlIHw9IE9CSkVDVF9NQVA7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZWFkQWhlYWROYW1lcygpIHsKLQkJcmV0dXJuIHJlYWRBaGVhZE5hbWVzICE9IG51bGwgJiYgIXJlYWRBaGVhZE5hbWVzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYWQgYWhlYWQgbmFtZXMsIGlmIHRoZXkgYXJlIGRlZmluZWQsIGZvciBhIGdpdmVuIHBhcmVudCBub2RlIG5hbWUuIFRoaXMgaXMgdXNlZAotCSAqIHdoZW4gY3JlYXRpb24gb2YgYSBzcGVjaWZpYyBFTUYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YgYSBjaGlsZCBub2RlLgotCSAqLwotCXB1YmxpYyBSZWFkQWhlYWRIZWxwZXIgZ2V0UmVhZEFoZWFkSGVscGVyKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JCWlmIChyZWFkQWhlYWROYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVhZEFoZWFkSGVscGVyKSByZWFkQWhlYWROYW1lcy5nZXQocGFyZW50TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVhZEFoZWFkSGVscGVyKFJlYWRBaGVhZEhlbHBlciBoZWxwZXIpIHsKLQkJaWYgKHJlYWRBaGVhZE5hbWVzID09IG51bGwpCi0JCQlyZWFkQWhlYWROYW1lcyA9IG5ldyBIYXNoTWFwKDMpOwotCQlyZWFkQWhlYWROYW1lcy5wdXQoaGVscGVyLmdldFBhcmVudERPTU5hbWUoKSwgaGVscGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lDaGlsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlcGVuZGVuY3lQYXJlbnQoKSB7Ci0JCWlmIChpc0RlcGVuZGVuY3lQYXJlbnQgPT0gbnVsbCkgewotCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5GQUxTRTsKLQkJCVRyYW5zbGF0b3JbXSB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKG51bGwsIC0xKTsKLQkJCWlmICh0aGVDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkvL0ZvciBub3cgd2UgYXNzdW1lIG9uZQotCQkJCQlpZiAodGhlQ2hpbGRyZW5baV0uaXNEZXBlbmRlbmN5Q2hpbGQoKSkgewotCQkJCQkJaXNEZXBlbmRlbmN5UGFyZW50ID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJZGVwZW5kZW5jeUZlYXR1cmUgPSB0aGVDaGlsZHJlbltpXS5nZXREZXBlbmRlbmN5RmVhdHVyZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlcGVuZGVuY3lQYXJlbnQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RGVwZW5kZW5jeUZlYXR1cmUoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QoRU9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIChFT2JqZWN0KSBwYXJlbnQuZUdldChkZXBlbmRlbmN5RmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHdoZW4gdGhlIERPTSBwYXRoIGlzIG5vdCBudWxsLCBhbmQgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLiBEZWZhdWx0IGlzIGZhbHNlLCBidXQKLQkgKiBzdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuZGVyRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpOwotCX0KLQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSB0cmFuc2xhdG9yIHRvbGVyYXRlcyBwYXJlbnQgbm9kZXMgdGhhdCByZWxhdGUgdG8gdGhlIERPTSBwYXRoLCBhbmQgbm8gY2hpbGRyZW47Ci0JICogZGVmYXVsdCBpcyBkbyBub3RoaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKEVPYmplY3QgZU9iamVjdCkgewotCi0JfQotCi0JLyoqCi0JICogTmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVTcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lU3BhY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBkb20gYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVTcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZOYW1lU3BhY2UgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkgZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpIHsKLQkJaWYgKGlzT2JqZWN0TWFwKCkpCi0JCQlyZXR1cm4gRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LklOU1RBTkNFOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudW1GZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIEVDT1JFX1BBQ0tBR0UuZ2V0RUVudW0oKS5pc0luc3RhbmNlKGZlYXR1cmUuZ2V0RVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldHRhYmxlKCkgewotCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuaXNVbnNldHRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKLQkJcmV0dXJuIChmU3R5bGUgJiBDT01NRU5UX0ZFQVRVUkUpICE9IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjA2N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMwotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoKLSAqIFRyYW5zbGF0b3IgZmlsdGVycyBjYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gT2JqZWN0IGFuZCBBdHRyaWJ1dGUgVHJhbnNsYXRvcnMgd2l0aG91dAotICogYnJlYWtpbmcgdGhlbSBvdXQgaW50byBzZXBlcmF0ZSBkYXRhIHN0cnVjdHVyZXMuIFRoZSBGaWx0ZXIgd2lsbCByZWx5IG9uIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAqIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gVHJhbnNsYXRvci4KLSAqIAotICogZ2V0TmV4dENoaWxkKCkgd2lsbCByZXR1cm4gbnVsbCB3aGVuIG5vIG90aGVyIHRyYW5zbGF0b3JzIG9mIHRoZSBnaXZlbiBnZW5yZSBhcmUgYXZhaWxhYmxlLgotICogCi0gKiBUaGUgcHJvY2Vzc2luZyBoaW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgdGhlbiBwYXNzZWQgdG8gZ2V0TmV4dCpUcmFuc2xhdG9yKCkgc3RvcmUgaW5mb3JtYXRpb24KLSAqIHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGVkIGJldHdlZW4gY2FsbHMuIFRoZSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB3aWxsIGNyZWF0ZSBhIHByb3Blcmx5Ci0gKiBpbml0aWFsaXplZCBhcnJheS4gVGhlIGNvbnN0YW50cyBORVhUX1NUQVJUX0hJTlRfSU5EWCBhbmQgTU9ERV9ISU5UX0lORFggcHJvdmlkZSBwb2ludGVycyBpbnRvCi0gKiB0aGUgYXJyYXkgZm9yIHRoZSBORVhUX1NUQVJUIHBvc2l0aW9uIGFuZCB0aGUgcHJvcGVyIG1vZGUgdG8gb3BlcmF0ZSBpbgotICogKFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgb3IKLSAqICAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JGaWx0ZXIgewotCi0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcjsKLQlwcm90ZWN0ZWQgZmluYWwgaW50IHZlcnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVhUX1NUQVJUX0hJTlRfSU5EWCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ISU5UX0lORFggPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA9IDE7Ci0KLQkvKgotCSAqIFRoZXNlIFRyYW5zbGF0b3JGaWx0ZXJzIGFyZSB1c2VkIGluIGEgc3RhdGVsZXNzIG1vZGUuIE9ubHkgdGhlaXIgc2Nhbk5leHRUcmFuc2xhdG9yKCkgbWV0aG9kcwotCSAqIHdpbGwgYmUgaW52b2tlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JGaWx0ZXIgb2JqZWN0VHJhbnNsYXRvckZpbHRlciA9IG5ldyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKG51bGwsIC0xKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRmlsdGVyIGF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIgPSBuZXcgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcihudWxsLCAtMSk7Ci0KLQotCXByb3RlY3RlZCBpbnQgbW9kZSA9IFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREU7Ci0JcHJvdGVjdGVkIGludCBpbmRleCA9IC0xOwotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3IgY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgVHJhbnNsYXRvckZpbHRlcihUcmFuc2xhdG9yIHRyYW5zLCBpbnQgdmVyc2lvbikgewotCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuczsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsaW5nIHBlZWsgdHdpY2Ugd2lsbCBhZHZhbmNlIHRoZSBjdXJyZW50IGNoaWxkCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgcGVla05leHRDaGlsZChFT2JqZWN0IHRhcmdldCkgewotCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gZ2V0TmV4dENoaWxkKHRhcmdldCk7Ci0JCXJldHVybiBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRDaGlsZCgpIHdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyBvdGhlciB0cmFuc2xhdG9ycyBvZiB0aGUgZ2l2ZW4gZ2VucmUgYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvciBnZXROZXh0Q2hpbGQoRU9iamVjdCB0YXJnZXQpIHsKLQotCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3I7Ci0JCQljYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlpbnQgZm91bmQgPSAwOwotCQlUcmFuc2xhdG9yIGNoaWxkcmVuW10gPSBudWxsOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJCWNhc2UgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA6Ci0JCQkJY2hpbGRyZW4gPSB0aGlzLnRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCi0JCQkJLyogTG9vayBmb3IgdGhlIG5leHQgQXR0cmlidXRlIFRyYW5zbGF0b3IgKi8KLQkJCQlmb3VuZCA9IHNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgdGhpcy5pbmRleCk7Ci0KLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uICgzKSBlc2NhcGUgdGhlIFZBUklBQkxFX1RSQU5TTEFUT1JTIHByb2Nlc3NpbmcKLQkJCQkJICovCi0JCQkJCXJlc3VsdCA9IGNoaWxkcmVuW2ZvdW5kXTsKLQkJCQkJdGhpcy5pbmRleCA9IGZvdW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBSZXNldCB0aGUgaW5kZXguIERPIE5PVCBCUkVBSy4gQWxsb3cgZW50cnkgaW50byBWQVJJQUJMRV9UUkFOU0xBVE9SUyBjYXNlCi0JCQkJICovCi0JCQkJdGhpcy5pbmRleCA9IC0xOwotCQkJCS8qCi0JCQkJICogdXBkYXRlIHRoZSBtb2RlIHRvIFZBUklBQkxFX1RSQU5TTEFUT1JTIHNvIHdlIGNhbiBza2lwIHRvIGl0IGRpcmVjdGx5IG5leHQgdGltZQotCQkJCSAqLwotCQkJCXRoaXMubW9kZSA9IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREU7Ci0JCQljYXNlIFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgOgotCQkJCWNoaWxkcmVuID0gdGhpcy50cmFuc2xhdG9yLmdldFZhcmlhYmxlQ2hpbGRyZW4odGFyZ2V0LCB0aGlzLnZlcnNpb24pOwotCQkJCWZvdW5kID0gc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCB0aGlzLmluZGV4KTsKLQkJCQlpZiAoZm91bmQgPj0gMCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcCBhaGVhZCBvbgotCQkJCQkgKiB0aGUgbmV4dCBpbnZvY2F0aW9uCi0JCQkJCSAqLwotCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltmb3VuZF07Ci0JCQkJCXRoaXMuaW5kZXggPSBmb3VuZDsKLQkJCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBjcmVhdGVQcm9jZXNzaW5nSGludHMoKSB7Ci0JCXJldHVybiBuZXcgaW50W117LTEsIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREV9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBnZXROZXh0QXR0cmlidXRlVHJhbnNsYXRvcihUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIG5leHRIaW50LCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24pIHsKLQotCQlyZXR1cm4gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0Q2hpbGQodHJhbnNsYXRvciwgc3RhcnRIaW50LCBuZXh0SGludCwgdGFyZ2V0LCB2ZXJzaW9uLCBhdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dE9iamVjdFRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBuZXh0SGludCwgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uKSB7Ci0KLQkJcmV0dXJuIFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dENoaWxkKHRyYW5zbGF0b3IsIHN0YXJ0SGludCwgbmV4dEhpbnQsIHRhcmdldCwgdmVyc2lvbiwgb2JqZWN0VHJhbnNsYXRvckZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmV4dENoaWxkKCkgdGFrZXMgaGludHMgb24gd2hlcmUgdG8gYmVnaW4gaW4gdGhlIGNoaWxkcmVuIGFycmF5IG9mIHRoZSBnaXZlbiBUcmFuc2xhdG9yLgotCSAqIFdoZW4gaXQgZmluZHMgdGhlIHRyYW5zbGF0b3IsIGl0IHdpbGwgdXBkYXRlIHRoZSBoaW50cyBhcnJheSB3aXRoIHRoZSBzdGFydCBoaW50IGZvciB0aGUgbmV4dAotCSAqIGludm9jYXRpb24oaGludHNbMF0pIGFuZCB3aGVuIG5lY2Vzc2FyeSBpdCB3aWxsIHVzZSB1cGRhdGUgdGhlIG1vZGUgKGhpbnRzWzFdKSB0byBlaXRoZXIKLQkgKiBTVEFOREFSRF9UUkFOU0xBVE9SUyBvciBWQVJJQUJMRV9UUkFOU0xBVE9SUy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvcgotCSAqIEBwYXJhbSBzdGFydEhpbnQKLQkgKiBAcGFyYW0gaGludHMKLQkgKiAgICAgICAgICAgIGEgdHdvLWVsZW1lbnQgYXJyYXk6IGhpbnRzWzBdIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IHN0YXJ0SGludCBhbmQgaGludHNbMV0KLQkgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgbW9kZS4KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gdHJhbnNsYXRvckZpbHRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dENoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gaGludHMsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbiwgVHJhbnNsYXRvckZpbHRlciB0cmFuc2xhdG9yRmlsdGVyKSB7Ci0KLQkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwotCi0JCWludCBpbmRleCA9IHN0YXJ0SGludDsKLQkJVHJhbnNsYXRvciBjaGlsZHJlbltdID0gbnVsbDsKLQotCQlzd2l0Y2ggKGhpbnRzW01PREVfSElOVF9JTkRYXSkgewotCQkJY2FzZSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQljaGlsZHJlbiA9IHRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBzdGFydEhpbnQgPCBjaGlsZHJlbi5sZW5ndGgpIHsKLQotCQkJCQkvKiBMb29rIGZvciB0aGUgbmV4dCBBdHRyaWJ1dGUgVHJhbnNsYXRvciAqLwotCQkJCQlpbmRleCA9IHRyYW5zbGF0b3JGaWx0ZXIuc2Nhbk5leHRUcmFuc2xhdG9yKGNoaWxkcmVuLCBpbmRleCk7Ci0KLQkJCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBmb3VuZCwgKDEpIHVwZGF0ZSB0aGUgcmVzdWx0LCAoMikgdXBkYXRlIHRoZSBpbmRleCBzbyB3ZSBjYW4gc2tpcAotCQkJCQkJICogYWhlYWQgb24gdGhlIG5leHQgaW52b2NhdGlvbiAoMykgZXNjYXBlIHRoZSBWQVJJQUJMRV9UUkFOU0xBVE9SUwotCQkJCQkJICogcHJvY2Vzc2luZwotCQkJCQkJICovCi0JCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltpbmRleF07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBETyBOT1QgQlJFQUsgd2Ugd2lsbCBkZWZhdWx0IHRvIFZBUklBQkxFIFRSQU5TTEFUT1JTIE1PREUgc28gd2UgbXVzdCByZXNldAotCQkJCQkgKiB0aGUgc3RhcnRIaW50IGFwcHJvcHJpYXRlbHkKLQkJCQkJICovCi0JCQkJCXN0YXJ0SGludCA9IC0xOwotCQkJCX0KLQotCQkJY2FzZSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFIDoKLQkJCQloaW50c1tNT0RFX0hJTlRfSU5EWF0gPSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFOwotCQkJCS8qCi0JCQkJICogUmVzZXQgdGhlIGluZGV4LgotCQkJCSAqLwotCQkJCWluZGV4ID0gc3RhcnRIaW50OwotCQkJCWNoaWxkcmVuID0gdHJhbnNsYXRvci5nZXRWYXJpYWJsZUNoaWxkcmVuKHRhcmdldCwgdmVyc2lvbik7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBzdGFydEhpbnQgPCBjaGlsZHJlbi5sZW5ndGgpIHsKLQkJCQkJaW5kZXggPSB0cmFuc2xhdG9yRmlsdGVyLnNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgaW5kZXgpOwotCQkJCQlyZXN1bHQgPSAoaW5kZXggPj0gMCkgPyBjaGlsZHJlbltpbmRleF0gOiBudWxsOwotCQkJCX0KLQkJfQotCi0JCWhpbnRzW05FWFRfU1RBUlRfSElOVF9JTkRYXSA9IChyZXN1bHQgPT0gbnVsbCAmJiBjaGlsZHJlbiAhPSBudWxsKSA/IGNoaWxkcmVuLmxlbmd0aCA6IGluZGV4OwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vZGUoKSB7Ci0JCXJldHVybiBtb2RlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JQYXRoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4NDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0KLXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yUGF0aCB7Ci0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBtYXBJbmZvUGF0aDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIGFuIGFycmF5IG9mIFRyYW5zbGF0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIHBhdGggdG8gZm9sbG93IGZyb20gYW4gb2JqZWN0IHRvCi0JICogYW5vdGhlciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclBhdGgoVHJhbnNsYXRvcltdIHBhdGgpIHsKLQkJbWFwSW5mb1BhdGggPSBwYXRoOwotCX0KLQotCXB1YmxpYyBMaXN0IGZpbmRPYmplY3RzKEVPYmplY3Qgc3RhcnRPYmplY3QpIHsKLQkJT2JqZWN0IGN1ciA9IHN0YXJ0T2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcEluZm9QYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlUcmFuc2xhdG9yIGN1ck1hcCA9IG1hcEluZm9QYXRoW2ldOwotCQkJaWYgKGN1ciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgY3VyQXR0ciA9IGN1ck1hcC5nZXRGZWF0dXJlKCk7Ci0JCQkJaWYgKGN1ckF0dHIgPT0gVHJhbnNsYXRvci5DT05UQUlORVJfRkVBVFVSRSkgewotCQkJCQljdXJBdHRyID0gKChFT2JqZWN0KSBjdXIpLmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCQkJY3VyID0gKChFT2JqZWN0KSBjdXIpLmVDb250YWluZXIoKTsKLQkJCQl9IGVsc2UgaWYgKGN1ckF0dHIgPT0gVHJhbnNsYXRvci5ST09UX0ZFQVRVUkUpIHsKLQkJCQkJY3VyID0gKChUcmFuc2xhdG9yUmVzb3VyY2UpIHN0YXJ0T2JqZWN0LmVSZXNvdXJjZSgpKS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VyID0gKChFT2JqZWN0KSBjdXIpLmVHZXQoY3VyQXR0cik7Ci0JCQkJfQotCQkJCWlmIChjdXJNYXAuaXNNdWx0aVZhbHVlZCgpKSB7Ci0JCQkJCXJldHVybiAoTGlzdCkgY3VyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGZpbmRPYmplY3QoRU9iamVjdCBzdGFydE9iamVjdCwgT2JqZWN0IG1hdGNoVmFsdWUpIHsKLQkJTGlzdCBvYmplY3RzID0gZmluZE9iamVjdHMoc3RhcnRPYmplY3QpOwotCQlpZiAob2JqZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmaW5kT2JqZWN0KG9iamVjdHMsIGdldExhc3RNYXAoKSwgbWF0Y2hWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZmluZE9iamVjdChMaXN0IG9iamVjdExpc3QsIFRyYW5zbGF0b3IgbWFwLCBPYmplY3QgbWF0Y2hWYWx1ZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBtb2ZPYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgY3VyTWF0Y2hWYWx1ZSA9IG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpOwotCQkJaWYgKG1hdGNoVmFsdWUuZXF1YWxzKGN1ck1hdGNoVmFsdWUpKQotCQkJCXJldHVybiBtb2ZPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0TGFzdE1hcCgpIHsKLQkJcmV0dXJuIG1hcEluZm9QYXRoW21hcEluZm9QYXRoLmxlbmd0aCAtIDFdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgY24gPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOwotCQljbiA9IGNuLnN1YnN0cmluZygrK2ksIGNuLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKGNuKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXNiLmFwcGVuZChtYXBJbmZvUGF0aFswXSk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgbWFwSW5mb1BhdGgubGVuZ3RoOyBqKyspIHsKLQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJCXNiLmFwcGVuZChtYXBJbmZvUGF0aFtqXSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzljNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNsYXRvclJlc291cmNlIGV4dGVuZHMgUmVmZXJlbmNlZFJlc291cmNlIHsKLQkvKgotCSAqIG11c3QgbWFrZSBhIHN1YmNsYXNzIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGZvciBFU3RydWN0dXJhbEZlYXR1cmUgaXMgcHJvdGVjdGVkCi0JICovCi0Jc3RhdGljIGNsYXNzIERvY1R5cGVGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7Ci0JCXByb3RlY3RlZCBEb2NUeXBlRmVhdHVyZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBET0NfVFlQRV9GRUFUVVJFID0gbmV3IERvY1R5cGVGZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBUaGUgcHVibGljIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQsIGlmIHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGljSWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCi0JICovCi0JRU9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBUaGUgc3lzdGVtIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQsIGlmIHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0U3lzdGVtSWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHB1YmxpYyBpZCBhbmQgc3lzdGVtIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0Jdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgcHVibGljL3N5c3RlbSBpZHMgaWYgbmVjZXNzYXJ5Ci0JICovCi0Jdm9pZCBzZXREZWZhdWx0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgaW4gdGhlIGRvY3VtZW50IHR5cGUgaGVhZGVyIG9mIHRoZSBzZXJpYWxpemVkIHhtbCBmaWxlCi0JICovCi0JU3RyaW5nIGdldERvY3R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFhNTCB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlTdHJpbmcgZ2V0WE1MVmVyc2lvbigpOwotCi0JVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpOwotCi0JLyoqCi0JICogRW50aXR5IHJlc29sdmVyIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiB1c2luZyBzdGFuZGFyZCBwYXJzZXJzIHRvIHJlYWQgdGhlIHJlc291cmNlCi0JICovCi0JRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKTsKLQotCWJvb2xlYW4gdXNlc0RURCgpOwotCi0JcHVibGljIGludCBnZXRWZXJzaW9uSUQoKTsKLQotCXZvaWQgc2V0VmVyc2lvbklEKGludCBpKTsKLQotCVJlbmRlcmVyIGdldFJlbmRlcmVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGE0NTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwgaW1wbGVtZW50cyBSZW5kZXJlckZhY3RvcnkuTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFJlbmRlcmVyRmFjdG9yeSByZW5kZXJlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJc3VwZXIoKTsKLQkJcmVuZGVyZXJGYWN0b3J5ID0gYVJlbmRlcmVyRmFjdG9yeTsKLQkJc2V0TGlzdGVuaW5nRm9yVXBkYXRlcyhsaXN0ZW5pbmdGb3JVcGRhdGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQl0aGlzKGFSZW5kZXJlckZhY3RvcnksIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmluZ0ZvclVwZGF0ZXMoYm9vbGVhbiBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQotCQlpZiAodGhpcy5saXN0ZW5pbmdGb3JVcGRhdGVzIF4gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0JCQlpZiAoIXNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykKLQkJCQlSZW5kZXJlckZhY3RvcnkuTm90aWZpY2F0aW9uRW5naW5lLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJZWxzZQotCQkJCVJlbmRlcmVyRmFjdG9yeS5Ob3RpZmljYXRpb25FbmdpbmUuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCXRoaXMubGlzdGVuaW5nRm9yVXBkYXRlcyA9IHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlczsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuaW5nRm9yVXBkYXRlcygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuaW5nRm9yVXBkYXRlczsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlbmRlcmVyIGFSZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcigpOwotCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBhUmVuZGVyZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkuTGlzdGVuZXIjdXBkYXRlUmVuZGVyZXJGYWN0b3J5KGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlbmRlcmVyRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgbmV3UmVuZGVyZXJGYWN0b3J5KSB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGluZyByZW5kZXJlciBmYWN0b3J5Iik7Ci0JCXJlbmRlcmVyRmFjdG9yeSA9IG5ld1JlbmRlcmVyRmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjUyNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgVHJhbnNsYXRvclJlc291cmNlLCBJUm9vdE9iamVjdFJlc291cmNlewotCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIElEX0ZFQVRVUkUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FSURBdHRyaWJ1dGUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9ICIxLjAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFJlbmRlcmVyIHJlbmRlcmVyOwotCS8qKgotCSAqIFRoZSBwdWJsaWMgSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCS8qKgotCSAqIFRoZSBzeXN0ZW0gSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkOwotCXByb3RlY3RlZCBTdHJpbmcgeG1sVmVyc2lvbjsKLQkvLyBEZWZhdWx0IHRoZSByZXNvdXJjZXMgdG8gSjJFRSAxLjQKLQlwcm90ZWN0ZWQgaW50IHZlcnNpb25JRDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKLQkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJc3VwZXIodXJpKTsKLQkJc2V0UmVuZGVyZXIoYVJlbmRlcmVyKTsKLQkJdmVyc2lvbklEID0gZ2V0RGVmYXVsdFZlcnNpb25JRCgpOwotCX0KLQotCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcigpOwotCQlzZXRSZW5kZXJlcihhUmVuZGVyZXIpOwotCX0KLQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlpZiAoc3VwZXIuZ2V0RW5jb2RpbmcoKSA9PSBudWxsKQotCQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmNvZGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9ICEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIGFQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIGFTeXN0ZW1JZCkpOwotCQlwdWJsaWNJZCA9IGFQdWJsaWNJZDsKLQkJc3lzdGVtSWQgPSBhU3lzdGVtSWQ7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQllTm90aWZ5KG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIG51bGwsIG51bGwpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKSB7Ci0JCQkJCXJldHVybiBET0NfVFlQRV9GRUFUVVJFOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7Ci0JCQkJCXJldHVybiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsLnRoaXM7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB4bWxWZXJzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYTUxWZXJzaW9uKCkgewotCQlpZiAoeG1sVmVyc2lvbiA9PSBudWxsKQotCQkJeG1sVmVyc2lvbiA9IERFRkFVTFRfVkVSU0lPTjsKLQkJcmV0dXJuIHhtbFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgeG1sVmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0geG1sVmVyc2lvbgotCSAqICAgICAgICAgICAgVGhlIHhtbFZlcnNpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgewotCQl0aGlzLnhtbFZlcnNpb24gPSB4bWxWZXJzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOwotCQl0cnkgewotCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQotCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKLQkJCXJlbmRlcmVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaXNUcmFja2luZ01vZHMpCi0JCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCX0KLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVjb3JkVGltZSgiTG9hZCIsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgewotICAgICAgICAgICAgc3VwZXIuc2F2ZShvcHRpb25zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUFib3V0VG9TYXZlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvU2F2ZSgoT3V0cHV0U3RyZWFtKW51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIG5vdGlmeVNhdmVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5U2F2ZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsI2RvU2F2ZShPdXRwdXRTdHJlYW0sCi0JICogICAgICBNYXApCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJlbmRlcmVyLmRvU2F2ZShvdXRwdXRTdHJlYW0sIG9wdGlvbnMpOwotCQlzZXRNb2RpZmllZChmYWxzZSk7Ci0JCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIHJlY29yZFRpbWUoIlNhdmUiLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgcmVjb3JkVGltZShTdHJpbmcgdHlwZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXHQiICsgdHlwZSArICJcdCIgKwotCS8vIChlbmQgLSBzdGFydCkgKwotCS8vICJcdFx0XHRtcyIgKyAiXHQiICsgKCggdGhpcy5nZXRWZXJzaW9uSUQoKSkgLyAxMC4wKSArICJcdCIgKyB0aGlzKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCS8vIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1VubG9hZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCXJlbmRlcmVyLnByZVVubG9hZCgpOwotCQlzdXBlci5kb1VubG9hZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVuZGVyZXIuCi0JICogCi0JICogQHJldHVybiBSZW5kZXJlcgotCSAqLwotCXB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcigpIHsKLQkJcmV0dXJuIHJlbmRlcmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbmRlcmVyLgotCSAqIAotCSAqIEBwYXJhbSByZW5kZXJlcgotCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKLQkJaWYgKHJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gdGhpcykKLQkJCXJlbmRlcmVyLnNldFJlc291cmNlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciBjb21wYXRpYmlsaXR5IG9mIG9sZCBzdWJ0eXBlIHJlc291cmNlcywgcmV0dXJucyB0aGUgc3VwZXIKLQkgKiBpbXBsZW1lbnRhdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJpbUdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCXdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplQ29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewotCQljb250ZW50cyA9IG5ldyBSZXNvdXJjZUltcGwuQ29udGVudHNFTGlzdCgpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmVuZGVyZXIucHJlcGFyZVRvQWRkQ29udGVudHMoKTsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCQlyZW5kZXJlci5wcmVwYXJlVG9BZGRDb250ZW50cygpOwotCQkJCXJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCWlmIChzeXN0ZW1JZCAhPSBudWxsICYmIHB1YmxpY0lkICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBwdWJJZCA9IHB1YmxpY0lkID09IG51bGwgPyBnZXREZWZhdWx0UHVibGljSWQoKSA6IHB1YmxpY0lkOwotCQlTdHJpbmcgc3lzSWQgPSBzeXN0ZW1JZCA9PSBudWxsID8gZ2V0RGVmYXVsdFN5c3RlbUlkKCkgOiBzeXN0ZW1JZDsKLQkJc2V0RG9jdHlwZVZhbHVlcyhwdWJJZCwgc3lzSWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldEVuY29kaW5nKERFRkFVTFRfRU5DT0RJTkcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbnVsbCBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjY3JlYXRlRW50aXR5UmVzb2x2ZXIoKQotCSAqLwotCXB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0UHVibGljSWQoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKLQkJcmV0dXJuIHZlcnNpb25JRDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JRChpbnQgaSkgewotCQl2ZXJzaW9uSUQgPSBpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjdXNlc0RURCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXNlc0RURCgpIHsKLQkJcmV0dXJuIGdldFB1YmxpY0lkKCkgIT0gbnVsbCAmJiBnZXRTeXN0ZW1JZCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBub3RpZnkgd2hlbiB0aGUgSUQgZ2V0cyBzZXQ7IG5lZWQgdGhpcyB0byBwdXNoIGl0IGludG8KLQkgKiB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2Ujc2V0SUQoRU9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIGlkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGdldElEKGVPYmplY3QpOwotCQlzdXBlci5zZXRJRChlT2JqZWN0LCBpZCk7Ci0JCWVPYmplY3QuZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgZU9iamVjdCwgTm90aWZpY2F0aW9uLlNFVCwgSURfRkVBVFVSRSwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBleHRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIHJlc291cmNlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGxvYWRlZCBvciBzYXZlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmllZCgpIHx8IHJlbmRlcmVyLmlzTW9kaWZpZWQoKTsKLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRlbiB0byBnaXZlIHRoZSByZW5kZXJlciBhIGhvb2sKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JXcml0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCXJlbmRlcmVyLmFjY2Vzc0ZvcldyaXRlKCk7Ci0JCXN1cGVyLmFjY2Vzc0ZvcldyaXRlKCk7Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZW4gdG8gZ2l2ZSB0aGUgcmVuZGVyZXIgYSBob29rCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yUmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJcmVuZGVyZXIuYWNjZXNzRm9yUmVhZCgpOwotCQlzdXBlci5hY2Nlc3NGb3JSZWFkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlyZW5kZXJlci5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJcmVuZGVyZXIucmVsZWFzZUZyb21Xcml0ZSgpOwotCQlzdXBlci5yZWxlYXNlRnJvbVdyaXRlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwjcHJlRGVsZXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JCXN1cGVyLnByZURlbGV0ZSgpOwotCQlyZW5kZXJlci5wcmVEZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2hhcmVkKCkgfHwgcmVuZGVyZXIuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlyZXR1cm4gc3VwZXIuaXNTaGFyZWRGb3JXcml0ZSgpIHx8IHJlbmRlcmVyLmlzU2hhcmVkRm9yV3JpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChpc0xvYWRlZCkKLQkJCQlyZXR1cm47Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIKLQkJCS8vIFRyYW5zbGF0b3JSZXNvdXJjZS5sb2FkKCk6ICIgKyB0aGlzKTsKLQkJCWlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgewotCQkJCXN1cGVyLmxvYWQob3B0aW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICghaXNMb2FkZWQpIHsKLQkJCQlsb2FkKChJbnB1dFN0cmVhbSkgbnVsbCwgb3B0aW9ucyk7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Vuc3VwcG9ydGVkRmVhdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzU4NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxMywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUF0dHJpYnV0ZUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBjYnJpZGdoYQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkRmVhdHVyZSBleHRlbmRzIEVBdHRyaWJ1dGVJbXBsIHsKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gY2FwdHVyZSBmZWF0dXJlcyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5zdXBwb3J0ZWQoRUNsYXNzIGFuRUNsYXNzLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQotCQlpZiAoZmVhdHVyZU5hbWUuZXF1YWxzKCJpc1plcm9QYXJhbXMiKSAmJiBhbkVDbGFzcy5nZXROYW1lKCkuZXF1YWxzKCJNZXRob2RFbGVtZW50IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVW5zdXBwb3J0ZWRGZWF0dXJlKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRlZWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSB7Ci0JLyoqIFJldHVybnMgd2hldGhlciBhIFRyYW5zbGF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBET00gbmFtZSAqLwotCWJvb2xlYW4gYWNjZXB0cyhTdHJpbmcgZG9tTmFtZSk7Ci0KLQkvKiogUmV0dXJucyB3aGV0aGVyIGEgVHJhbnNsYXRvciBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGZlYXR1cmUgKi8KLQlib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKTsKLQotCVRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZik7Ci0KLQkvKiogQ3JlYXRlcyBhIG5ldyBUcmFuc2xhdG9yIGZvciB0aGUgRE9NIG5hbWUgKi8KLQlUcmFuc2xhdG9yIGNyZWF0ZShTdHJpbmcgZG9tTmFtZSk7Ci0KLQkvKiogQ3JlYXRlcyB2YXJpYWJsZSB0cmFuc2xhdG9ycyBmb3IgYW4gRU1GIG9iamVjdCB0byBiZSByZW5kZXJlZCAqLwotCUxpc3QgY3JlYXRlKE5vdGlmaWVyIHRhcmdldCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2I3ZjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAyMCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTEVuY29kZXJEZWNvZGVyIHsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgWE1MRW5jb2RlckRlY29kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSWRlbnRpZmllcyB0aGUgbGFzdCBwcmludGFibGUgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIHJhbmdlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZQotCSAqIGVuY29kaW5nIHVzZWQgd2l0aCB0aGlzIHNlcmlhbGl6ZXIuIEZvciA4LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIGVpdGhlciAweDdFIG9yIDB4RkYuIEZvcgotCSAqIDE2LWJpdCBlbmNvZGluZ3MgdGhpcyB3aWxsIGJlIDB4RkZGRi4gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcHJpbnRhYmxlIHdpbGwgYmUgZXNjYXBlZCB1c2luZwotCSAqIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgaW50IF9sYXN0UHJpbnRhYmxlID0gMHhGRkZFOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxFbmNvZGVyRGVjb2RlciBfc2luZ2xldG9uOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gTk9UX0lNUExFTUVOVEVECi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGVuY29kZShjaGFyW10gdmFsdWUpIHsKLQkJYm9vbGVhbiB1bm1vZGlmaWVkID0gdHJ1ZTsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkgewotCQkJY2ggPSB2YWx1ZVtpXTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJCXVubW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoKGNoID49ICcgJyAmJiBjaCA8PSBfbGFzdFByaW50YWJsZSAmJiBjaCAhPSAweEY3KSB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykgewotCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyCi0JCQkJLy8gcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZQotCQkJCS8vIHRocmVzaG9sZC4KLQkJCQlzYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7Ci0JCQkJc2J1Zi5hcHBlbmQoJzsnKTsKLQkJCQl1bm1vZGlmaWVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVubW9kaWZpZWQpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzYnVmLmxlbmd0aCgpXTsKLQkJc2J1Zi5nZXRDaGFycygwLCBzYnVmLmxlbmd0aCgpLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBzdHJpbmcgc28gaXQgbWF5IGJlIHByaW50ZWQgYXMgdGV4dCBjb250ZW50IG9yIGF0dHJpYnV0ZSB2YWx1ZS4gTm9uIHByaW50YWJsZQotCSAqIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgdXNpbmcgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFdoZXJlIHRoZSBmb3JtYXQgc3BlY2lmaWVzIGEgZGVhdWx0IGVudGl0eQotCSAqIHJlZmVyZW5jZSwgdGhhdCByZWZlcmVuY2UgaXMgdXNlZCAoZS5nLiA8dHQ+JmFtcDtsdDs8L3R0PikuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyB0byBlc2NhcGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOwotCQljaGFyIGNoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKLQkJCWNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCi0JCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5Ci0JCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCi0JCQkvLyBYTUwgYW5kIEhUTUwuCi0JCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKLQkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKLQkJCQlzYnVmLmFwcGVuZCgnJicpOwotCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9IGVsc2UgaWYgKChjaCA+PSAnICcgJiYgY2ggPD0gX2xhc3RQcmludGFibGUgJiYgY2ggIT0gMHhGNykgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcdCcpIHsKLQkJCQkvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBwcmludGFibGUsIHByaW50IGFzIGNoYXJhY3RlcgotCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkvLyBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IgbGluZQotCQkJCS8vIHRlcm1pbmF0b3IsIEFTQ0lJIGRlbGV0ZSwgb3IgYWJvdmUgYSBjZXJ0YWluIFVuaWNvZGUKLQkJCQkvLyB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgWE1MRW5jb2RlckRlY29kZXIoKTsKLQkJfQotCQlyZXR1cm4gX3NpbmdsZXRvbi5lbmNvZGUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMgY2hhcmFjdGVyIHZhbHVlLCBvciBudWxsIGlmIG5vIHN1Y2ggZW50aXR5Ci0JICogZXhpc3RzLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggPHR0PicmYW1wOyc8L3R0PiB3aWxsIHJldHVybiA8dHQ+IiZhbXA7YW1wOyI8L3R0Pi4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIENoYXJhY3RlciB2YWx1ZQotCSAqIEByZXR1cm4gQ2hhcmFjdGVyIGVudGl0eSBuYW1lLCBvciBudWxsCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlSZWYoY2hhciBjaCkgewotCQkvLyBFbmNvZGUgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlcgotCQkvLyByZWZlcmVuY2VzLgotCQkvLyBUaGVzZSBmaXZlIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGFsbCBYTUwgZG9jdW1lbnRzLgotCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuICJsdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnPicgOgotCQkJCXJldHVybiAiZ3QiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gInF1b3QiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJ1wnJyA6Ci0JCQkJcmV0dXJuICJhcG9zIjsvLyROT04tTkxTLTEkCi0JCQljYXNlICcmJyA6Ci0JCQkJcmV0dXJuICJhbXAiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTU1OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciB7Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQ5MTczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlVdGlsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBZGFwdGVyRmFjdG9yeVV0aWwuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5VXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRhcHROZXcoTm90aWZpZXIgbmV3T2JqZWN0LCBMaXN0IGZhY3RvcmllcykgewotCQlBZGFwdGVyRmFjdG9yeSBmYWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY3Rvcmllcy5zaXplKCk7IGkrKykgewotCQkJZmFjdCA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCWZhY3QuYWRhcHROZXcobmV3T2JqZWN0LCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVBZGFwdGVyRmFjdG9yaWVzKExpc3QgZGVzY3JpcHRvcnMsIExpc3QgZmFjdG9yaWVzKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKLQkJCWFkYXB0ZXJGYWN0ID0gZGVzYy5jcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0ICE9IG51bGwpCi0JCQkJZmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdCk7Ci0JCX0KLQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3Yjg4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXJyYXlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLXB1YmxpYyBjbGFzcyBBcnJheVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCWlmIChhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkgPT0gYXJyYXkyLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKQotCQkJY29tcG9uZW50VHlwZSA9IGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJZWxzZQotCQkJY29tcG9uZW50VHlwZSA9IE9iamVjdC5jbGFzczsKLQotCQlyZXR1cm4gY29uY2F0KGFycmF5MSwgYXJyYXkyLCBjb21wb25lbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MiwgQ2xhc3MgY29tcG9uZW50VHlwZSkgewotCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIGFycmF5MS5sZW5ndGggKyBhcnJheTIubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0QWxsKGphdmEudXRpbC5MaXN0IGFycmF5cywgQ2xhc3MgY29tcG9uZW50VHlwZSkgewotCQlpbnQgcmVzdWx0TGVuZ3RoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdExlbmd0aCArPSAoKE9iamVjdFtdKSBhcnJheXMuZ2V0KGkpKS5sZW5ndGg7Ci0JCX0KLQkJT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCByZXN1bHRMZW5ndGgpOwotCQlpbnQgcG9zID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKSBhcnJheXMuZ2V0KGkpOwotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBwb3MsIGFycmF5Lmxlbmd0aCk7Ci0JCQlwb3MgKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0NDc1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluIGNvZGUuIFRoZSBwcmVkaWNhdGUKLSAqIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QKLSAqIGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbiBzb21ldGhpbmcgaXMKLSAqIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQgYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQKLSAqIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi0vLyBUaGlzIGNsYXNzIHdhcywgb3JpZ2luYWxseSwgY29waWVkIGRpcmVjdGx5IGZyb20gY29tLmlibS5pdHAuY29tbW9uLgotLy8gSXQgd2FzIGNvcGllZCB0byBvdXIgb3duIHBhY2thZ2UganVzdCB0byBtaW5pbWl6ZSBtaW5vciBkZXBlbmRlbmNpZXMKLS8vIG9uIG90aGVyIHBhY2thZ2VzIGFuZCBpbnRlcm5hbCBBUElzLgotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCi0JcHJpdmF0ZSBBc3NlcnQoKSB7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuCi0JICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbgotCSAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0Ci0JICogZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZAotCSAqIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlzTm90TnVsbChvYmplY3QsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kCi0JICogb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigibnVsbF9hcmd1bWVudDogIiArIG1lc3NhZ2UpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZgotCSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzVHJ1ZShleHByZXNzaW9uLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZgotCSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiYXNzZXJ0aW9uIGZhaWxlZDogIiArIG1lc3NhZ2UpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGM2MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZQotICogZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUKLSAqIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICogPC9wPgotICovCi0vLyBUaGlzIGNsYXNzIHdhcywgb3JpZ2luYWxseSwgY29waWVkIGRpcmVjdGx5IGZyb20gY29tLmlibS5pdHAuY29tbW9uLgotLy8gSXQgd2FzIGNvcGllZCB0byBvdXIgb3duIHBhY2thZ2UganVzdCB0byBtaW5pbWl6ZSBtaW5vciBkZXBlbmRlbmNpZXMKLS8vIG9uIG90aGVyIHBhY2thZ2VzIGFuZCBpbnRlcm5hbCBBUElzLgotY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JICovCi0JcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQlzdXBlcihkZXRhaWwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVkMGMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjE1IFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbiB7Ci0JcHJvdGVjdGVkIE9iamVjdCBrZXk7Ci0JcHJvdGVjdGVkIE9iamVjdCB2YWx1ZTsKLQotCS8qKgotCSAqIEFzc29jaWF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9iamVjdCBhS2V5LCBPYmplY3QgYVZhbHVlKSB7Ci0JCXNldEtleShhS2V5KTsKLQkJc2V0VmFsdWUoYVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3S2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KGphdmEubGFuZy5PYmplY3QgbmV3S2V5KSB7Ci0JCWtleSA9IG5ld0tleTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6NDggUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgewotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Nsb25lYWJsZVB1YmxpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzM5ZmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9DbG9uZWFibGVQdWJsaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMjIsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdGhhdCBleHBvc2VzIHRoZSBjbG9uZSBtZXRob2QsIGZvciBvYmplY3RzIHRoYXQgbmVlZCB0byBnZW5lcmljYWxseSBjb3B5IG90aGVyCi0gKiBjbG9uZWFibGUgb2JqZWN0cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsb25lYWJsZVB1YmxpYyBleHRlbmRzIENsb25lYWJsZSwgQWRhcHRlci5JbnRlcm5hbCB7Ci0JT2JqZWN0IGNsb25lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db21tYW5kQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2I4ODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvbW1hbmRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgSm9obiBNb3VycmEKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRDb250ZXh0IGltcGxlbWVudHMgSUNvbW1hbmRDb250ZXh0IHsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0JcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzKG1vbml0b3IsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzCi0JICogQHBhcmFtIHJlc291cmNlU2V0Ci0JICovCi0JcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLnByb3BlcnRpZXMgPSBjb25maWd1cmF0aW9uUHJvcGVydGllczsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldFJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKQotCQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzkyOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0NvcHlHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29weSBhIGdyb3VwIG9mIFJlZk9iamVjdHMgYW5kL29yIFJlc291cmNlcy4gVGhpcyBncm91cCB3aWxsIGVuc3VyZSB0aGF0Ci0gKiBhbGwgbm9uLWNvbXBvc2l0ZSByZWxhdGlvbnNoaXBzIGFyZSBkZWZlcnJlZCB1bnRpbCBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIGFyZSBjb3BpZWQuIFRoaXMKLSAqIGFsbG93cyB5b3UgdG8gbWFrZSBjb3BpZXMgb2YgYSBncm91cCBvZiBvYmplY3RzIHRoYXQgbWF5IGhhdmUgbm9uLWNvbXBvc2l0ZSByZWxhdGlvbnNoaXBzIGFuZAotICogZW5zdXJlIHRoYXQgdGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgcG9pbnRpbmcgdG8gdGhlIGNvcGllZCBvYmplY3QgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ3JvdXAKLSAqIChlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCBhIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcCkuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjE6MTcgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvcHlHcm91cCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0SWRTdWZmaXg7Ci0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGNvcHlDb250ZXh0OwotCXByb3RlY3RlZCBMaXN0IHJlc291cmNlczsKLQlwcm90ZWN0ZWQgTGlzdCByZWZPYmplY3RzOwotCXByb3RlY3RlZCBMaXN0IGNvcGllZFJlc291cmNlczsKLQlwcm90ZWN0ZWQgTGlzdCBjb3BpZWRSZWZPYmplY3RzOwotCXByb3RlY3RlZCBib29sZWFuIHByZXNlcnZlSWRzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb3B5R3JvdXAgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29weUdyb3VwKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBhZGQoYVJlZk9iamVjdCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsICYmICFjb250YWluc1JlZk9iamVjdChhUmVmT2JqZWN0KSkgewotCQkJZ2V0UmVmT2JqZWN0cygpLmFkZChjcmVhdGVBc3NvY2lhdGlvbihhUmVmT2JqZWN0LCBpZFN1ZmZpeCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlhZGQoYVJlc291cmNlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKGNyZWF0ZUFzc29jaWF0aW9uKGFSZXNvdXJjZSwgbmV3VXJpKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVmT2JqZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcGllZChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCkKLQkJCWdldENvcGllZFJlZk9iamVjdHMoKS5hZGQoYVJlZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb3BpZWQoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZ2V0Q29waWVkUmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCQlpZiAoZ2V0Q29weUNvbnRleHQoKSAhPSBudWxsKQotCQkJCWdldENvcHlDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWlucyhMaXN0IGFzc29jaWF0aW9ucywgT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCWlmIChhbk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgc2l6ZSA9IGFzc29jaWF0aW9ucy5zaXplKCk7Ci0JCUFzc29jaWF0aW9uIGFzc29jOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJYXNzb2MgPSAoQXNzb2NpYXRpb24pIGFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQlpZiAoYXNzb2MuZ2V0S2V5KCkgPT0gYW5PYmplY3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmCi0JICogCi0JICogQGFSZWZPYmplY3QgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBncm91cC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlZk9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGdldFJlZk9iamVjdHMoKSwgYVJlZk9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYKLQkgKiAKLQkgKiBAYVJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgZ3JvdXAuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGdldFJlc291cmNlcygpLCBhUmVzb3VyY2UpOwotCX0KLQotCXByaXZhdGUgQXNzb2NpYXRpb24gY3JlYXRlQXNzb2NpYXRpb24oT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgQXNzb2NpYXRpb24oa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgUmVmT2JqZWN0cyB0aGF0IHdlcmUgY29waWVkLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29waWVkUmVmT2JqZWN0cygpIHsKLQkJaWYgKGNvcGllZFJlZk9iamVjdHMgPT0gbnVsbCkKLQkJCWNvcGllZFJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjb3BpZWRSZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIFJlc291cmNlcyB0aGF0IHdlcmUgY29waWVkLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q29waWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29waWVkUmVzb3VyY2VzID09IG51bGwpCi0JCQljb3BpZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjb3BpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnRleHQgdG8gYWRkIGFsbCBjb3BpZWQgcmVzb3VyY2VzIGludG8uIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDg6MDk6NDUgUE0pCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0IGdldENvcHlDb250ZXh0KCkgewotCQlyZXR1cm4gY29weUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjQ0OjQzIFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRJZFN1ZmZpeCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRJZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPyBEZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlSWRzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJZHM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVmT2JqZWN0cygpIHsKLQkJaWYgKHJlZk9iamVjdHMgPT0gbnVsbCkKLQkJCXJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZWZPYmplY3RzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IHByaW1HZXRSZWZPYmplY3RzKCkgewotCQlyZXR1cm4gcmVmT2JqZWN0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBwcmltR2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZk9iamVjdAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCWlmIChhUmVmT2JqZWN0ICE9IG51bGwgJiYgcHJpbUdldFJlZk9iamVjdHMoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdCA9IHByaW1HZXRSZWZPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFzc29jaWF0aW9uLmdldEtleSgpID09IGFSZWZPYmplY3QpCi0JCQkJCXJldHVybiBwcmltR2V0UmVmT2JqZWN0cygpLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gYVJlc291cmNlcwotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgcHJpbUdldFJlc291cmNlcygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRLZXkoKSA9PSBhUmVzb3VyY2UpCi0JCQkJCXJldHVybiBwcmltR2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFzc29jaWF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjb250ZXh0IHRvIGFkZCBhbGwgY29waWVkIHJlc291cmNlcyBpbnRvLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA4OjA5OjQ1IFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdDb3B5Q29udGV4dAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLkNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5Q29udGV4dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgbmV3Q29weUNvbnRleHQpIHsKLQkJY29weUNvbnRleHQgPSBuZXdDb3B5Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhbiBJRCBzdWZmaXggaXMgbm90IGRlZmluZWQgZm9yIGEgRU9iamVjdCB0aGF0IGlzIHRvIGJlIGNvcGllZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQuCi0JICogQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMTo0NDo0MyBQTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RGVmYXVsdElkU3VmZml4Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdElkU3VmZml4KGphdmEubGFuZy5TdHJpbmcgbmV3RGVmYXVsdElkU3VmZml4KSB7Ci0JCWRlZmF1bHRJZFN1ZmZpeCA9IG5ld0RlZmF1bHRJZFN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlSWRzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlc2VydmVJZHMgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHJlcXVpcmUgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGFmdGVyIHRoZSBncm91cAotCSAqIGhhcyBiZWVuIGNvcGllZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29weVV0aWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0Q29weShFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbCkgewotCX0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NTG9hZE9wdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFlOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRE9NTG9hZE9wdGlvbnMgewotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlOwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93SmF2YUVuY29kaW5nczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbG93SmF2YUVuY29kaW5ncygpIHsKLQkJcmV0dXJuIGFsbG93SmF2YUVuY29kaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZEVudGl0eVJlZmVyZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRlKCkgewotCQlyZXR1cm4gdmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWxsb3dKYXZhRW5jb2RpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0phdmFFbmNvZGluZ3MKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd0phdmFFbmNvZGluZ3MgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dKYXZhRW5jb2RpbmdzKGJvb2xlYW4gYWxsb3dKYXZhRW5jb2RpbmdzKSB7Ci0JCXRoaXMuYWxsb3dKYXZhRW5jb2RpbmdzID0gYWxsb3dKYXZhRW5jb2RpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzCi0JICogICAgICAgICAgICBUaGUgZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyA9IGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWxpZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsaWRhdGUKLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIHZhbGlkYXRlKSB7Ci0JCXRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Zjk2NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGRvbSBtYW5pcHVsYXRpb24gYW5kIHNlYXJjaCBmdW5jdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBET01VdGlsaXRpZXMgewotCS8vIEhhbmR5IENvbnN0YW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVF9TVFJJTkcgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORV9TVFJJTkcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkvL0hhY2sgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBET00gYXBpcyBjaGFuZ2Ugc3VjaCB0aGF0IHRoZXJlIGlzIGFuIGVhc2llcgotCS8vd2F5IHRvIGZsdWZmIHVwIGFuZCBzZXQgdGhlIGRvY3R5cGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfRU5USVRZX1NUUklORyA9ICJkdW1teSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfRU5USVRZX05PREVfU1RSSU5HID0gIjxkdW1teS8+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBkZWZhdWx0RG9jdW1lbnRCdWlsZGVyOwotCXByaXZhdGUgc3RhdGljIEVudGl0eVJlc29sdmVyIGRlZmF1bHRFbnRpdHlSZXNvbHZlcjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBzdWIgbm9kZXMgb2YgYSBwYXRoLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSXRlcmF0b3IgY3JlYXRlUGF0aEl0ZXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyB0UGF0aCA9IHBhdGguc3RhcnRzV2l0aCgiLyIpID8gcGF0aC5zdWJzdHJpbmcoMSkgOiBwYXRoOyAvLyROT04tTkxTLTEkCi0JCWlmICh0UGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJdFBhdGggPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgYVBhdGggPSB0UGF0aDsKLQotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJaW50IHByZXZJbmRleCA9IDA7Ci0JCQlpbnQgY3VySW5kZXggPSAwOwotCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBhUGF0aDsKLQotCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQlyZXR1cm4gcGF0aFN0cmluZyAhPSBudWxsICYmIHByZXZJbmRleCAhPSAtMTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCWN1ckluZGV4ID0gcGF0aFN0cmluZy5pbmRleE9mKCcvJywgcHJldkluZGV4KTsKLQkJCQlTdHJpbmcgbm9kZVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1ckluZGV4ICE9IC0xKQotCQkJCQlub2RlU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocHJldkluZGV4LCBjdXJJbmRleCsrKTsKLQkJCQllbHNlCi0JCQkJCW5vZGVTdHJpbmcgPSBwYXRoU3RyaW5nLnN1YnN0cmluZyhwcmV2SW5kZXgpOwotCQkJCXByZXZJbmRleCA9IGN1ckluZGV4OwotCQkJCXJldHVybiBub2RlU3RyaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFzc2VkIGluIG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KE5vZGUgbm9kZSkgewotCQlUZXh0IHRleHROb2RlID0gZ2V0Q2hpbGRUZXh0Tm9kZShub2RlKTsKLQkJaWYgKHRleHROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gdGV4dE5vZGUuZ2V0RGF0YSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHRleHQgZm9yIHRoZSBwYXNzZWQgaW4gbm9kZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFRleHQgZ2V0Q2hpbGRUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJTm9kZSB0ZXh0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAodGV4dE5vZGUgIT0gbnVsbCAmJiBET01VdGlsaXRpZXMuaXNUZXh0Tm9kZSh0ZXh0Tm9kZSkpIHsKLQkJCWlmICghaXNXaGl0ZXNwYWNlKHRleHROb2RlKSkKLQkJCQlyZXR1cm4gKFRleHQpIHRleHROb2RlOwotCQkJdGV4dE5vZGUgPSB0ZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gb2YgdGhlIG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlSZXZpc2l0LnRvRG8oKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsYXN0IG5vbi10ZXh0IGNoaWxkIG9mIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGxhc3Qgbm9uLXRleHQgY2hpbGQgbm9kZSBvZgotCSAqIEBub2RlLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldExhc3ROb2RlQ2hpbGQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBjaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQljaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IG5vbi10ZXh0IHNpYmxpbmcgYWZ0ZXIgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBub2RlIGFmdGVyCi0JICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIG5leHQgbm9uLXRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXROZXh0Tm9kZVNpYmxpbmcoTm9kZSBub2RlKSB7Ci0JCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQlyZXR1cm4gc2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IGNoaWxkIE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlzdGF0aWMgcHVibGljIE5vZGUgZ2V0Tm9kZUNoaWxkKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJY2hpbGQgPSBuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBUcmF2ZXJzZXMgdGhlIHBhdGggcGFzc2VkIGluIDxwYXRoTmFtZT4uIFRoZSBwYXRoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtCi0JICogJ25vZGUxL25vZGUyL25vZGUzJy4gVGhpcyBtZXRob2Qgc3RhcnRzIGF0IG5vZGUuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBOb2RlIGdldE5vZGVDaGlsZEZvclBhdGgoTm9kZSBwYXJlbnQsIFN0cmluZyBwYXRoTmFtZSkgewotCi0JCU5vZGUgY3VyTm9kZSA9IHBhcmVudDsKLQkJSXRlcmF0b3IgaSA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IocGF0aE5hbWUpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBjaGlsZCA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJY3VyTm9kZSA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoY3VyTm9kZSwgY2hpbGQpOwotCQkJaWYgKGN1ck5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gY3VyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIE5vZGUgY2hpbGRyZW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzCi0JICovCi0Jc3RhdGljIHB1YmxpYyBMaXN0IGdldE5vZGVDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lcykgewotCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChub2RlTmFtZXNbal0uZXF1YWxzKG4uZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmb3VuZCkKLQkJCQkJcmVzdWx0cy5hZGQobik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBOb2RlIGNoaWxkcmVuIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICovCi0Jc3RhdGljIHB1YmxpYyBMaXN0IGdldE5vZGVDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKQotCQkJCXJlc3VsdHMuYWRkKG4pOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBub2RlIGJlZm9yZQotCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBub24tdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGdldFByZXZpb3VzTm9kZVNpYmxpbmcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBET01VdGlsaXRpZXMuaXNUZXh0Tm9kZShzaWJsaW5nKSkKLQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQlyZXR1cm4gc2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IHRleHQgbm9kZSBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBub2RlIGJlZm9yZQotCSAqIEBub2RlLiBOdWxsIGlmIG5vIHN1Y2ggbm9kZSBleGlzdC4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBnZXRQcmV2aW91c1RleHQoTm9kZSBub2RlKSB7Ci0JCVRleHQgc2libGluZyA9IGdldFByZXZpb3VzVGV4dFNpYmxpbmcobm9kZSk7Ci0KLQkJaWYgKHNpYmxpbmcgPT0gbnVsbCAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKQotCQkJc2libGluZyA9IGdldFByZXZpb3VzVGV4dChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0KLQkJcmV0dXJuIHNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgc2libGluZyBub2RlIGJlZm9yZQotCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyB0ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgZ2V0UHJldmlvdXNUZXh0U2libGluZyhOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlIGxhc3RUZXh0ID0gbnVsbDsKLQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCWxhc3RUZXh0ID0gc2libGluZzsKLQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0JCXJldHVybiAoVGV4dCkgbGFzdFRleHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgc2libGluZyBub2RlIGJlZm9yZQotCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyB0ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUcmFpbGluZ1doaXRlc3BhY2UoVGV4dCBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJU3RyaW5nIHRleHQgPSBub2RlLmdldERhdGEoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBpID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCWZvciAoOyBpID49IDA7IGktLSkgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKCsraSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YWZ0ZXIgPHJlZk5vZGU+LiBJZiA8cmVmTm9kZT5pcyBudWxsIHRoZW4gdGhlIG5vZGUgaXMgaW5zZXJ0ZWQKLQkgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJlbnQncyBjaGlsZCBub2Rlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRBZnRlck5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7Ci0JCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IG51bGw7Ci0JCWlmIChyZWZOb2RlICE9IG51bGwpIHsKLQkJCWluc2VydEJlZm9yZU5vZGUgPSByZWZOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJZWxzZQotCQkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIGluc2VydEJlZm9yZU5vZGUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIDxuZXdOb2RlPmludG8gPHBhcmVudD5iZWZvcmUgPHJlZk5vZGU+LiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKLQkgKiB0aGUgaW5zZXJ0aW9uIGRvZXMgbm90IHJlc3VsdCBpbiB0d28gYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhlIERPTSBtb2RlbCBkb2VzIG5vdCBoYW5kbGUKLQkgKiBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGV5IG11c3QgYmUgam9pbmVkIHRvZ2V0aGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmVOb2RlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgewotCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0IHRleHROZXdOb2RlID0gKFRleHQpIG5ld05vZGU7Ci0KLQkJCS8vIElmIHRoZSBpbnNlcnQgYmVmb3JlIG5vZGUgaXMgdGV4dCwgam9pbiBpdCB3aXRoIHRoZSBuZXcgbm9kZS4KLQkJCWlmIChyZWZOb2RlICE9IG51bGwgJiYgcmVmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dCB0ZXh0UmVmTm9kZSA9IChUZXh0KSByZWZOb2RlOwotCQkJCXRleHRSZWZOb2RlLnNldERhdGEodGV4dE5ld05vZGUuZ2V0RGF0YSgpICsgdGV4dFJlZk5vZGUuZ2V0RGF0YSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBJZiB0aGUgbm9kZSB3ZSBhcmUgaW5zZXJ0aW5nIGFmdGVyIGlzIHRleHQsCi0JCQkvLyBqb2luIGl0IHdpdGggdGhlIG5ldyBub2RlLgotCQkJTm9kZSBpbnNlcnRBZnRlck5vZGUgPSAocmVmTm9kZSA9PSBudWxsKSA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAoaW5zZXJ0QWZ0ZXJOb2RlICE9IG51bGwgJiYgaW5zZXJ0QWZ0ZXJOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlUZXh0IHRleHRJbnNlcnRBZnRlck5vZGUgPSAoVGV4dCkgaW5zZXJ0QWZ0ZXJOb2RlOwotCQkJCXRleHRJbnNlcnRBZnRlck5vZGUuc2V0RGF0YSh0ZXh0SW5zZXJ0QWZ0ZXJOb2RlLmdldERhdGEoKSArIHRleHROZXdOb2RlLmdldERhdGEoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIFRoZXJlIGlzIG5vIHRleHQgbm9kZSB0byBqb2luIHRvLCBzaW1wbGUgaW5zZXJ0IHRoZSBub2RlLgotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZk5vZGUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhIDxuZXdOb2RlPmludG8gPHBhcmVudD5iZWZvcmUgPHJlZk5vZGU+LiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gaW5zZXJ0IHRoZSBub2RlIGJlZm9yZQotCSAqIGFueSB3aGl0ZXNwYWNlIG5vZGVzIHRoYXQgYXBwZWFyIGluIHRoZSB0cmVlIGJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBlbnN1cmUKLQkgKiB0aGF0IHRoZSBpbnNlcnRpb24gZG9lcyBub3QgcmVzdWx0IGluIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGUgRE9NIG1vZGVsIGRvZXMgbm90IGhhbmRsZQotCSAqIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZXkgbXVzdCBiZSBqb2luZWQgdG9nZXRoZXIuCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgewotCQlOb2RlIGN1ck5vZGUgPSAocmVmTm9kZSA9PSBudWxsKSA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCU5vZGUgbGFzdE5vZGUgPSByZWZOb2RlOwotCi0JCXdoaWxlIChjdXJOb2RlICE9IG51bGwgJiYgKERPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UoY3VyTm9kZSkgfHwgRE9NVXRpbGl0aWVzLmlzQ29tbWVudChjdXJOb2RlKSkpIHsKLQkJCWxhc3ROb2RlID0gY3VyTm9kZTsKLQkJCWN1ck5vZGUgPSBjdXJOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0KLQkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIGxhc3ROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBhIHRleHQgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1RleHROb2RlKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgZW50aXJlbHkgY29tbWVudCBvciBub3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIHdoaXRlc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjawotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJcmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBlbnRpcmVseSB3aGl0ZXBhY2Ugb3Igbm90LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyB3aGl0ZXNwYWNlLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJVGV4dCB0ZXh0Tm9kZSA9IChUZXh0KSBub2RlOwotCQlTdHJpbmcgdGV4dCA9IHRleHROb2RlLmdldERhdGEoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBjaGlsZHJlbiBvZiA8bm9kZT4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgcmVtb3ZlQWxsQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGVMaXN0IGxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCW5vZGUucmVtb3ZlQ2hpbGQobGlzdC5pdGVtKGkpKTsKLQkJfQotCX0KLQotCS8vIHRyYXZlcnNlcyB0aGUgRE9NIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgcmV0dXJucyBhIGxpc3QKLQkvLyBvZiBub2RlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHN0cmluZwotCi0Jc3RhdGljIHB1YmxpYyBBcnJheUxpc3QgZ2V0QWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJQXJyYXlMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVN0cmluZ1tdIG5vZGVOYW1lcyA9IHtub2RlTmFtZX07Ci0JCWZpbmRBbGxOb2Rlcyhub2RlLCBub2RlTmFtZXMsIG5vZGVMaXN0KTsKLQotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JLy8gdHJhdmVyc2VzIHRoZSBET00gc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBub2RlIGFuZCByZXR1cm5zIGEgbGlzdAotCS8vIG9mIG5vZGVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5ncwotCi0Jc3RhdGljIHB1YmxpYyBBcnJheUxpc3QgZ2V0QWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXNBcnJheSkgewotCQlBcnJheUxpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbmRBbGxOb2Rlcyhub2RlLCBub2RlTmFtZXNBcnJheSwgbm9kZUxpc3QpOwotCi0JCXJldHVybiBub2RlTGlzdDsKLQl9Ci0KLQkvLyByZWN1cnNpdmUgaGVscGVyIGZvciBnZXRBbGxOb2RlcwotCXN0YXRpYyBwcml2YXRlIHZvaWQgZmluZEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzLCBBcnJheUxpc3QgcmVzdWx0cykgewotCi0JCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vZGVOYW1lcy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobm9kZXMuaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZXNbal0pKSB7Ci0JCQkJCQlyZXN1bHRzLmFkZChub2Rlcy5pdGVtKGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5kQWxsTm9kZXMobm9kZXMuaXRlbShpKSwgbm9kZU5hbWVzLCByZXN1bHRzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBkZWZpbmVkIEpBWFAgZG9jdW1lbnQgYnVpbGRlcgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRG9jdW1lbnRCdWlsZGVyIG5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIoRE9NTG9hZE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJZGJmLnNldFZhbGlkYXRpbmcob3B0aW9ucy5pc1ZhbGlkYXRlKCkpOwotCQlkYmYuc2V0TmFtZXNwYWNlQXdhcmUob3B0aW9ucy5pc1ZhbGlkYXRlKCkpOwotCQkvKgotCQkgKiBDYXVzZXMgZXJyb3JzIGluIElCTSBKREsgdHJ5IHsgZGJmLnNldEF0dHJpYnV0ZShSZW5kZXJlci5KQVhQX1NDSEVNQV9MQU5HVUFHRSwKLQkJICogUmVud2RlcmVyLlczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQotCQkgKi8KLQkJdHJ5IHsKLQkJCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIG5ldyBCb29sZWFuKG9wdGlvbnMuaXNBbGxvd0phdmFFbmNvZGluZ3MoKSkpOyAvLyROT04tTkxTLTEkCSAgICAgICAgCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzXCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgbmV3IEJvb2xlYW4ob3B0aW9ucy5pc1ZhbGlkYXRlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7Ci0JCQlkYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYVwiLiBWYWxpZGF0aW9uIHdpbGwgYmUgZGlzYWJsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlkYmYuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhvcHRpb25zLmlzRXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKCkpOwotCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlyZXN1bHQuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJdGhyb3cgYXJnMDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQl0aHJvdyBhcmcwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGFyZzApOwotCQkJfQotCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdHViIGRvY3VtZW50LCB3aGVyZSB0aGUgRG9jdW1lbnRUeXBlIGlzIGRlZmluZWQgYnkgdGhlIHBhcmFtZXRlcnMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVOZXdEb2N1bWVudChTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREZWZhdWx0RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCUlucHV0U3RyZWFtIGluID0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkLCB0cnVlKTsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpbik7Ci0JCXJlbW92ZUR1bW15RW50aXR5KHJlc3VsdCk7Ci0JCXJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBET01Mb2FkT3B0aW9ucyBvcHRpb25zLCBFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERPTVV0aWxpdGllcy5uZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKG9wdGlvbnMpOwotCQlidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKHJlc29sdmVyKTsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpbik7Ci0JCXJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhlIERPTSBMZXZlbCAyIEFQSXMgYXJlIG5vdCBhZHZhbmNlZCBlbm91Z2ggZm9yIHNldHRpbmcgdGhlCi0JICogZG9jdW1lbnQgdHlwZTsgc28gdGhlIG9ubHkgcGFyc2VyIGluZGVwZW5kZW50IHdheSBvZiBhY2NvbXBsaXNoaW5nIHRoaXMgaXMgYnkgY3JlYXRpbmcgYQotCSAqIHN0cmVhbSBhbmQgcGFyc2luZyBpdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlyZXR1cm4gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkLCBmYWxzZSk7Ci0JfQotCi0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIGJvb2xlYW4gaW5jbHVkZUR1bW15KSB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJLy8gVGhlIHByaW9yIGNvZGUgKHdoaWNoIGlzIHN0aWxsIGluIHRoZSBjYXRjaCBibG9jayksIHVzZXMKLQkJLy8gdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nIFtTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKV07Ci0JCS8vIG9uIFovT1MgdGhpcyBpcyBDcDEwNDcuIFRoZSBjb21iaW5hdGlvbiBvZiAiVVRGLTgiIGluIHRoZSBoZWFkZXIKLQkJLy8gYW5kICJDcDEwNDciIGluIHRoZSB3cml0ZXIgY3JlYXRlIGFuIHVudXNhYmxlIGlucHV0IHN0cmVhbS4KLQotCQlQcmludFdyaXRlciB3cml0ZXI7Ci0KLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0V3JpdGVyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKGVhcmxpZXIgY29kZSkKLQkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRwdXRTdHJlYW0pOyAKLQkJfQotCi0JCXdyaXRlSGVhZGVyKHdyaXRlciwgZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJaWYgKGluY2x1ZGVEdW1teSkKLQkJCWFkZER1bW15RW50aXR5KHdyaXRlcik7Ci0JCXdyaXRlci5mbHVzaCgpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlieXRlW10gYnl0ZXMgPSBvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlSGVhZGVyKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXdyaXRlci53cml0ZSgiPD94bWwgdmVyc2lvbj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLndyaXRlKCJcIiBlbmNvZGluZz1cIiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci53cml0ZSgiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIud3JpdGUoIlwiPz4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigpOwotCi0JCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCXdyaXRlci53cml0ZSgiPCFET0NUWVBFICIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoZG9jdHlwZSk7Ci0JCQl3cml0ZXIud3JpdGUoIiBQVUJMSUMgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKHB1YmxpY0lkKTsKLQkJCXdyaXRlci53cml0ZSgiXCIgXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKHN5c3RlbUlkKTsKLQkJCXdyaXRlci53cml0ZSgiXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZER1bW15RW50aXR5KFByaW50V3JpdGVyIHdyaXRlcikgewotCQlSZXZpc2l0LnJldmlzaXQoKTsKLQkJd3JpdGVyLnByaW50bG4oRFVNTVlfRU5USVRZX05PREVfU1RSSU5HKTsKLQkJLy9NYWpvciBoYWNrIGJlY2F1c2Ugd2UgY2FuIG5vdCBwYXJzZSBhbiBlbXB0eSBkb2N1bWVudAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRHVtbXlFbnRpdHkoRG9jdW1lbnQgZG9jKSB7Ci0JCWRvYy5yZW1vdmVDaGlsZChnZXROb2RlQ2hpbGQoZG9jLCBEVU1NWV9FTlRJVFlfU1RSSU5HKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMoRG9jdW1lbnQgZG9jKSB7Ci0JCS8vYW5vdGhlciBtYWpvciBoYWNrIGJlY2F1c2Ugb2YgYSBidWcgaW4gWE1MNEogNC4wLjcgdGhhdCBhZGRlZCBhbGwgdGhlCi0JCS8vY29tbWVudHMgZnJvbSB0aGUgZHRkIHRvIHRoZSBkb2N1bWVudC4gQ2FuIGJlIHJlbW92ZWQgYWZ0ZXIgd2UgbW92ZSB1cAotCQkvL1hlcmNlcyBsZXZlbHMKLQkJTm9kZSBhTm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIG5leHROb2RlID0gYU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChhTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCWRvYy5yZW1vdmVDaGlsZChhTm9kZSk7Ci0JCQlhTm9kZSA9IG5leHROb2RlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yIHBlcmZvcm1hbmNlLCBjYWNoZSBhIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgSkFYUCByZWdpc3RlcmVkIGRvY3VtZW50IGJ1aWxkZXIuIFZhbGlkYXRpb24KLQkgKiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZS4gSWYgeW91IG5lZWQgdmFsaWRhdGlvbiwgdXNlCi0JICoge0BsaW5rICNuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pfQotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnRCdWlsZGVyCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgSkFYUCBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREZWZhdWx0RG9jdW1lbnRCdWlsZGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotCQlpZiAoZGVmYXVsdERvY3VtZW50QnVpbGRlciA9PSBudWxsKSB7Ci0JCQlET01Mb2FkT3B0aW9ucyBvcHRzID0gbmV3IERPTUxvYWRPcHRpb25zKCk7Ci0JCQlvcHRzLnNldEFsbG93SmF2YUVuY29kaW5ncyh0cnVlKTsKLQkJCW9wdHMuc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKHRydWUpOwotCQkJb3B0cy5zZXRWYWxpZGF0ZShmYWxzZSk7Ci0JCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyID0gbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihvcHRzKTsKLQkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZGVmYXVsdEVudGl0eVJlc29sdmVyKTsKLQkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCQkJICovCi0JCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0KLQkJcmV0dXJuIGRlZmF1bHREb2N1bWVudEJ1aWxkZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZ2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKCkgewotCQlyZXR1cm4gZGVmYXVsdEVudGl0eVJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJZGVmYXVsdEVudGl0eVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmQwMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RhbmdsaW5nSFJFRkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMiwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLS8qKgotICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgcHJveHkgY2FuIG5vdCBiZSByZXNvbHZlZAotICovCi1wdWJsaWMgY2xhc3MgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCi0JcHVibGljIERhbmdsaW5nSFJFRkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcwotCSAqLwotCXB1YmxpYyBEYW5nbGluZ0hSRUZFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU2Njk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgMjo0OTo0OSBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBpbXBsZW1lbnRzIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxFRF9DT05WRVJTSU9OX1BBVFRFUk4gPSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5GYWlsZWRfdG9fY29udmVydF9fMF9fdG9fX19FUlJPUl87Ci0KLQkvKioKLQkgKiBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBCb29sZWFuLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvQm9vbGVhbihPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkJvb2xlYW5fVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEJ5dGUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9CeXRlKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiBCeXRlLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEJ5dGUpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQnl0ZV9VSV8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIGEgQ2hhcmFjdGVyLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvQ2hhcmFjdGVyKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgYVZhbHVlKS5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIoKChTdHJpbmcpIGFWYWx1ZSkuY2hhckF0KDApKTsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5DaGFyYWN0ZXJfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIERvdWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0RvdWJsZShPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0RG91YmxlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Eb3VibGVfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEVFbnVtTGl0ZXJhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0VudW0oT2JqZWN0IGFWYWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gbnVsbDsKLQkJRUVudW0gZWVudW0gPSAoRUVudW0pIGFGZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlsaXRlcmFsID0gZWVudW0uZ2V0RUVudW1MaXRlcmFsKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlsaXRlcmFsID0gZWVudW0uZ2V0RUVudW1MaXRlcmFsKCgoSW50ZWdlcikgYVZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJZWxzZSBpZiAoYVZhbHVlIGluc3RhbmNlb2YgRUVudW1MaXRlcmFsKQotCQkJbGl0ZXJhbCA9IChFRW51bUxpdGVyYWwpIGFWYWx1ZTsKLQotCQlpZiAobGl0ZXJhbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkVudW1lcmF0aW9uX1VJXyk7Ci0KLQkJcmV0dXJuIGxpdGVyYWwuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEZsb2F0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvRmxvYXQoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBGbG9hdC52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0RmxvYXQoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRmxvYXQpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRmxvYXRfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9JbnRlZ2VyKE9iamVjdCBhVmFsdWUpIHsKLQkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0SW50ZWdlcigpOwotCQkJfQotCQl9Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJcmV0dXJuIGFWYWx1ZTsKLQkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkludGVnZXJfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIEphdmEgT2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvSmF2YU9iamVjdChPYmplY3QgYVZhbHVlKSB7Ci0JCXJldHVybiBhVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBMb25nLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvTG9uZyhPYmplY3QgYVZhbHVlKSB7Ci0JCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIExvbmcudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdExvbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgTG9uZykKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Mb25nX1VJXyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydAotCSAqIAotCSAqIEBhVmFsdWUgdG8gYSBNb2ZPYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Nb2ZPYmplY3QoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCXJldHVybiBhVmFsdWU7Ci0JCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Nb2ZPYmplY3RfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIFNob3J0LgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvU2hvcnQoT2JqZWN0IGFWYWx1ZSkgewotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBTaG9ydC52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBkZWZhdWx0U2hvcnQoKTsKLQkJCX0KLQkJfQotCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU2hvcnQpCi0JCQlyZXR1cm4gYVZhbHVlOwotCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuU2hvcnRfVUlfKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byBhIFN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb1N0cmluZyhPYmplY3QgYVZhbHVlKSB7Ci0JCXJldHVybiBhVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byB0aGUgdHlwZSBvZgotCSAqIEBhbkF0dHJpYnV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRWYWx1ZShPYmplY3QgYVZhbHVlLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewotCi0JCUVDbGFzc2lmaWVyIG1ldGEgPSBhbkF0dHJpYnV0ZS5nZXRFVHlwZSgpOwotCQlpZiAobWV0YS5lQ2xhc3MoKSA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVFbnVtKCkpCi0JCQlyZXR1cm4gY29udmVydFRvRW51bShhVmFsdWUsIGFuQXR0cmlidXRlKTsKLQkJaWYgKG1ldGEuZ2V0RVBhY2thZ2UoKSBpbnN0YW5jZW9mIEVjb3JlUGFja2FnZSkKLQkJewotCQkJc3dpdGNoIChtZXRhLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNUUklORyA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9TdHJpbmcoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTl9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCT09MRUFOIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0Jvb2xlYW4oYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FSU5URUdFUl9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVJTlQgOgotCQkJCQlyZXR1cm4gY29udmVydFRvSW50ZWdlcihhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVGTE9BVF9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVGTE9BVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9GbG9hdChhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSQUNURVJfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUiA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9DaGFyYWN0ZXIoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FTE9OR19PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0xvbmcoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FQllURV9PQkpFQ1QgOgotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0J5dGUoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FRE9VQkxFX09CSkVDVCA6Ci0JCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRSA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9Eb3VibGUoYVZhbHVlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FU0hPUlRfT0JKRUNUIDoKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FU0hPUlQgOgotCQkJCQlyZXR1cm4gY29udmVydFRvU2hvcnQoYVZhbHVlKTsKLQkJCQkvLwkJY2FzZSBFY29yZVBhY2thZ2UuRUVOVU06Ci0JCQkJLy8JCQlyZXR1cm4gY29udmVydFRvRW51bShhVmFsdWUsIGFuQXR0cmlidXRlKTsKLQkJCQljYXNlIEVjb3JlUGFja2FnZS5FT0JKRUNUIDoKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb01vZk9iamVjdChhVmFsdWUpOwotCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVKQVZBX09CSkVDVCA6Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9KYXZhT2JqZWN0KGFWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobWV0YS5nZXRFUGFja2FnZSgpIGluc3RhbmNlb2YgWE1MVHlwZVBhY2thZ2UpCi0JCXsKLQkJCXN3aXRjaCAobWV0YS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5TVFJJTkcgOgotCQkJCXJldHVybiBjb252ZXJ0VG9TdHJpbmcoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQk9PTEVBTl9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CT09MRUFOIDoKLQkJCQlyZXR1cm4gY29udmVydFRvQm9vbGVhbihhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlRfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5URUdFUiA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVCA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0ludGVnZXIoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuRkxPQVRfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuRkxPQVQgOgotCQkJCXJldHVybiBjb252ZXJ0VG9GbG9hdChhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5MT05HX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkxPTkcgOgotCQkJCXJldHVybiBjb252ZXJ0VG9Mb25nKGFWYWx1ZSk7Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJZVEVfT0JKRUNUIDoKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQllURSA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0J5dGUoYVZhbHVlKTsKLQkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuRE9VQkxFX09CSkVDVCA6Ci0JCQljYXNlIFhNTFR5cGVQYWNrYWdlLkRPVUJMRSA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb0RvdWJsZShhVmFsdWUpOwotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5TSE9SVF9PQkpFQ1QgOgotCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5TSE9SVCA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0KGFWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0Ci0JICogCi0JICogQGFWYWx1ZSB0byB0aGUgdHlwZSBvZgotCSAqIEBhRmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRWYWx1ZShPYmplY3QgYVZhbHVlLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCWlmIChhVmFsdWUgPT0gbnVsbCB8fCBhRmVhdHVyZSA9PSBudWxsIHx8ICEoYUZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSkKLQkJCXJldHVybiBhVmFsdWU7IC8vbm90aGluZyB0byBjb252ZXJ0Ci0JCXJldHVybiBjb252ZXJ0VmFsdWUoYVZhbHVlLCAoRUF0dHJpYnV0ZSkgYUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBEb3VibGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBkZWZhdWx0RG91YmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRmxvYXQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIEZsb2F0IGRlZmF1bHRGbG9hdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IEludGVnZXIgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgZGVmYXVsdEludGVnZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBMb25nIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBMb25nIGRlZmF1bHRMb25nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgU2hvcnQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFNob3J0IGRlZmF1bHRTaG9ydCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmFpbGVkIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZmFpbGVkVG9Db252ZXJ0KE9iamVjdCBhVmFsdWUsIFN0cmluZyBhU3RyaW5nKSB7Ci0JCVN0cmluZyBlcnJvclN0cmluZyA9IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChGQUlMRURfQ09OVkVSU0lPTl9QQVRURVJOLCBuZXcgU3RyaW5nW117YVZhbHVlLnRvU3RyaW5nKCksIGFTdHJpbmd9KTsKLQkJdGhyb3cgbmV3IEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzNkZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZS5GYWN0b3J5IEdMT0JBTF9GQUNUT1JZID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoREVGQVVMVF9FWFRFTlNJT04pKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCU9iamVjdCByZXNvdXJjZUZhY3RvcnkgPSBudWxsOwotCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCVN0cmluZyBwcm90b2NvbCA9IHVyaS5zY2hlbWUoKTsKLQkJCXJlc291cmNlRmFjdG9yeSA9IHByb3RvY29sVG9GYWN0b3J5TWFwLmdldChwcm90b2NvbCk7Ci0JCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gdXJpLmZpbGVFeHRlbnNpb24oKTsKLQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBleHRlbnNpb25Ub0ZhY3RvcnlNYXAuZ2V0KGV4dGVuc2lvbik7Ci0JCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlRmFjdG9yeSA9IGRlbGVnYXRlZEdldEZhY3RvcnkodXJpKTsKLQkJCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBHTE9CQUxfRkFDVE9SWSkgewotCQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gZXh0ZW5zaW9uVG9GYWN0b3J5TWFwLmdldChSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKLQkJCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBHTE9CQUxfRkFDVE9SWTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc291cmNlRmFjdG9yeSBpbnN0YW5jZW9mIFJlc291cmNlLkZhY3RvcnkuRGVzY3JpcHRvciA/ICgoUmVzb3VyY2UuRmFjdG9yeS5EZXNjcmlwdG9yKSByZXNvdXJjZUZhY3RvcnkpLmNyZWF0ZUZhY3RvcnkoKSA6IChSZXNvdXJjZS5GYWN0b3J5KSByZXNvdXJjZUZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwjZGVsZWdhdGVkR2V0RmFjdG9yeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXByb3RlY3RlZCBGYWN0b3J5IGRlbGVnYXRlZEdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmNjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjI1OjQzIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24gewotCXByb3RlY3RlZCBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlZmVyZW5jZVZhbHVlOwotCXByb3RlY3RlZCBFT2JqZWN0IGNvcHlDb250YWluZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZFN1ZmZpeDsKLQotCS8qKgotCSAqIERlZmVycmVkQ29weSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlyZWZlcmVuY2UgPSBhUmVmZXJlbmNlOwotCQlyZWZlcmVuY2VWYWx1ZSA9IGFWYWx1ZTsKLQkJaWRTdWZmaXggPSBhU3VmZml4OwotCQljb3B5Q29udGFpbmVyID0gYUNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0Q29weUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvcHlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkU3VmZml4KCkgewotCQlyZXR1cm4gaWRTdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOTozMjoyOCBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZVZhbHVlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlVmFsdWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybUFjdGlvbigpOwotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWZlMDZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW50ZXJmYWNlIHRvIGFuIG9iamVjdCB3aGljaCBjYW4gZW5jb2RlIGFuZCBkZWNvZGUgdmFsdWVzLiBUaGlzIHR5cGljYWxseSBpbnZvbHZlcwotICogY3J5cHRvZ3JhcGh5IGFsZ29yaXRobXMuIFRoaXMgaW50ZXJmYWNlLCBhbG9uZyB3aXRoIHRoZSBzdXBwbGllZCBhZGFwdGVycyBwcm92aWRlIGFuIGV4dGVuc2lvbgotICogbWVjaGFuaXNtIGZvciBwbHVnZ2FibGUgY3J5dG9ncmFwaHkgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgYXR0cmlidXRlCi0gKiB2YWx1ZXMsIGFuZCBpcyB1c2VkIHByZXZhbGVudGx5IGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgcGFzc3dvcmQgdmFsdWVzIG9mIG1vZiBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kZXJEZWNvZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODhiMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBBbiBhZGFwdGVyIGZvciBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE1MTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZWdpc3RyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWx1ZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuIFVzYWdlIEV4YW1wbGU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAKLSAqIAotICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgotICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7Ci0gKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCi0gKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKLSAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgotICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKLSAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotICogLy8gV3JpdGVCYWNrSGVscGVyLgotICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKLSAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KLSAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RlckRlY29kZXJSZWdpc3RyeSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IF9kZWZhdWx0SW5zdGFuY2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGVyRGVjb2RlciBJTklUSUFMX0RFRkFVTFRfRU5DT0RFUiA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuSU5TVEFOQ0U7Ci0JcHJvdGVjdGVkIE1hcCBlbmNvZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RW5jb2RlcktleTsKLQotCS8qKgotCSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRW5jb2RlckRlY29kZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIvMi8yMDAxIDEyOjQzOjMxIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXJEZWNvZGVyKSB7Ci0JCWVuY29kZXJzLnB1dChlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZW5jb2RlckRlY29kZXIpOwotCQlpZiAoZGVmYXVsdEVuY29kZXJLZXkgPT0gbnVsbCkKLQkJCWRlZmF1bHRFbmNvZGVyS2V5ID0gZW5jb2RlckRlY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChkZWZhdWx0RW5jb2RlcktleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCByZWdpc3RyeSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdmFsdWUgZW5jb2RlcnMgYW5kIGRlY29kZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IGdldERlZmF1bHRSZWdpc3RyeSgpIHsKLQkJaWYgKF9kZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2RlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIF9kZWZhdWx0SW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgotCSAqLwotCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXRFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7Ci0JCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgc3RhbmRhcmQgc2V0IG9mIGVuY29kZXIvZGVjb2RlcnMuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpIHsKLQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKElOSVRJQUxfREVGQVVMVF9FTkNPREVSKTsKLQkJYWRkRW5jb2RlckRlY29kZXIobmV3IFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRW5jb2RlckRlY29kZXIoT2JqZWN0IGtleSkgewotCQlpZiAoZW5jb2RlcnMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJZW5jb2RlcnMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXIpIHsKLQkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlpZiAoIWVuY29kZXJzLmNvbnRhaW5zS2V5KGRlZmF1bHRFbmNvZGVyS2V5KSkgewotCQkJYWRkRW5jb2RlckRlY29kZXIoZW5jb2Rlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwODA0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMDQvMDEgMTE6MjU6NTkgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlTZXNzaW9uIGV4dGVuZHMgRXRvb2xzQ29weVV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0NPUElFRCA9IDUwMDsKLQlwcml2YXRlIEV0b29sc0NvcHlVdGlsaXR5IHBhcmVudENvcHlVdGlsaXR5OwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudFJlc291cmNlOwotCXByaXZhdGUgWE1MUmVzb3VyY2UgY3VycmVudENvcHlSZXNvdXJjZTsKLQotCS8qKgotCSAqIEV0b29sc0NvcHlTZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEV0b29sc0NvcHlTZXNzaW9uKEV0b29sc0NvcHlVdGlsaXR5IGFDb3B5VXRpbGl0eSkgewotCQlwYXJlbnRDb3B5VXRpbGl0eSA9IGFDb3B5VXRpbGl0eTsKLQkJc2V0UHJlc2VydmVJZHMoYUNvcHlVdGlsaXR5LnByZXNlcnZlSWRzKCkpOwotCQlzZXRDb3B5QWRhcHRlcnMoYUNvcHlVdGlsaXR5LmlzQ29weUFkYXB0ZXJzKCkpOwotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KLQkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKLQkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgotCSAqIAotCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJaWYgKGFHcm91cCAhPSBudWxsKSB7Ci0JCQljb3B5UmVzb3VyY2VzKGFHcm91cCk7Ci0JCQljb3B5UmVmT2JqZWN0cyhhR3JvdXApOwotCQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJCWFHcm91cC5wb3N0Q29weSh0aGlzKTsKLQkJCW5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChhR3JvdXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcwotCSAqIGNvcHkgZXhlY3V0aW9uLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhpcyBtZXRob2Qgb25seSBjb3BpZXMgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gYXR0cmlidXRlcy4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjb3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUVPYmplY3QgY29waWVkID0gY29udGFpbm1lbnRDb3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhlIGNvcGllZCBSZXNvdXJjZSB3aWxsIGhhdmUgYSBVUkkgZXF1YWwgdG8gPGNvZGU+bmV3VXJpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29waWVkID0gY29udGFpbm1lbnRDb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJZXhlY3V0ZURlZmVycmVkQ29weUFjdGlvbnMoKTsKLQkJY29weU1vZGlmaWNhdGlvbkZsYWcoYVJlc291cmNlLCBjb3BpZWQpOwotCQlub3RpZnlOZXdSZXNvdXJjZUNvcGllZChjb3BpZWQpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlc0NvcGllZChDb3B5R3JvdXAgZ3JvdXApIHsKLQkJTGlzdCBjb3BpZWQgPSBncm91cC5nZXRDb3BpZWRSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZWQuc2l6ZSgpOyBpKyspIHsKLQkJCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKChSZXNvdXJjZSkgY29waWVkLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOZXdSZXNvdXJjZUNvcGllZChSZXNvdXJjZSBjb3BpZWQpIHsKLQkJY29waWVkLmVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoUkVTT1VSQ0VfQ09QSUVELCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLmNvcHkuRXRvb2xzQ29weVV0aWxpdHkjcHJpbUNvcHlPYmplY3QoRU9iamVjdCwKLQkgKiAgICAgIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFT2JqZWN0IGNvcHkgPSBzdXBlci5wcmltQ29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCWNvcHlJZElmTmVjZXNzYXJ5KGFSZWZPYmplY3QsIGNvcHksIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUlkSWZOZWNlc3NhcnkoRU9iamVjdCBvYmosIEVPYmplY3QgY29weSwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmICgoaWRTdWZmaXggPT0gbnVsbCAmJiAhcHJlc2VydmVJZHMpIHx8IGN1cnJlbnRSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaWQgPSBjdXJyZW50UmVzb3VyY2UuZ2V0SUQob2JqKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlkID0gaWRTdWZmaXggPT0gbnVsbCA/IGlkIDogaWQgKyBpZFN1ZmZpeDsKLQkJY3VycmVudENvcHlSZXNvdXJjZS5zZXRJRChjb3B5LCBpZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgZGVsaXZlcnkgYmFjayBvbiBmb3IgYWxsIHRoZSBjYWNoZWQgb2JqZWN0cyBhbmQgcHVzaCB0aGVtIHRvIHRoZSBwYXJlbnRDb3B5VXRpbGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJSXRlcmF0b3IgaXQgPSBnZXRDb3BpZWRPYmplY3RzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQlNYXAgcGFyZW50Q29waWVzID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3BpZWRPYmplY3RzKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJRU9iamVjdCBjb3B5OwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWNvcHkgPSAoRU9iamVjdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWNvcHkuZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCQlwYXJlbnRDb3BpZXMucHV0KGVudHJ5LmdldEtleSgpLCBjb3B5KTsKLQkJfQotCQljb3BpZWRPYmplY3RzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBzdXBlci5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gZ2V0UGFyZW50Q29weVV0aWxpdHkoKS5nZXRDb3B5KGFuT2JqZWN0KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyODowNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eQotCSAqLwotCXByb3RlY3RlZCBFdG9vbHNDb3B5VXRpbGl0eSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpIHsKLQkJcmV0dXJuIHBhcmVudENvcHlVdGlsaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBFT2JqZWN0IHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBhcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBuZXdJbnN0YW5jZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKLQkJRU9iamVjdCBuZXdUeXBlID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlZk9iamVjdCk7Ci0JCW5ld1R5cGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQlyZXR1cm4gbmV3VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNuZXdJbnN0YW5jZShSZXNvdXJjZSwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJUmVzb3VyY2UgY29weSA9IHN1cGVyLm5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJaWYgKGFSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGFSZXNvdXJjZTsKLQkJCWN1cnJlbnRDb3B5UmVzb3VyY2UgPSAoWE1MUmVzb3VyY2UpIGNvcHk7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50UmVzb3VyY2UgPSBudWxsOwotCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FdG9vbHNDb3B5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDkxZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTA6NTUgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEV0b29sc0NvcHlVdGlsaXR5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFTlVNTElURVJBTF9UWVBFX05BTUUgPSAiRUVudW1MaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgRWNvcmVQYWNrYWdlIHBrZyA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGZpbmFsIEVUeXBlZEVsZW1lbnQgTUVUQUVOQU1FID0gcGtnLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JcHJvdGVjdGVkIEhhc2hNYXAgY29waWVkT2JqZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVzZXJ2ZUlkcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGNvcHlBZGFwdGVycyA9IGZhbHNlOwotCXByb3RlY3RlZCBIYXNoTWFwIGNvcGllZEFkYXB0ZXJzOwotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQkJc3VwZXIoYVJlZmVyZW5jZSwgYVZhbHVlLCBhU3VmZml4LCBhQ29weUNvbnRhaW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSBnZXRSZWZlcmVuY2VWYWx1ZSgpOwotCQkJZ2V0Q29weUNvbnRhaW5lcigpLmVTZXQoZ2V0UmVmZXJlbmNlKCksIGdldENvcHlJZkZvdW5kKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbiBleHRlbmRzIERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiB7Ci0JCXB1YmxpYyBEZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgTGlzdCBhVmFsdWUsIFN0cmluZyBhU3VmZml4LCBFT2JqZWN0IGFDb3B5Q29udGFpbmVyKSB7Ci0JCQlzdXBlcihhUmVmZXJlbmNlLCBhVmFsdWUsIGFTdWZmaXgsIGFDb3B5Q29udGFpbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0JCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGdldENvcHlDb250YWluZXIoKS5lR2V0KGdldFJlZmVyZW5jZSgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gKChMaXN0KSBnZXRSZWZlcmVuY2VWYWx1ZSgpKS5pdGVyYXRvcigpOwotCQkJRU9iamVjdCBuZXh0OwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWNvcHlMaXN0LmFkZChnZXRDb3B5SWZGb3VuZChuZXh0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTQ6MjYgUE0pCi0JICogCi0JICogQHBhcmFtIGFSZWZPYmplY3QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ci0JICovCi0JcHVibGljIEV0b29sc0NvcHlVdGlsaXR5KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPkRlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb248L2NvZGU+IGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgZGVmZXJyZWQKLQkgKiBjb3B5IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgTGlzdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmFkZChuZXcgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbihyZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGFDb3B5Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+RGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uPC9jb2RlPiBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGRlZmVycmVkCi0JICogY29weSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewotCQlnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmFkZChuZXcgRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uKHJlZmVyZW5jZSwgYVZhbHVlLCBpZFN1ZmZpeCwgYUNvcHlDb250YWluZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW4gYWxyZWFkeSBjb3BpZWQgb2JqZWN0IGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5tZW50Q29weShFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gcHJpbUNvcHkoYW5PYmplY3QsIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW4gYWxyZWFkeSBjb3BpZWQgb2JqZWN0IGZpcnN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGNvbnRhaW5tZW50Q29weU9iamVjdChFT2JqZWN0IGFuT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKLQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KGFuT2JqZWN0KTsKLQkJaWYgKGNvcGllZCA9PSBudWxsKQotCQkJY29waWVkID0gcHJpbUNvcHlPYmplY3QoYW5PYmplY3QsIGlkU3VmZml4KTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgY29udGFpbm1lbnRDb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQkvKiBjb3BpZWQgcmVzb3VyY2VzIGFyZSBuZXZlciBjYWNoZWQgKi8KLQkJcmV0dXJuIHByaW1Db3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgd2l0aGluIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGVtIHRvCi0JICogPGNvZGU+YUdyb3VwPC9jb2RlPi4gTm9uIGNvbXBvc2l0ZSByZWZlcmVuY2VzIHdpbGwgYmUgZGVmZXJyZWQgdW50aWwgYWxsIG9iamVjdHMgYXJlCi0JICogY29waWVkIGZyb20gPGNvZGU+YUdyb3VwPC9jb2RlPi4KLQkgKiAKLQkgKiBDb3B5IFJlc291cmNlcyBmaXJzdCBhbmQgdGhlbiBjb3B5IFJlZk9iamVjdHMuCi0JICovCi0JcHVibGljIHZvaWQgY29weShDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCWlmIChhR3JvdXAgIT0gbnVsbCkgewotCQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJCXNlc3Npb24uc2V0UHJlc2VydmVJZHMoYUdyb3VwLmdldFByZXNlcnZlSWRzKCkpOwotCQkJc2Vzc2lvbi5jb3B5KGFHcm91cCk7Ci0JCQlzZXNzaW9uLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjb3B5KEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlyZXR1cm4gY29weShhUmVmT2JqZWN0LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uCi0JICovCi0JcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCi0JICogY29weSBleGVjdXRpb24uIFRoaXMgbWV0aG9kIG9ubHkgY29waWVzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IHdpdGggaXRzIHByb3BlcnRpZXMsIG5vdAotCSAqIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIEVPYmplY3QgY29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEV0b29sc0NvcHlTZXNzaW9uKHRoaXMpOwotCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JCXNlc3Npb24uZmx1c2goKTsKLQkJcmV0dXJuIGNvcGllZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IGluIHRoaXMKLQkgKiBjb3B5IGV4ZWN1dGlvbi4gVGhlIGNvcGllZCBSZXNvdXJjZSB3aWxsIGhhdmUgYSBVUkkgZXF1YWwgdG8gPGNvZGU+bmV3VXJpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKLQkJUmVzb3VyY2UgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJc2Vzc2lvbi5mbHVzaCgpOwotCQlyZXR1cm4gY29waWVkOwotCX0KLQotCS8qKgotCSAqIElmIGFuIGF0dHJpYnV0ZSBpcyBzZXQgYW5kIGl0cyB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gcGVyZm9ybSBjb3B5Ci0JICogPGNvZGU+YXR0cmlidXRlPC9jb2RlPiB2YWx1ZSBmcm9tIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+IHRvIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIE51bGwgaXMgYSB2YWxpZCB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHNldC4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJaWYgKCFhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkpCi0JCQlyZXR1cm47IC8vaWdub3JlCi0JCWlmIChhdHRyaWJ1dGUuaXNNYW55KCkpIHsKLQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQljb3B5TWFueUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYVJlZk9iamVjdC5lSXNTZXQoYXR0cmlidXRlKSkgewotCQkJT2JqZWN0IHZhbHVlID0gYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJY29weVNpbmdsZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCX0gZWxzZSBpZiAoYXR0cmlidXRlID09IE1FVEFFTkFNRSkgewotCQkJLy9zZXQgbmFtZSB0byB0aGUgSUQgKHRoaXMgaXMgY29tcHV0ZWQgYXMgYSBkZWZhdWx0KSwgb25seSBnZXQgaGVyZSBpZiBpc1NldE5hbWUgaXMKLQkJCS8vIGZhbHNlLgotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVJlZk9iamVjdC5lR2V0KGF0dHJpYnV0ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWNlaXZlciBhbmQgY29weSBlYWNoIGF0dHJpYnV0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5Q3VycmVudEF0dHJpYnV0ZXMoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IGF0dHJpYnV0ZXMgPSBhUmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotCQkJRUF0dHJpYnV0ZSByYTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyYSA9IChFQXR0cmlidXRlKSBpdC5uZXh0KCk7Ci0JCQkJY29weUF0dHJpYnV0ZShyYSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQotCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIAotCSAqIFRlc3RzOiAxLiBEbyBub3RoaW5nIGlmIHRoZSByZWZlcmVuY2UgZXF1YWxzIHRoZSBtZXRhRUNvbnRhaW5lciBvciBtZXRhRUNvbnRhaW5zIHJlZmVyZW5jZXMuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5Q3VycmVudFJlZmVyZW5jZXMoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlMaXN0IHJlZmVyZW5jZXMgPSBhUmVmT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOwotCQkJRVJlZmVyZW5jZSBycjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyciA9IChFUmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHNob3VsZENvcHlSZWZlcmVuY2UocnIpKQotCQkJCQljb3B5UmVmZXJlbmNlKHJyLCBhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIG92ZXIgPGNvZGU+YW5FeHRlbnQ8L2NvZGU+IGFuZCBjb3B5IGVhY2ggZWxlbWVudCB0byA8Y29kZT5jb3B5RXh0ZW50PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RXh0ZW50KEVMaXN0IGFuRXh0ZW50LCBFTGlzdCBjb3B5RXh0ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYW5FeHRlbnQuaXRlcmF0b3IoKTsKLQkJRU9iamVjdCByZWZPYmplY3Q7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlZk9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQljb3B5RXh0ZW50LmFkZChjb250YWlubWVudENvcHkocmVmT2JqZWN0LCBudWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgbWFueSB2YWx1ZSBhdHRyaWJ1dGUgd2hpY2ggaXMgdHJlYXRlZCBhcyBhIG1hbnkgdmFsdWVkIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBUZXN0czoKLQkgKiAKLQkgKiAxLiBJZiB0aGUgdHlwZSBpcyA8Ym9sZD5ub3QgPC9ib2xkPiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBzZXQgdGhlIHZhbHVlIG9uCi0JICogPGNvZGU+Y29weVJlZjwvY29kZT4gd2l0aG91dCBtYWtpbmcgYSBjb3B5LiAyLiBJZiB0aGUgdHlwZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgotCSAqIG9idGFpbiB0aGUgbGlzdCBmcm9tIDxjb2RlPmNvcHlSZWY8L2NvZGU+IGFuZCBhZGQgYSBjb3B5IG9mIGVhY2ggdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwKLQkgKiBsaXN0IHRvIGl0LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weU1hbnlBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIExpc3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7Ci0JCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSA9PSBudWxsKQotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJZWxzZSB7Ci0JCQlMaXN0IGNvcHlMaXN0ID0gKExpc3QpIGNvcHlSZWYuZUdldChhdHRyaWJ1dGUpOwotCQkJSXRlcmF0b3IgaXQgPSBhVmFsdWUuaXRlcmF0b3IoKTsKLQkJCU9iamVjdCBuZXh0OwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCW5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCQljb3B5TGlzdC5hZGQoY29udGFpbm1lbnRDb3B5KChFT2JqZWN0KSBuZXh0LCBpZFN1ZmZpeCkpOwotCQkJCWVsc2UKLQkJCQkJY29weUxpc3QuYWRkKG5leHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQotCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqIAotCSAqIFRlc3RzOiAxLiBJZiB0aGUgcmVmZXJlbmNlIGlzIG1hbnksIG9idGFpbiB0aGUgbGlzdCBmcm9tIHRoZSByZWNlaXZpbmcgb2JqZWN0IGFuZCBtYWtlIGEgY29weQotCSAqIG9mIGVhY2ggdmFsdWUgaWYgdGhlIHJlZmVyZW5jZSBpcyBjb21wb3NpdGUgYmVmb3JlIGFkZGluZyB0byB0aGUgbGlzdDsgb3RoZXJ3aXNlLCBqdXN0IGFkZAotCSAqIGVhY2ggdmFsdWUgdG8gdGhlIG9mIHRoZSA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNYW55UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgTGlzdCBhTGlzdCwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoIWFMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGFSZWZlcmVuY2UuaXNDb250YWlubWVudCgpKSB7Ci0JCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBjb3B5UmVmLmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSBhTGlzdC5pdGVyYXRvcigpOwotCQkJCUVPYmplY3QgdGFyZ2V0VmFsdWU7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQl0YXJnZXRWYWx1ZSA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCWNvcHlMaXN0LmFkZChjb250YWlubWVudENvcHkodGFyZ2V0VmFsdWUsIGlkU3VmZml4KSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJYWRkRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weShhUmVmZXJlbmNlLCBhTGlzdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHkuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYVJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJTGlzdCB2YWx1ZSA9IChMaXN0KSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQljb3B5TWFueVJlZmVyZW5jZShhUmVmZXJlbmNlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGFSZWZlcmVuY2UpKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBhUmVmT2JqZWN0LmVHZXQoYVJlZmVyZW5jZSk7Ci0JCQljb3B5U2luZ2xlUmVmZXJlbmNlKGFSZWZlcmVuY2UsIChFT2JqZWN0KSB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVmT2JqZWN0cyBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGUgY29weSBiYWNrIHRvIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlZk9iamVjdHMoQ29weUdyb3VwIGFHcm91cCkgewotCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKLQkJRU9iamVjdCByZWZPYmplY3Q7Ci0JCVN0cmluZyBpZFN1ZmZpeDsKLQkJaWYgKGFHcm91cC5wcmltR2V0UmVmT2JqZWN0cygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gYUdyb3VwLnByaW1HZXRSZWZPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhc3NvY2lhdGlvbiA9IChBc3NvY2lhdGlvbikgaXQubmV4dCgpOwotCQkJCXJlZk9iamVjdCA9IChFT2JqZWN0KSBhc3NvY2lhdGlvbi5nZXRLZXkoKTsKLQkJCQlpZFN1ZmZpeCA9IChTdHJpbmcpIGFzc29jaWF0aW9uLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGlkU3VmZml4ID09IG51bGwpCi0JCQkJCWlkU3VmZml4ID0gYUdyb3VwLmdldERlZmF1bHRJZFN1ZmZpeCgpOwotCQkJCWFHcm91cC5hZGRDb3BpZWQoY29udGFpbm1lbnRDb3B5KHJlZk9iamVjdCwgaWRTdWZmaXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYWxsIFJlc291cmNlcyBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4gYW5kIGFkZCB0aGUgY29weSBiYWNrIHRvIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weVJlc291cmNlcyhDb3B5R3JvdXAgYUdyb3VwKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCQlSZXNvdXJjZSByZXNvdXJjZTsKLQkJU3RyaW5nIHVyaTsKLQkJaWYgKGFHcm91cC5wcmltR2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBhR3JvdXAucHJpbUdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKLQkJCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgYXNzb2NpYXRpb24uZ2V0S2V5KCk7Ci0JCQkJdXJpID0gKFN0cmluZykgYXNzb2NpYXRpb24uZ2V0VmFsdWUoKTsKLQkJCQlSZXNvdXJjZSBjb3BpZWQgPSBjb250YWlubWVudENvcHkocmVzb3VyY2UsIHVyaSk7Ci0JCQkJY29weU1vZGlmaWNhdGlvbkZsYWcocmVzb3VyY2UsIGNvcGllZCk7Ci0JCQkJYUdyb3VwLmFkZENvcGllZChjb3BpZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIHNpbmdsZSB2YWx1ZSBhdHRyaWJ1dGUuCi0JICogCi0JICogVGVzdHM6Ci0JICogCi0JICogMS4gSWYgYW4gYXR0cmlidXRlIHR5cGUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gaXQgaXMgYW4gb2JqZWN0IHR5cGUgYW5kIGl0IG11c3QgYmUKLQkgKiBjb3BpZWQuIERvIG5vdCBjb3B5IHRoZSB2YWx1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGFuIEVudW1lcmF0aW9uIHR5cGUuIDIuIElmIGFuIGF0dHJpYnV0ZQotCSAqIHR5cGUgaXMgPGJvbGQ+bm90IDwvYm9sZD4gPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBjb3B5IHRoZSB2YWx1ZSBiZWZvcmUgc2V0dGluZyBpdCBvbgotCSAqIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgY29weVNpbmdsZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dHJpYnV0ZSwgT2JqZWN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgewotCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgPT0gbnVsbCkgewotCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgYVZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vTU9GMTA4Ci0JCQkvLyBpZiAoYXR0cmlidXRlLmlzT2JqZWN0VHlwZSgpKQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGNvbnRhaW5tZW50Q29weSgoRU9iamVjdCkgYVZhbHVlLCBpZFN1ZmZpeCkpOwotCQkJZWxzZQotCQkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVjZWl2ZXIuIElmIGEgcmVmZXJlbmNlJ3MgdmFsdWUgaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYSBzZXJpZXMgb2YgdGVzdHMgYXJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggdGhlCi0JICogY29waWVkIG9iamVjdCwgPGNvZGU+Y29weVJlZjwvY29kZT4uCi0JICogCi0JICogVGVzdHM6IDEuIElmIHRoZSByZWZlcmVuY2UgaXMgPGJvbGQ+bm90IDwvYm9sZD4gbWFueSwgbWFrZSBhIGNvcHkgb2YgdGhlIHZhbHVlIGlmIHRoZQotCSAqIHJlZmVyZW5jZSBpcyBjb21wb3NpdGUgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlIHdpdGggPGNvZGU+Y29weVJlZjwvY29kZT47IG90aGVyd2lzZSwganVzdAotCSAqIHNldCB0aGUgdmFsdWUgYXMgaXMuCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5U2luZ2xlUmVmZXJlbmNlKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJLy9FeGNlcHRpb25hbCBjYXNlOyB0aGUgcmVsYXRpb25zaGlwIGlzIG5vdCB0aGUgY29udGFpbmVyIHJlbGF0aW9uc2hpcAotCQkvL0FuZCBpcyBub3QgbmF2aWdhYmxlIGluIHRoZSBvdGhlciBkaXJlY3Rpb247IGdvIGFoZWFkIGFuZCBjb3B5Ci0JCWlmIChhVmFsdWUgIT0gYVJlZk9iamVjdC5lQ29udGFpbmVyKCkgfHwgYVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoYVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpCi0JCQkJY29weVJlZi5lU2V0KGFSZWZlcmVuY2UsIGNvbnRhaW5tZW50Q29weShhVmFsdWUsIGlkU3VmZml4KSk7Ci0JCQllbHNlCi0JCQkJYWRkRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5KGFSZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGNvcHlSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bwotCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQotCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCi0JICogCi0JICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVDb3B5KENvcHlHcm91cCBhR3JvdXApIHsKLQkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotCQl1dGlsaXR5LmNvcHkoYUdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgRU9iamVjdCBjb3B5T2JqZWN0KSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJdXRpbGl0eS5jb3B5Q3VycmVudEF0dHJpYnV0ZXMoYVJlZk9iamVjdCwgbnVsbCwgY29weU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUNvcHkoRU9iamVjdCBhUmVmT2JqZWN0KSB7Ci0JCXJldHVybiBjcmVhdGVDb3B5KGFSZWZPYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKLQkJcmV0dXJuIHV0aWxpdHkuY29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHVzaW5nIDxjb2RlPm5ld1VyaTwvY29kZT4gZm9yIHRoZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVDb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7Ci0JCXJldHVybiB1dGlsaXR5LmNvcHkoYVJlc291cmNlLCBuZXdVcmkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVEZWZlcnJlZENvcHlBY3Rpb25zKCkgewotCQlpZiAocHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5pdGVyYXRvcigpOwotCQkJRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uIGFjdGlvbjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlhY3Rpb24gPSAoRGVmZXJyZWRSZWZlcmVuY2VVdGlsaXR5QWN0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uLnBlcmZvcm1BY3Rpb24oKTsKLQkJCX0KLQkJCXByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xMy8yMDAwIDk6MTc6MzUgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuSGFzaE1hcAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBnZXRDb3BpZWRPYmplY3RzKCkgewotCQlpZiAoY29waWVkT2JqZWN0cyA9PSBudWxsKQotCQkJY29waWVkT2JqZWN0cyA9IG5ldyBIYXNoTWFwKDIwMCk7Ci0JCXJldHVybiBjb3BpZWRPYmplY3RzOwotCX0KLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBnZXRDb3BpZWRBZGFwdGVycygpIHsKLQkJaWYgKGNvcGllZEFkYXB0ZXJzID09IG51bGwpCi0JCQljb3BpZWRBZGFwdGVycyA9IG5ldyBIYXNoTWFwKDIwMCk7Ci0JCXJldHVybiBjb3BpZWRBZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weS4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJaWYgKGFuT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb3BpZWRPYmplY3RzKCkuZ2V0KGFuT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjYWNoZWQgY29weSwgaWYgbm9uZSwgcmV0dXJuIHRoZSBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb3B5SWZGb3VuZChFT2JqZWN0IGFuT2JqZWN0KSB7Ci0JCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7Ci0JCXJldHVybiBjb3BpZWQgPT0gbnVsbCA/IGFuT2JqZWN0IDogY29waWVkOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOToxMTozMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkgewotCQlpZiAoZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMgPT0gbnVsbCkKLQkJCWRlZmVycmVkUmVmZXJlbmNlQ29waWVzID0gbmV3IEFycmF5TGlzdCgxMDApOwotCQlyZXR1cm4gZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIEVPYmplY3QgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGFzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IG5ld0luc3RhbmNlKEVPYmplY3QgYVJlZk9iamVjdCkgewotCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVQYWNrYWdlIGVwa2cgPSAoRVBhY2thZ2UpIGFSZWZPYmplY3QuZUNsYXNzKCkuZUNvbnRhaW5lcigpOwotCQlFRmFjdG9yeSBmYWN0b3J5ID0gZXBrZy5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVDbGFzcyByZWZPYmogPSBhUmVmT2JqZWN0LmVDbGFzcygpOwotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGUocmVmT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2UgdGhhdCB1c2VzIHRoZSBzYW1lIFJlc291cmNlRmFjdG9yeSBhcyB0aGUgb25lIHVzZWQgYnkKLQkgKiA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+LiBJZiA8Y29kZT5uZXdVcmk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdXNlIHRoZSBVUkkKLQkgKiBmcm9tIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewotCQlpZiAoYVJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgbmV3UmVzb3VyY2U7Ci0JCVN0cmluZyBvcmlnaW5hbFVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQluZXdVcmkgPSBuZXdVcmkgPT0gbnVsbCA/IG9yaWdpbmFsVXJpIDogbmV3VXJpOwotCi0JCVJlc291cmNlLkZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKQotCQkJZmFjdG9yeSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShVUkkuY3JlYXRlVVJJKG9yaWdpbmFsVXJpKSk7Ci0JCWVsc2UKLQkJCWZhY3RvcnkgPSBhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShvcmlnaW5hbFVyaSkpOwotCi0KLQkJbmV3UmVzb3VyY2UgPSBmYWN0b3J5LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkobmV3VXJpKSk7Ci0JCXJldHVybiBuZXdSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgdGhlIGlkIGJlIGNvcGllZCBpbiB0aGUgY2FzZSB3aGVyZSBubyBzdWZmaXggaXMgc3BlY2lmaWVkPyBEZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZXNlcnZlSWRzKCkgewotCQlyZXR1cm4gcHJlc2VydmVJZHM7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBzZXQgYXR0cmlidXRlcyBhbmQgcmVmZXJlbmNlcyBiYXNlZCBvbiBjb250YWlubWVudC4gVGh1cywgaXQgd2lsbCBjb3B5IHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlLiBVc2UgdGhlIGlkU3VmZml4IHRvIGRlZmluZSB0aGUgc3VmZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKLQkgKiBJRHMgb2YgY29waWVkIG9iamVjdHMuIElmIGFuIGlkU3VmZml4IGRvZXMgbm90IGV4aXN0LCBkbyBub3Qgc2V0IGFuIGlkIG9uIHRoZSBjb3BpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7Ci0JCWlmIChhUmVmT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb3B5UmVmID0gcHJpbUNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwotCi0JCWNvcHlDdXJyZW50UmVmZXJlbmNlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCXJldHVybiBjb3B5UmVmOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlIGNvbnRhaW5tZW50Ci0JICogdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIElEcyBvZgotCSAqIGNvcGllZCBvYmplY3RzLiBJZiBhbiBpZFN1ZmZpeCBkb2VzIG5vdCBleGlzdCwgZG8gbm90IHNldCBhbiBpZCBvbiB0aGUgY29waWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewotCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVPYmplY3QgY29weVJlZiA9IG5ld0luc3RhbmNlKGFSZWZPYmplY3QpOwotCi0JCXJlY29yZENvcHkoYVJlZk9iamVjdCwgY29weVJlZik7Ci0JCWNvcHlDdXJyZW50QXR0cmlidXRlcyhhUmVmT2JqZWN0LCBpZFN1ZmZpeCwgY29weVJlZik7Ci0JCWlmIChpc0NvcHlBZGFwdGVycygpKQotCQkJY29weUFkYXB0ZXJzKGFSZWZPYmplY3QsIGNvcHlSZWYpOwotCQlyZXR1cm4gY29weVJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5QWRhcHRlcnMoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYpIHsKLQkJTGlzdCBhZGFwdGVycyA9IGFSZWZPYmplY3QuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5nZXQoaSk7Ci0JCQljb3B5QWRhcHRlcihhUmVmT2JqZWN0LCBjb3B5UmVmLCBhZGFwdGVyKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUFkYXB0ZXIoRU9iamVjdCBhUmVmT2JqZWN0LCBFT2JqZWN0IGNvcHlSZWYsIEFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgQ2xvbmVhYmxlUHVibGljKSkKLQkJCXJldHVybjsKLQkJQ2xvbmVhYmxlUHVibGljIGNvcHlBZGFwdGVyID0gKENsb25lYWJsZVB1YmxpYykgZ2V0Q29waWVkQWRhcHRlcnMoKS5nZXQoYWRhcHRlcik7Ci0JCWlmIChjb3B5QWRhcHRlciA9PSBudWxsKSB7Ci0JCQljb3B5QWRhcHRlciA9IChDbG9uZWFibGVQdWJsaWMpICgoQ2xvbmVhYmxlUHVibGljKSBhZGFwdGVyKS5jbG9uZSgpOwotCQkJZ2V0Q29waWVkQWRhcHRlcnMoKS5wdXQoYWRhcHRlciwgY29weUFkYXB0ZXIpOwotCQl9Ci0JCWlmIChjb3B5QWRhcHRlciAhPSBudWxsKQotCQkJY29weVJlZi5lQWRhcHRlcnMoKS5hZGQoY29weUFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCi0JICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCi0JICogSURzIG9mIGNvcGllZCBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBwcmltQ29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKLQkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlIGNvcHlSZXNvdXJjZSA9IG5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKLQkJY29weUV4dGVudChhUmVzb3VyY2UuZ2V0Q29udGVudHMoKSwgY29weVJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlyZXR1cm4gY29weVJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlNb2RpZmljYXRpb25GbGFnKFJlc291cmNlIGFSZXNvdXJjZSwgUmVzb3VyY2UgY29waWVkKSB7Ci0JCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQotCQkJY29waWVkLnNldE1vZGlmaWVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOToxMTozMiBBTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKSB7Ci0JCXJldHVybiBkZWZlcnJlZFJlZmVyZW5jZUNvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEVPYmplY3QgYVNvdXJjZSwgRU9iamVjdCBhQ29weSkgewotCQlnZXRDb3BpZWRPYmplY3RzKCkucHV0KGFTb3VyY2UsIGFDb3B5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvcmRDb3B5KEFkYXB0ZXIgYVNvdXJjZSwgQWRhcHRlciBhQ29weSkgewotCQlnZXRDb3BpZWRBZGFwdGVycygpLnB1dChhU291cmNlLCBhQ29weSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlkcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZXNlcnZlSWRzID0gdmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQ29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGFSZWZlcmVuY2UuaXNDaGFuZ2VhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29weUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gY29weUFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFkYXB0ZXJzIHNob3VsZCBiZSBjb3BpZWQgYXMgd2VsbC4gSW4gb3JkZXIgZm9yIGFuIGFkYXB0ZXIgdG8KLQkgKiBiZSBjb3BpZWQsIGl0IG11c3QgaW1wbGVtZW50IHRoZSB7QGxpbmsgQ2xvbmVhYmxlUHVibGljfWludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5QWRhcHRlcnMoYm9vbGVhbiBiKSB7Ci0JCWNvcHlBZGFwdGVycyA9IGI7Ci0JfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYyOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIFV0aWxpdHkgY2xhc3M7IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLQkgKi8KLQlwcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGFuZAotCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KDQpOwotCQltZXNzYWdlcy5hZGQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCXdoaWxlIChuZXN0ZWQgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKG5lc3RlZC5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIG5lc3RlZCkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQllbHNlCi0JCQkJbmVzdGVkID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzCi0JICogICAgICAgICAgICAgICAgb25lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCVN0cmluZ1tdIG1lc3NhZ2VzID0gZ2V0QWxsTWVzc2FnZXMoZXhjZXB0aW9uKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQobWVzc2FnZXNbaV0pOwotCQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGggLSAxKQotCQkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXh0ZW5kZWRFY29yZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNmOTE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwuRUFkYXB0ZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFY29yZVV0aWwgZXh0ZW5kcyBFY29yZVV0aWwgewotCXByaXZhdGUgc3RhdGljIEZpbGVOb3RGb3VuZERldGVjdG9yIEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBOQU1FX0FUVFJJQlVURV9TVFJJTkcgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGludGVyZmFjZSBGaWxlTm90Rm91bmREZXRlY3RvciB7Ci0JCWJvb2xlYW4gaXNGaWxlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlTm90Rm91bmREZXRlY3RvcihGaWxlTm90Rm91bmREZXRlY3RvciBkZXRlY3RvcikgewotCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IGRldGVjdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgZ2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IoKSB7Ci0JCWlmIChGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9PSBudWxsKSB7Ci0JCQlGSUxFX05PVF9GT1VORF9ERVRFQ1RPUiA9IG5ldyBGaWxlTm90Rm91bmREZXRlY3RvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQkJCQlpZiAoZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24od3JhcHBlZEV4KSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBGSUxFX05PVF9GT1VORF9ERVRFQ1RPUjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbihXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCkgewotCQlpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCXJldHVybiAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCk7Ci0JCX0gZWxzZSBpZiAod3JhcHBlZEV4LmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikgewotCQkJcmV0dXJuIGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKChXcmFwcGVkRXhjZXB0aW9uKSB3cmFwcGVkRXguZXhjZXB0aW9uKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJZVNldE9yQWRkKG9iaiwgZmVhdHVyZSwgdmFsdWUsIDApOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlU2V0T3JBZGQoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBuZXdJbmRleCkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAobmV3SW5kZXggPj0gMCkKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQobmV3SW5kZXgsIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQodmFsdWUpOwotCQl9IGVsc2UgewotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGVVbnNldE9yUmVtb3ZlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZS5pc01hbnkoKSkKLQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLnJlbW92ZSh2YWx1ZSk7Ci0JCWVsc2UKLQkJCW9iai5lVW5zZXQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKFVSSSBzb3VyY2VVcmksIFVSSSB0ZXN0VXJpKSB7Ci0JCS8vVE9ETyBXYWl0aW5nIG9uIG5ldyBlbWYgVVJJIEFQSQotCQlTdHJpbmdbXSBzb3VyY2VTZWdtZW50cyA9IHNvdXJjZVVyaS5zZWdtZW50cygpOwotCQlTdHJpbmdbXSB0ZXN0U2VnbWVudHMgPSB0ZXN0VXJpLnNlZ21lbnRzKCk7Ci0JCWludCBpID0gdGVzdFNlZ21lbnRzLmxlbmd0aDsKLQkJaW50IGogPSBzb3VyY2VTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChqID49IGkpIHsKLQkJCWJvb2xlYW4gdGVzdCA9IHRydWU7Ci0KLQkJCXdoaWxlICh0ZXN0ICYmIGkgPiAwKSB7Ci0JCQkJaS0tOwotCQkJCWotLTsKLQkJCQl0ZXN0ID0gdGVzdFNlZ21lbnRzW2ldLmVxdWFscyhzb3VyY2VTZWdtZW50c1tqXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGVzdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVOYW1lZEVsZW1lbnQpCi0JCQlyZXR1cm4gKChFTmFtZWRFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJTGlzdCBhbGxBdHRzID0gb2JqLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gYWxsQXR0cy5zaXplKCk7Ci0JCUVBdHRyaWJ1dGUgYXR0LCBuYW1lQXR0cmlidXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWF0dCA9IChFQXR0cmlidXRlKSBhbGxBdHRzLmdldChpKTsKLQkJCWlmIChOQU1FX0FUVFJJQlVURV9TVFJJTkcuZXF1YWxzKGF0dC5nZXROYW1lKCkpKSB7Ci0JCQkJbmFtZUF0dHJpYnV0ZSA9IGF0dDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmFtZUF0dHJpYnV0ZSAhPSBudWxsKQotCQkJcmV0dXJuIChTdHJpbmcpIG9iai5lR2V0KG5hbWVBdHRyaWJ1dGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgbmVlZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vcmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKElzTG9hZGluZ0RldGVjdG9yLklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgY3VycmVudGx5IGJlaW5nIGxvYWRlZC4gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIGZvciB0aGUKLQkgKiBJc0xvYWRpbmdEZWN0b3IgaW4gdGhlIGxpc3Qgb2YgZUFkYXB0ZXJzIG9uIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiAKLQkgKiBAc2VlIGFkZExvYWRpbmdUYWcoUmVzb3VyY2UpCi0JICogQHNlZSByZW1vdmVMb2FkaW5nVGFnKFJlc291cmNlKQotCSAqICBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFJlc291cmNlLkludGVybmFsI2lzTG9hZGluZygpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvYWRpbmcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgPyAoKFJlc291cmNlLkludGVybmFsKXJlc291cmNlKS5pc0xvYWRpbmcoKSA6IGZhbHNlOyAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlckZvckxvYWRpbmcoQWRhcHRlciB0YXJnZXRBZGFwdGVyLCBFT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlSZXNvdXJjZSByZXMgPSB0YXJnZXRPYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCB8fCBpc0xvYWRpbmcocmVzKSkKLQkJCXJldHVybiBuZXcgSXNMb2FkaW5nUHJveHlBZGFwdGVyKHRhcmdldEFkYXB0ZXIsIHRhcmdldE9iamVjdCk7Ci0JCXJldHVybiB0YXJnZXRBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmVSZWdpc3RlclBhY2thZ2UoU3RyaW5nIG5zUHJlZml4LCBFUGFja2FnZS5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleShuc1ByZWZpeCkpCi0JCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQobnNQcmVmaXgsIGRlc2NyaXB0b3IpOwotCX0KLQkvKioKLQkgICAqIFJldHVybnMgdGhlIGFkYXB0ZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIEBwYXJhbSBhbk9iamVjdCAKLQkgICAqIEBwYXJhbSBhZGFwdGVycyBsaXN0IG9mIGFkYXB0ZXJzIHRvIHNlYXJjaC4KLQkgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGFkYXB0ZXIuCi0JICAgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZnJvbSB0aGUgbGlzdCBvciBudWxsLgotCSAgICovCi0JICBwdWJsaWMgc3RhdGljIEFkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGFuT2JqZWN0LCBMaXN0IGFkYXB0ZXJzLCBPYmplY3QgdHlwZSkgewotCi0JCSAgCU9iamVjdCBbXSBhZGFwdEFycmF5ID0gKChFQWRhcHRlckxpc3QpYWRhcHRlcnMpLmRhdGEoKTsKLQkJICAJaWYgKGFkYXB0QXJyYXkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRBcnJheVtpXTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBvYmplY3QgZnJvbSBpdCdzIGNvbnRhaW5lciwgYW5kIG1ha2UgaXQgYW5kIGFsbCBpdCdzIGNoaWxkcmVuCi0JICogcHJveGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWQoRU9iamVjdCByb290KSB7Ci0JCVJlc291cmNlIHJlcyA9IHJvb3QuZVJlc291cmNlKCk7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gcm9vdC5lQ29udGFpbmVyKCk7Ci0JCS8qIE1ha2luZyBzdXJlIHRoZSBwcm94eSBpcyBjcmVhdGVkIGZpcnN0IGJlZm9yZSB1bmxvYWRpbmcgKi8KLQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByZXMgIT0gbnVsbCkKLQkJCWJlY29tZVByb3h5KHJvb3QsIHJlcyk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUocm9vdCk7Ci0JCQllbHNlIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHJvb3QuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQkJCWVVbnNldE9yUmVtb3ZlKGNvbnRhaW5lciwgZmVhdHVyZSwgcm9vdCk7Ci0JCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFR1cm5zIHRoaXMgb2JqZWN0IGFuZCBhbGwgaXQncyBjaGlsZHJlbiB0byBwcm94aWVzLCBhbmQgcmVtb3ZlcyBhZGFwdGVycyBwcmVjb25kaXRpb246IFRoZQotCSAqIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gaXQncyBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmVjb21lUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJZG9CZWNvbWVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKLQkJfQotCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvQmVjb21lUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgewotCQlTdHJpbmcgaWQgPSByZXMuZ2V0VVJJRnJhZ21lbnQocCk7Ci0JCXAuZVNldFByb3h5VVJJKHJlcy5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCxudWxsKTsKLQkJfQotCQlwLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb3h5KEVPYmplY3Qgcm9vdCwgUmVzb3VyY2UgcmVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByb290LmVBbGxDb250ZW50cygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWRvUmVtb3ZlUHJveHkoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCksIHJlcyk7Ci0JCX0KLQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSByb290LCByZXMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkb1JlbW92ZVByb3h5KEludGVybmFsRU9iamVjdCBwLCBSZXNvdXJjZSByZXMpIHsKLQkJU3RyaW5nIGlkID0gcC5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKLQkJCSgoWE1MUmVzb3VyY2UpIHJlcykuc2V0SUQocCwgaWQpOwotCQl9Ci0JCXAuZVNldFByb3h5VVJJKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGUgcGFzc2VkIG9iamVjdCBpcyBub3QgYSBwcm94eTsgaWYgaXQgaXMsIHRocm93cyBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgYmFkCi0JICogSFJFRi4gSWYgdGhlIG9iamVjdCBpcyBudWxsLCBkb2VzIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEB0aHJvd3MgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUHJveHkoRU9iamVjdCBvYmplY3QpIHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgIW9iamVjdC5lSXNQcm94eSgpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbXNnID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkRBTkdMSU5HX0hSRUZfRVJST1JfLCBuZXcgT2JqZWN0W117KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCkuZVByb3h5VVJJKCl9KTsKLQkJdGhyb3cgbmV3IERhbmdsaW5nSFJFRkV4Y2VwdGlvbihtc2cpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIG8xIGFuZCBvMiBhcmUgbm90IHRoZSBzYW1lIHZhbHVlcy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhhdAotCSAqIGVpdGhlciBwYXJhbWV0ZXIgY2FuIGJlIG51bGwuCi0JICogCi0JICogQHBhcmFtIG8xCi0JICogQHBhcmFtIG8yCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIChvMSA9PSBudWxsIF4gbzIgPT0gbnVsbCkgfHwgKG8xID09IG51bGwgfHwgIW8xLmVxdWFscyhvMikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjVhMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uCi0JICovCi0JcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmE2ODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgMjo0Njo1NCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciB7Ci0Jc3RhdGljIGZpbmFsIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBERUZBVUxUID0gbmV3IERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIENvbnZlcnQKLQkgKiAKLQkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCi0JICogQGFGZWF0dXJlLgotCSAqLwotCU9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4MTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgSm9obiBNb3VycmEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZCB7Ci0KLQkvKgotCSAqIFRoaXMgd2lsbCBjb250YWluIHRoZSBtdWx0aS1zZWxlY3Rpb24gb2Ygb2JqZWN0cyB0byBkZXBsb3kuIFRoaXMgc2VsZWN0aW9uIGNvdWxkIGJlIHVzZWQgdG8KLQkgKiBmaWx0ZXIgZWxlbWVudHMgd2l0aGluIGEgTW9kdWxlLiBBbnkgb3RoZXIgc2V0dXAgY29kZSBzaG91bGQgYmUgZG9uZSBoZXJlLi4uCi0JICovCi0Jdm9pZCBpbml0KE9iamVjdFtdIHNlbGVjdGlvbik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZSByZXNvdXJjZSwgSVJlc291cmNlRGVsdGEgZGVsdGEsIElDb21tYW5kQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lDb21tYW5kQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQyNzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBKb2huIE1vdXJyYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kQ29udGV4dCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODg5ODZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSURVdGlsIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgdG8gYXNzaWduIGEgdW5pcXVlIElEIHRvIHRoZSBvYmplY3QuIFRoZSBvYmplY3QgbXVzdCBiZSBjb250YWluZWQgaW4gYQotCSAqIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCWFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3JBc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKLQkJCXJldHVybiBnZXRPckFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPckFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJU3RyaW5nIGlkID0gYVJlc291cmNlLmdldElEKG9iamVjdCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGFzc2lnbklEKG9iamVjdCwgYVJlc291cmNlKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRCYXNlSURGb3JBc3NpZ25tZW50KG9iamVjdCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGlkID0gZW5zdXJlVW5pcXVlSUQoYVJlc291cmNlLCBuYW1lKTsKLQkJYVJlc291cmNlLnNldElEKG9iamVjdCwgaWQpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZW5zdXJlVW5pcXVlSUQoWE1MUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgYmFzZUlETmFtZSkgewotCQliYXNlSUROYW1lICs9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQkvL0NoYW5nZSB0byB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkIG9mIGluY3JlbWVudGFsIG51bWJlcnMgdG8gaGVscAotCQkvL3N1cHBvcnQgdGVhbSBkZXZlbG9wbWVudC4KLQkJbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlTdHJpbmcgaWQgPSBiYXNlSUROYW1lICsgY3VycmVudFRpbWU7Ci0JCXdoaWxlIChhUmVzb3VyY2UuZ2V0RU9iamVjdChpZCkgIT0gbnVsbCkgewotCQkJKytjdXJyZW50VGltZTsKLQkJCWlkID0gYmFzZUlETmFtZSArIGN1cnJlbnRUaW1lOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlSURGb3JBc3NpZ25tZW50KEVPYmplY3Qgb2JqZWN0KSB7Ci0JCUVDbGFzcyBtZXRhTyA9IG9iamVjdC5lQ2xhc3MoKTsKLQkJcmV0dXJuIG1ldGFPLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmNTEzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTY4MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vc2VyRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4ODJkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24gewotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QxMTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIElzTG9hZGluZ0RldGVjdG9yIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJc0xvYWRpbmdEZXRlY3RvciBJTlNUQU5DRSA9IG5ldyBJc0xvYWRpbmdEZXRlY3RvcigpOwotCi0JcHJpdmF0ZSBJc0xvYWRpbmdEZXRlY3RvcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQl9Ci0KLQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0aGlzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nUHJveHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWI4NjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ1Byb3h5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIElzTG9hZGluZ1Byb3h5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgQWRhcHRlciB0YXJnZXRBZGFwdGVyOwotCXByaXZhdGUgRU9iamVjdCB0YXJnZXRPYmplY3Q7Ci0KLQlwdWJsaWMgSXNMb2FkaW5nUHJveHlBZGFwdGVyKEFkYXB0ZXIgYVRhcmdldEFkYXB0ZXIsIEVPYmplY3QgYVRhcmdldE9iamVjdCkgewotCQl0YXJnZXRBZGFwdGVyID0gYVRhcmdldEFkYXB0ZXI7Ci0JCXRhcmdldE9iamVjdCA9IGFUYXJnZXRPYmplY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy9saXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCAmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCXJlbW92ZVByb3h5U3VwcG9ydCgpOwotCQkJCXJlc2V0KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2FjaGVSZXNvdXJjZSgpKSB7Ci0JCQl0YXJnZXRBZGFwdGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgcmVzb3VyY2UgdmFyaWFibGUgYW5kIHJldHVybiB0cnVlIGlmIHdlIHJlbW92ZWQgdGhlIHByb3h5IHN1cHBvcnQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhY2hlUmVzb3VyY2UoKSB7Ci0JCWlmIChnZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZ2V0VGFyZ2V0KCk7Ci0JCQlyZXNvdXJjZSA9IGVPYmouZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWVPYmouZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5pc0xvYWRpbmcocmVzb3VyY2UpKQotCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXRhcmdldE9iamVjdC5lQWRhcHRlcnMoKS5hZGQodGFyZ2V0QWRhcHRlcik7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVQcm94eVN1cHBvcnQoKSB7Ci0JCWdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJdGFyZ2V0T2JqZWN0LmVBZGFwdGVycygpLmFkZCh0YXJnZXRBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCXJlc291cmNlID0gbnVsbDsKLQkJdGFyZ2V0QWRhcHRlciA9IG51bGw7Ci0JCXRhcmdldE9iamVjdCA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNGE3MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKiAgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2UgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JcHJvdGVjdGVkIFN0cmluZyBuc1VSSTsKLQotCi0JcHVibGljIE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5zVVJJID0gdXJpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TnNVUkkoKSB7Ci0JCXJldHVybiBuc1VSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROc1VSSShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5zVVJJID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgc3RyaW5nKSB7Ci0JCXByZWZpeCA9IHN0cmluZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGFjNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MgdXNlZCB0byBob2xkIG5hbWVzcGFjZXMgcGFyc2VkIGZyb20gYW4gWE1MIGZpbGUgdXNpbmcgdGhlIHhtbG5zOnByZWZpeD0iYVVSSSIKLSAqIHN5bnRheAotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ2xvbmVhYmxlUHVibGljIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfVFlQRSA9IE5hbWVzcGFjZUFkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCXByb3RlY3RlZCBNYXAgcHJlZml4ZXNUb05TOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZXM7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBOT1RJRklDQVRJT05fRkVBVFVSRSA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsKCkgewotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGV2ZW50VHlwZQotCQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkJICogQHBhcmFtIG5ld1ZhbHVlCi0JCSAqLwotCQlwdWJsaWMgTm90aWZpY2F0aW9uKGludCBldmVudFR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcihldmVudFR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXRGZWF0dXJlKCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBOT1RJRklDQVRJT05fRkVBVFVSRTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBOYW1lc3BhY2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOwotCX0KLQotCS8qKgotCSAqIEZhY2FkZSBtZXRob2QgZm9yIHJlc29sdmluZyBwcmVmaXhlcyB0byBhbiBhY3R1YWwgbmFtZXNwYWNlIFVSSS4gVXNlZCBmb3Igb2JqZWN0cyBjb250YWluZWQKLQkgKiBieSBpbnN0YW5jZXMgb2Yge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlfS4gV2Fsa3MgdXAgdGhlIG9iamVjdAotCSAqIGNvbnRhaW5tZW50IHBhdGggdW50aWwgYSBuYW1lc3BhY2UgaXMgZm91bmQsIG9yIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgewotCQlpZiAocHJlZml4ID09IG51bGwgfHwgb2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRU9iamVjdCBjb250YWluZXIgPSBvYmo7Ci0JCVN0cmluZyBuc1VSSTsKLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQluc1VSSSA9IGdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgY29udGFpbmVyKTsKLQkJCWlmIChuc1VSSSAhPSBudWxsKQotCQkJCXJldHVybiBuc1VSSTsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwoU3RyaW5nIHByZWZpeCwgRU9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TmFtZXNwYWNlcyhFT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKLQkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKE5hbWVzcGFjZUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIob2JqLCBBREFQVEVSX1RZUEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKG9iaik7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKG9iaikgOiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTmFtZXNwYWNlQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBOYW1lc3BhY2VBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuc2V0VGFyZ2V0KG9iaik7Ci0JCW9iai5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotCQlpZiAobmFtZXNwYWNlcyA9PSBudWxsKQotCQkJbmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcHJlZml4ZXNUb05TID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcmVmaXhlc1RvTlMucHV0KHByZWZpeCwgbnMpOwotCQluYW1lc3BhY2VzLmFkZChucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLkFERCwgbnVsbCwgbnMpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsKLQkJTmFtZXNwYWNlIG5zID0gbnVsbDsKLQkJaWYgKHByZWZpeGVzVG9OUyAhPSBudWxsKQotCQkJbnMgPSAoTmFtZXNwYWNlKSBwcmVmaXhlc1RvTlMuZ2V0KHByZWZpeCk7Ci0KLQkJaWYgKG5zICE9IG51bGwpCi0JCQluYW1lc3BhY2VzLnJlbW92ZShucyk7Ci0JCWZpcmVOb3RpZmljYXRpb24ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLlJFTU9WRSwgbnMsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeGVzVG9OUyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5hbWVzcGFjZSBucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKLQkJaWYgKG5zICE9IG51bGwpCi0JCQlyZXR1cm4gbnMuZ2V0TnNVUkkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuYW1lc3BhY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm90aWZpY2F0aW9uKGludCB0eXBlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQl0YXJnZXQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uKHR5cGUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5DbG9uZWFibGVQdWJsaWMjY2xvbmUoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCU5hbWVzcGFjZUFkYXB0ZXIgcmVzdWx0ID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJaWYgKGhhc05hbWVzcGFjZXMoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgbmFtZXNwYWNlcy5nZXQoaSk7Ci0JCQkJcmVzdWx0LmFkZE5hbWVzcGFjZShucy5nZXRQcmVmaXgoKSwgbnMuZ2V0TnNVUkkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3RocnVFbmNvZGVyRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg0MDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQSBwYXNzdGhydSBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUGFzc3RocnVFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhc3N0aHJ1RW5jb2RlckRlY29kZXIgSU5TVEFOQ0UgPSBuZXcgUGFzc3RocnVFbmNvZGVyRGVjb2RlcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQYXNzdGhydUVuY29kZXJEZWNvZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNzE1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFBhc3N3b3JkQ2lwaGVyVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW10gPSB7InhvciJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXNbXTsKLQotCXB1YmxpYyBQYXNzd29yZENpcGhlclV0aWwoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZGVjaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBieXRlW10gZW5jaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCi0JCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGFieXRlMSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOwotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpIHsKLQkJcmV0dXJuIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHhvcihieXRlIGFieXRlMFtdKSB7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpIHsKLQkJCWFieXRlMSA9IG5ldyBieXRlW2FieXRlMC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhYnl0ZTAubGVuZ3RoOyBpKyspCi0JCQkJYWJ5dGUxW2ldID0gKGJ5dGUpICgweDVmIF4gYWJ5dGUwW2ldKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXN0YXRpYyB7Ci0JCV9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPSBudWxsOwotCQlpZiAoX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9PSBudWxsKQotCQkJX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9IERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MmNlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBQYXNzd29yZEVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJwYXNzd29yZC1zZWN1cml0eS1jb2RlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQYXNzd29yZEVuY29kZXJEZWNvZGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBQYXNzd29yZFV0aWwucGFzc3dvcmREZWNvZGUocyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFBhc3N3b3JkVXRpbC5wYXNzd29yZEVuY29kZShzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIEtFWTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJmMmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUGFzc3dvcmRVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ09OVkVSU0lPTl9DT0RFID0gIlVURjgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFX0FSUkFZID0gbmV3IGJ5dGVbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEJBU0U2NF9FTkNPREVfTUFQW107Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCQVNFNjRfREVDT0RFX01BUFtdOwotCi0JcHVibGljIFBhc3N3b3JkVXRpbCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gewotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7Ci0JCVN0cmluZyBzMSA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMxID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKLQotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7Ci0KLQkJU3RyaW5nIHMyID0gZGVjb2RlX3Bhc3N3b3JkKHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhzKSwgczEpOwotCQlpZiAoczIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gczI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVuY29kZShzLCBERUZBVUxUX0NSWVBUT19BTEdPUklUSE0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcywgU3RyaW5nIHMxKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOwotCQlpZiAocyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGdldENyeXB0b0FsZ29yaXRobShzKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uKCk7Ci0KLQkJU3RyaW5nIHMyID0gZW5jb2RlX3Bhc3N3b3JkKHMudHJpbSgpLCBzMS50cmltKCkpOwotCQlpZiAoczIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gczI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3J5cHRvQWxnb3JpdGhtKFN0cmluZyBzKSB7Ci0JCVN0cmluZyBzMSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMgPSBzLnRyaW0oKTsKLQkJCWlmIChzLmxlbmd0aCgpID49IDIpIHsKLQkJCQlpbnQgaSA9IHMuaW5kZXhPZigieyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlpbnQgaiA9IHMuaW5kZXhPZigifSIsICsraSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGogPiAwKQotCQkJCQkJaWYgKGkgPCBqKQotCQkJCQkJCXMxID0gcy5zdWJzdHJpbmcoaSwgaikudHJpbSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXMxID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3J5cHRvQWxnb3JpdGhtVGFnKFN0cmluZyBzKSB7Ci0JCVN0cmluZyBzMSA9IG51bGw7Ci0JCVN0cmluZyBzMiA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKLQkJaWYgKHMyICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXMxID0gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKFN0cmluZyBzKSB7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCXMgPSBzLnRyaW0oKTsKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNUy5sZW5ndGg7IGkrKykKLQkJCQlpZiAocy5lcXVhbHNJZ25vcmVDYXNlKFNVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1tpXSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlyZXR1cm4gaXNWYWxpZENyeXB0b0FsZ29yaXRobShnZXRDcnlwdG9BbGdvcml0aG0ocykpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRGVjb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMxID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczEgPT0gbnVsbCkKLQkJCXJldHVybiBzOwotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZWNvZGVfcGFzc3dvcmQocmVtb3ZlQ3J5cHRvQWxnb3JpdGhtVGFnKHMpLCBzMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHBhc3N3b3JkRW5jb2RlKHMsIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzc3dvcmRFbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlpZiAoIWlzVmFsaWRDcnlwdG9BbGdvcml0aG0oczEpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHMyID0gZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpOwotCQlpZiAoczIgIT0gbnVsbCkgewotCQkJaWYgKHMyLmVxdWFsc0lnbm9yZUNhc2UoczEudHJpbSgpKSkKLQkJCQlyZXR1cm4gcy50cmltKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jb2RlX3Bhc3N3b3JkKHMudHJpbSgpLCBzMS50cmltKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgewotCQlTdHJpbmcgczEgPSBudWxsOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlzID0gcy50cmltKCk7Ci0JCQlpZiAocy5sZW5ndGgoKSA+PSAyKSB7Ci0JCQkJaW50IGkgPSBzLmluZGV4T2YoInsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IDApIHsKLQkJCQkJaW50IGogPSBzLmluZGV4T2YoIn0iLCArK2kpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChqID4gMCkKLQkJCQkJCWlmICgrK2ogPCBzLmxlbmd0aCgpKQotCQkJCQkJCXMxID0gcy5zdWJzdHJpbmcoaikudHJpbSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXMxID0gRU1QVFlfU1RSSU5HOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gczE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbnZlcnRfdG9fYnl0ZXMoU3RyaW5nIHMpIHsKLQkJYnl0ZSBhYnl0ZTBbXSA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlpZiAocy5sZW5ndGgoKSA9PSAwKQotCQkJCWFieXRlMCA9IEVNUFRZX0JZVEVfQVJSQVk7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJYWJ5dGUwID0gcy5nZXRCeXRlcyhTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJYWJ5dGUwID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBhYnl0ZTA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRfdG9fc3RyaW5nKGJ5dGUgYWJ5dGUwW10pIHsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQlpZiAoYWJ5dGUwICE9IG51bGwpCi0JCQlpZiAoYWJ5dGUwLmxlbmd0aCA9PSAwKQotCQkJCXMgPSBFTVBUWV9TVFJJTkc7Ci0JCQllbHNlCi0JCQkJdHJ5IHsKLQkJCQkJcyA9IG5ldyBTdHJpbmcoYWJ5dGUwLCBTVFJJTkdfQ09OVkVSU0lPTl9DT0RFKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVuc3VwcG9ydGVkZW5jb2RpbmdleGNlcHRpb24pIHsKLQkJCQkJcyA9IG51bGw7Ci0JCQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29udmVydF92aWV3YWJsZV90b19ieXRlcyhTdHJpbmcgcykgewotCQlieXRlIGFieXRlMFtdID0gbnVsbDsKLQkJaWYgKHMgIT0gbnVsbCkKLQkJCWlmIChzLmxlbmd0aCgpID09IDApCi0JCQkJYWJ5dGUwID0gRU1QVFlfQllURV9BUlJBWTsKLQkJCWVsc2UKLQkJCQl0cnkgewotCQkJCQlhYnl0ZTAgPSBiYXNlNjREZWNvZGUoY29udmVydF90b19ieXRlcyhzKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlhYnl0ZTAgPSBudWxsOwotCQkJCX0KLQkJcmV0dXJuIGFieXRlMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYmFzZTY0RGVjb2RlKGJ5dGUgYWJ5dGUwW10pIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IGFieXRlMC5sZW5ndGg7IGFieXRlMFstLWldID09IDYxOyk7Ci0JCWJ5dGUgYWJ5dGUxW10gPSBuZXcgYnl0ZVsoaSArIDEpIC0gYWJ5dGUwLmxlbmd0aCAvIDRdOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGFieXRlMC5sZW5ndGg7IGorKykKLQkJCWFieXRlMFtqXSA9IEJBU0U2NF9ERUNPREVfTUFQW2FieXRlMFtqXV07Ci0JCWludCBrID0gYWJ5dGUxLmxlbmd0aCAtIDI7Ci0JCWludCBsID0gMDsKLQkJaW50IGkxOwotCQlmb3IgKGkxID0gMDsgbCA8IGs7IGkxICs9IDQpIHsKLQkJCWFieXRlMVtsXSA9IChieXRlKSAoYWJ5dGUwW2kxXSA8PCAyICYgMHhmZiB8IGFieXRlMFtpMSArIDFdID4+PiA0ICYgMHgzKTsKLQkJCWFieXRlMVtsICsgMV0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDFdIDw8IDQgJiAweGZmIHwgYWJ5dGUwW2kxICsgMl0gPj4+IDIgJiAweGYpOwotCQkJYWJ5dGUxW2wgKyAyXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMl0gPDwgNiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAzXSAmIDB4M2YpOwotCQkJbCArPSAzOwotCQl9Ci0JCWlmIChsIDwgYWJ5dGUxLmxlbmd0aCkgewotCQkJYWJ5dGUxW2wrK10gPSAoYnl0ZSkgKGFieXRlMFtpMV0gPDwgMiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAxXSA+Pj4gNCAmIDB4Myk7Ci0JCQlpZiAobCA8IGFieXRlMS5sZW5ndGgpCi0JCQkJYWJ5dGUxW2xdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAxXSA8PCA0ICYgMHhmZiB8IGFieXRlMFtpMSArIDJdID4+PiAyICYgMHhmKTsKLQkJfQotCQlyZXR1cm4gYWJ5dGUxOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0X3ZpZXdhYmxlX3RvX3N0cmluZyhieXRlIGFieXRlMFtdKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKGFieXRlMCAhPSBudWxsKQotCQkJaWYgKGFieXRlMC5sZW5ndGggPT0gMCkKLQkJCQlzID0gRU1QVFlfU1RSSU5HOwotCQkJZWxzZQotCQkJCXRyeSB7Ci0JCQkJCXMgPSBjb252ZXJ0X3RvX3N0cmluZyhiYXNlNjRFbmNvZGUoYWJ5dGUwKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlzID0gbnVsbDsKLQkJCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiYXNlNjRFbmNvZGUoYnl0ZSBhYnl0ZTBbXSkgewotCQlieXRlIGFieXRlMVtdID0gbmV3IGJ5dGVbKChhYnl0ZTAubGVuZ3RoICsgMikgLyAzKSAqIDRdOwotCQlpbnQgaSA9IDA7Ci0JCWludCBqID0gMDsKLQkJZm9yICg7IGkgPCBhYnl0ZTAubGVuZ3RoIC0gMjsgaSArPSAzKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdID4+PiA0ICYgMHhmIHwgYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKLQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAyXSA+Pj4gNiAmIDB4MyB8IGFieXRlMFtpICsgMV0gPDwgMiAmIDB4M2ZdOwotCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDJdICYgMHgzZl07Ci0JCX0KLQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoKSB7Ci0JCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpXSA+Pj4gMiAmIDB4M2ZdOwotCQkJaWYgKGkgPCBhYnl0ZTAubGVuZ3RoIC0gMSkgewotCQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAxXSA+Pj4gNCAmIDB4ZiB8IGFieXRlMFtpXSA8PCA0ICYgMHgzZl07Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaSArIDFdIDw8IDIgJiAweDNmXTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOwotCQkJfQotCQl9Ci0JCWZvciAoOyBqIDwgYWJ5dGUxLmxlbmd0aDsgaisrKQotCQkJYWJ5dGUxW2pdID0gNjE7Ci0JCXJldHVybiBhYnl0ZTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZV9wYXNzd29yZChTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJpbmdidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3ZpZXdhYmxlX3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKGFieXRlMC5sZW5ndGggPiAwKSB7Ci0JCQkJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYWJ5dGUxID0gUGFzc3dvcmRDaXBoZXJVdGlsLmRlY2lwaGVyKGFieXRlMCwgczEpOwotCQkJCQl9IGNhdGNoIChJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gaW52YWxpZHBhc3N3b3JkY2lwaGVyZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24gdW5zdXBwb3J0ZWRjcnlwdG9hbGdvcml0aG1leGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChhYnl0ZTEgIT0gbnVsbCAmJiBhYnl0ZTEubGVuZ3RoID4gMCkKLQkJCQkJCXMyID0gY29udmVydF90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoczIgIT0gbnVsbCAmJiBzMi5sZW5ndGgoKSA+IDApCi0JCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMik7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVfcGFzc3dvcmQoU3RyaW5nIHMsIFN0cmluZyBzMSkgewotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzMS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKHMpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMxKS5hcHBlbmQoIn0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHMyID0gbnVsbDsKLQkJCWlmIChzLmxlbmd0aCgpID4gMCkgewotCQkJCWJ5dGUgYWJ5dGUwW10gPSBjb252ZXJ0X3RvX2J5dGVzKHMpOwotCQkJCWlmIChhYnl0ZTAubGVuZ3RoID4gMCkgewotCQkJCQlieXRlIGFieXRlMVtdID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFieXRlMSA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5lbmNpcGhlcihhYnl0ZTAsIHMxKTsKLQkJCQkJfSBjYXRjaCAoSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGludmFsaWRwYXNzd29yZGNpcGhlcmV4Y2VwdGlvbikgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHVuc3VwcG9ydGVkY3J5cHRvYWxnb3JpdGhtZXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoYWJ5dGUxICE9IG51bGwgJiYgYWJ5dGUxLmxlbmd0aCA+IDApIHsKLQkJCQkJCXMyID0gY29udmVydF92aWV3YWJsZV90b19zdHJpbmcoYWJ5dGUxKTsKLQkJCQkJCWlmIChzMiA9PSBudWxsKQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHMyICE9IG51bGwgJiYgczIubGVuZ3RoKCkgPiAwKQotCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgewotCQlTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVMgPSBQYXNzd29yZENpcGhlclV0aWwuZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpOwotCQlERUZBVUxUX0NSWVBUT19BTEdPUklUSE0gPSBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbMF07Ci0JCWJ5dGUgYWJ5dGUwW10gPSB7NjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQzLCA0N307Ci0JCUJBU0U2NF9FTkNPREVfTUFQID0gYWJ5dGUwOwotCQlCQVNFNjRfREVDT0RFX01BUCA9IG5ldyBieXRlWzEyOF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgQkFTRTY0X0RFQ09ERV9NQVAubGVuZ3RoOyBpKyspCi0JCQlCQVNFNjRfREVDT0RFX01BUFtpXSA9IC0xOwotCQlmb3IgKGludCBqID0gMDsgaiA8IEJBU0U2NF9FTkNPREVfTUFQLmxlbmd0aDsgaisrKQotCQkJQkFTRTY0X0RFQ09ERV9NQVBbQkFTRTY0X0VOQ09ERV9NQVBbal1dID0gKGJ5dGUpIGo7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTQ4ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1BsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0KLQkvL1RPRE8gRGVsZXRlIG1lCi0JcHVibGljIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yKCkgewotCQlzdXBlcihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZmNjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgTWFwIEdMT0JBTF9ERVBFTkRFTkNJRVMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9ERVBFTkRFTkNZX1RZUEUgPSAiUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTWFwIGxvY2FsRGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCWNsYXNzIFJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCVJlc291cmNlIGRlcGVuZGVudFJlc291cmNlOwotCi0JCVJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2UgYURlcGVuZGVudFJlc291cmNlKSB7Ci0JCQlkZXBlbmRlbnRSZXNvdXJjZSA9IGFEZXBlbmRlbnRSZXNvdXJjZTsKLQkJCWRlcGVuZGVudFJlc291cmNlLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfREVQRU5ERU5DWV9UWVBFLmVxdWFscyh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJLy9MaXN0ZW4gZm9yIHVubG9hZHMgYW5kIHJlbW92ZXMKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgewotCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSAhPSBkZXBlbmRlbnRSZXNvdXJjZSAmJiBtc2cuZ2V0T2xkQm9vbGVhblZhbHVlKCkgJiYgIW1zZy5nZXROZXdCb29sZWFuVmFsdWUoKSkKLQkJCQkJCWRlcGVuZGVudFJlc291cmNlLnVubG9hZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19SRVNPVVJDRV9TRVQgOgotCQkJCQlpZiAobXNnLmdldE9sZFZhbHVlKCkgIT0gbnVsbCAmJiBtc2cuZ2V0TmV3VmFsdWUoKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gZGVwZW5kZW50UmVzb3VyY2UpCi0JCQkJCQkJKChSZXNvdXJjZSkgZ2V0VGFyZ2V0KCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCVJlc291cmNlU2V0IHNldCA9IGRlcGVuZGVudFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJCQkJaWYgKHNldCAhPSBudWxsKQotCQkJCQkJCQlzZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlcGVuZGVudFJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKQotCQkJCXByb2NjZXNzQWRkZWRSZXNvdXJjZSgoUmVzb3VyY2VTZXQpIG1zZy5nZXROb3RpZmllcigpLCAoUmVzb3VyY2UpIG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBVUklzLiBUaGUgZmlyc3QgcGFyYW1ldGVyLCBhVVJJU3RyaW5nLCBpcyB0aGUgb25lIHRoYXQKLQkgKiBkZXBlbmRlbnRVcmlTdHJpbmcgZGVwZW5kcyBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYVVyaVN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXBlbmRlbnRVcmlTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJEZXBlbmRlbmN5KFVSSSB0YXJnZXRVUkksIFVSSSBkZXBlbmRlbnRVUkkpIHsKLQkJaWYgKHRhcmdldFVSSSAhPSBudWxsICYmIGRlcGVuZGVudFVSSSAhPSBudWxsKSB7Ci0JCQlHTE9CQUxfREVQRU5ERU5DSUVTLnB1dChkZXBlbmRlbnRVUkksIHRhcmdldFVSSSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCWluaXRpYWxpemUoYVJlc291cmNlU2V0KTsKLQl9Ci0KLQotCVJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBSZXNvdXJjZVNldCBjYW5ub3QgYmUgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoYVJlc291cmNlU2V0KTsKLQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcnMoYVJlc291cmNlU2V0KTsKLQkJc2V0dXBSZXNvdXJjZVNldExpc3RlbmVyKGFSZXNvdXJjZVNldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFSZXNvdXJjZVNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwUmVzb3VyY2VTZXRMaXN0ZW5lcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKLQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLmFkZChuZXcgUmVzb3VyY2VTZXRMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYVJlc291cmNlU2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXJzKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlpZiAoIWFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gbG9jYWxEZXBlbmRlbmNpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQkJTWFwLkVudHJ5IGVudHJ5OwotCQkJVVJJIGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCWRlcGVuZGVudFVSSSA9IChVUkkpIGVudHJ5LmdldEtleSgpOwotCQkJCXRhcmdldFVSSSA9IChVUkkpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihhUmVzb3VyY2VTZXQsIGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKiBAcGFyYW0gZGVwZW5kZW50VVJJCi0JICogQHBhcmFtIHRhcmdldFVSSQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgVVJJIGRlcGVuZGVudFVSSSwgVVJJIHRhcmdldFVSSSkgewotCQlSZXNvdXJjZSBkZXBlbmRlbnQgPSBhUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZGVwZW5kZW50VVJJLCBmYWxzZSk7Ci0JCWlmIChkZXBlbmRlbnQgIT0gbnVsbCkKLQkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoZGVwZW5kZW50LCB0YXJnZXRVUkksIGFSZXNvdXJjZVNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZSBkZXBlbmRlbnQsIFVSSSB0YXJnZXRVUkksIFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgewotCQlSZXNvdXJjZSB0YXJnZXQgPSBhUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodGFyZ2V0VVJJLCBmYWxzZSk7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXRhcmdldCA9IGFSZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh0YXJnZXRVUkkpOwotCQl0YXJnZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyKGRlcGVuZGVudCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7Ci0JCVVSSUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBhUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCWluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTG9jYWxEZXBlbmRlbmNpZXMoVVJJQ29udmVydGVyIGFDb252ZXJ0ZXIpIHsKLQkJSXRlcmF0b3IgaXQgPSBHTE9CQUxfREVQRU5ERU5DSUVTLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwIHJlc29sdmVkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlVUkkga2V5LCB2YWx1ZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlrZXkgPSAoVVJJKSBlbnRyeS5nZXRLZXkoKTsKLQkJCXZhbHVlID0gKFVSSSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWtleSA9IG5vcm1hbGl6ZShrZXksIGFDb252ZXJ0ZXIsIHJlc29sdmVkKTsKLQkJCXZhbHVlID0gbm9ybWFsaXplKHZhbHVlLCBhQ29udmVydGVyLCByZXNvbHZlZCk7Ci0JCQlsb2NhbERlcGVuZGVuY2llcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVsYXRpdmVVUkkKLQkgKiBAcGFyYW0gY29udmVydGVyCi0JICogQHBhcmFtIHJlc29sdmVkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9ybWFsaXplKFVSSSByZWxhdGl2ZVVSSSwgVVJJQ29udmVydGVyIGNvbnZlcnRlciwgTWFwIHJlc29sdmVkKSB7Ci0JCVVSSSByZXN1bHQgPSAoVVJJKSByZXNvbHZlZC5nZXQocmVsYXRpdmVVUkkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbnZlcnRlci5ub3JtYWxpemUocmVsYXRpdmVVUkkpOwotCQkJcmVzb2x2ZWQucHV0KHJlbGF0aXZlVVJJLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNldAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2NjZXNzQWRkZWRSZXNvdXJjZShSZXNvdXJjZVNldCBzZXQsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVVSSSB0YXJnZXRVUkkgPSAoVVJJKSBsb2NhbERlcGVuZGVuY2llcy5nZXQocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQlpZiAodGFyZ2V0VVJJICE9IG51bGwpCi0JCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKHJlc291cmNlLCB0YXJnZXRVUkksIHNldCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMWYzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1MgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3M7Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGZpbmRBZGFwdGVyKFJlc291cmNlIGFSZXNvdXJjZSkgewotICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgYVJlc291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFN5bmNocm9uaXplIG9uIHRoZSBSZXNvdXJjZSAod2hpY2ggd2lsbCBiZSB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgKiB0aGUgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMpLgotICAgICAgICAgKiAKLSAgICAgICAgICogcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHdpbGwgY29vcmRpbmF0ZSB3aXRoIHRoaXMgCi0gICAgICAgICAqIHN5bmNocm9uaXphdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAoYVJlc291cmNlKSB7Ci0gICAgICAgICAgICBhZGFwdGVyID0gKFJlc291cmNlSXNMb2FkaW5nQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoYVJlc291cmNlLmVBZGFwdGVycygpLCBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhZGFwdGVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQotICAgICAgICBpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgotICAgICAgICAgICAgaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBub3RpZmljYXRpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXRMb2FkZWRSZXNvdXJjZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgbm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpIHsKLQotICAgICAgICAvKiBTeW5jaHJvbml6ZSBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBBZGFwdGVyLiBJZiAKLSAgICAgICAgICogdGhlIGxpc3Qgb2YgYWRhcHRlcnMgaXMgc2VhcmNoZWQgZm9yIGEgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciB1c2luZyB0aGUgCi0gICAgICAgICAqIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcigpIEFQSSwgdGhlbgotICAgICAgICAgKiB0aGUgYWNjZXNzIHRvIHJlbW92ZSB0aGUgQWRhcHRlciB1c2luZyB0aGlzIG1ldGhvZCAKLSAgICAgICAgICogd2lsbCBiZSBjb29yZGluYXRlZC4gIAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGdldFRhcmdldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgU3luY2hyb25pemluZyBvbiAiICsgZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChnZXRUYXJnZXQoKSkgewotICAgICAgICAgICAgICAgIGdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotICAgICAgICByZXR1cm4gdHlwZSA9PSBSRVNPVVJDRV9JU19MT0FESU5HX0FEQVBURVJfQ0xBU1M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgewotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5OWY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNjdkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIFJldmlzaXQgewotCi0JLyoqCi0JICogUmV2aXNpdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXZpc2l0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpc2l0KCkgewotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuQ29tbWVudCgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdG9EbygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmYWN0b3IoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZURlcHJlY2F0ZWRNZXRob2QoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXZpZXdEZXNpZ24oKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmMjMwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbCB7Ci0JLyoqCi0JICogRW5oYW5jZWQgZXF1YWxpdHkgY2hlY2sgZm9yIHR3byBzdHJpbmcgcGFyYW1ldGVycywgdGhhdCB0YWtlcyBpbnRvIGNvbnNpZGVyYXRpb24gbnVsbCB2YWx1ZXMuCi0JICogSWYgYm90aCB2YWx1ZXMgYXJlIG51bGwsIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmIChzMSA9PSBudWxsKQotCQkJcmV0dXJuIHMyID09IG51bGw7Ci0JCXJldHVybiBzMS5lcXVhbHMoczIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZWU4YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1RyYW5zbGF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGNsYXNzIHVzZWQgYnkgdGhlIFRyYW5zbGF0b3JTZXJ2aWNlIGluIG9yZGVyIHRvIGRpc2NvdmVyCi0gKiBhbmQgY2FjaGUgYWxsIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9ycyB0byBiZSB1c2VkIGJ5IEVNRjJET01BZGFwdGVySW1wbC4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zbGF0b3JNYW5hZ2VyIHsKLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIFRyYW5zbGF0b3JNYW5hZ2VyIGluc3RhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgVHJhbnNsYXRvck1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBDYWNoZSBvZiBhbGwgdGhlIFRyYW5zbGF0b3JEZXNjcmlwdG9ycwotCSAqLwotCXByaXZhdGUgZmluYWwgU2V0IHRyYW5zbGF0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IHN0YXRpYyBlbXB0eSBhcnJheSB1c2VkIHdoZW4gbm8gZGVzY3JpcHRvcnMgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yWzBdOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhbnNsYXRvck1hbmFnZXIKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JNYW5hZ2VyIElOU1RBTkNFCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3JNYW5hZ2VyKCkgewotCQluZXcgVHJhbnNsYXRvclJlZ2lzdHJ5KCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIFNpbXBsZSBSZWdpc3RyeSBSZWFkZXIgdXNlZCBieSBUcmFuc2xhdG9yIE1hbmFnZXIgdG8gcmVjb2duaXplIHRoZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRyYW5zbGF0b3JSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQkJCi0JCS8qKgotCQkgKiBUaGUgVHJhbnNsYXRvciBlbGVtZW50IG9mIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0xBVE9SID0gInRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKLQkJCXN1cGVyKEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFY29yZVV0aWxpdGllc1BsdWdpbi5UUkFOU0xBVE9SX0VYVEVOU1RJT05fUE9JTlQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlmIGl0IG1hdGNocyB0aGUgZXhwZWN0ZWQgdHJhbnNsYXRvciBlbGVtZW50IG5hbWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKFRSQU5TTEFUT1IuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCWFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVzY3JpYmVzIGEgVHJhbnNsYXRvciBleHRlbnNpb24gcG9pbnQgZWxlbWVudAotCSAqLwotCXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yRGVzY3JpcHRvciB7Ci0JCi0JCS8qKgotCQkgKiBRdWFsaWZpZWQgY2xhc3MgbmFtZSBhdHRyaWJ1dGUKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogVGhlIGNvbmZpZyBlbGVtZW50IGZvciB0aGlzIERlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7Ci0JCQotCQkvKioKLQkJICogdGhlIGNhY2hlZCBxdWFsaWZpZWQgY2xhc3NOYW1lIHZhbHVlIG9mIHRoaXMgZGVzY3JpcHRvcgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCQotCQkvKioKLQkJICogQ29uc3RydWN0b3IKLQkJICogQHBhcmFtIGFDb25maWdFbGVtZW50Ci0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OwotCQkJY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NOQU1FKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9yCi0JCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzbmFtZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGFjdHVhbCBUcmFuc2xhdG9yIGluc3RhbmNlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkJICogQHJldHVybiBUcmFuc2xhdG9yCi0JCSAqLwotCQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgewotCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKFRyYW5zbGF0b3IpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU05BTUUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgVHJhbnNsYXRvckRlc2NyaXB0b3IgdG8gdGhlIGNhY2hlIG9mIGRlc2NyaXB0b3IgZXh0ZW5zaW9ucy4KLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUcmFuc2xhdG9yRGVzY3JpcHRvcihUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZGVzY3JpcHRvcik7Ci0JCXRyYW5zbGF0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCBhbGwgdGhlIGFzc29jaWF0ZWQgVHJhbnNsYXRvckRlc2NyaXB0b3JzIGZvciB0aGUgVHJhc2xhdG9yIGV4dGVuc2lvbnMgZGVmaW5lZC4KLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBmaW5kVHJhbnNsYXRvcnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciB0cmFuc2xhdG9yc0l0ciA9IHRyYW5zbGF0b3JzLml0ZXJhdG9yKCk7IHRyYW5zbGF0b3JzSXRyLmhhc05leHQoKTspIHsKLQkJCWRlc2NyaXB0b3IgPSAoVHJhbnNsYXRvckRlc2NyaXB0b3IpIHRyYW5zbGF0b3JzSXRyLm5leHQoKTsKLQkJCXJlc3VsdC5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTOwotCQl9Ci0JCXJldHVybiAoVHJhbnNsYXRvckRlc2NyaXB0b3JbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDEyYTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuVHJhbnNsYXRvck1hbmFnZXIuVHJhbnNsYXRvckRlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc2VydmljZSBjbGFzcyB0byBkZWxpdmVyIEFQSSB0byB1c2UgdG8gcmV0cmlldmUgVHJhbnNsYXRvciBleHRlbnNpb25zIGZyb20KLSAqIHRoZSBUcmFuc2xhdG9yTWFuYWdlciBhbmQgaXRzIFJlZ2lzdHJ5UmVhZGVyLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2UgewotCi0JLyoqCi0JICogU3RhdGljIEtleSB2YWx1ZSBwYWlyIG9mIGRlc2NyaXB0b3JzIGFzIGtleXMgYW5kIFRyYW5zbGF0b3IgaW5zdGFuY2VzIGFzIHZhbHVlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCB0cmFuc2xhdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogU3RhdGljIGVtcHR5IGFycmF5IHVzZWQgd2hlbiBubyBleHRlbnNpb25zIGZvdW5kCi0JICovCi0JLy8gbmV2ZXIgdXNlZAotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIE5PX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0JCi0JLyoqCi0JICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2xhdG9yIHNlcnZpY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yU2VydmljZSBJTlNUQU5DRSA9IG5ldyBUcmFuc2xhdG9yU2VydmljZSgpOwotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRyYW5zbGF0b3JTZXJ2aWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3JTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZXh0ZW5zaW9uIHBvaW50IFRyYW5zbGF0b3JEZXNjcmlwdG9yIG9iamVjdHMgZnJvbSB0aGUgbWFuYWdlcgotCSAqIEByZXR1cm4gVHJhbnNsYXRvckRlc2NyaXB0b3JbXQotCSAqLwotCXB1YmxpYyBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGdldFRyYW5zbGF0b3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIFRyYW5zbGF0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZmluZFRyYW5zbGF0b3JzKCk7Ci0JfQotCQotCS8qKgotICAgICAqIFRoaXMgcmV0cmlldmVzIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9ycyB1c2luZyB0aGUgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZXIgYW5kIGRlc2NyaXB0b3JzCi0gICAgICogQHJldHVybiBUcmFuc2xhdG9yW10gKE5vdGUsIHRoZSByZXR1cm4gdmFsdWUgbWF5IGNvbnRhaW4gbnVsbCBlbnRyaWVzLikKLSAgICAgKi8KLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldFRyYW5zbGF0b3JzKCkgewotCQlUcmFuc2xhdG9yRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0VHJhbnNsYXRvckRlc2NyaXB0b3JzKCk7Ci0JCVRyYW5zbGF0b3JbXSByZXN1bHQgPSBuZXcgVHJhbnNsYXRvcltkZXNjcmlwdG9ycy5sZW5ndGhdOwotCQkvL1RoZSByZXN1bHQgaW5kZXggY291bGQgZGlmZmVyIGZyb20gdGhlIGRlc2NyaXB0b3JzIGluZGV4LgotCQlpbnQgcmVzdWx0SW5kZXggPSAwOwotCQlmb3IgKGludCBpPTA7IGk8ZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCVRyYW5zbGF0b3IgaW5zdGFuY2UgPSBnZXRUcmFuc2xhdG9yKGRlc2NyaXB0b3JzW2ldKTsKLQkJCWlmIChpbnN0YW5jZSE9bnVsbCkgewotCQkJCXJlc3VsdFtyZXN1bHRJbmRleF0gPSBpbnN0YW5jZTsKLQkJCQlyZXN1bHRJbmRleCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7ICAKLSAgICB9Ci0JCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGV4aXN0aW5nIGFzc29jaWF0ZWQgVHJhbnNsYXRvciBpbnN0YW5jZSBmb3IgdGhlIGRlc2NyaXB0b3IsIG9yIGNyZWF0ZSBhIG5ldwotCSAqIG9uZSBhbmQgY2FjaGUgb24gdGhlIFNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRvckRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIFRyYW5zbGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcihUcmFuc2xhdG9yRGVzY3JpcHRvciB0cmFuc2xhdG9yRGVzY3JpcHRvcikgewotCQlUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSAoVHJhbnNsYXRvcikgdHJhbnNsYXRvcnMuZ2V0KHRyYW5zbGF0b3JEZXNjcmlwdG9yKTsKLQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKLQkJCXJldHVybiB0cmFuc2xhdG9yOwotCQkKLQkJc3luY2hyb25pemVkICh0cmFuc2xhdG9ycykgewotCQkJdHJhbnNsYXRvciA9IHRyYW5zbGF0b3JEZXNjcmlwdG9yLmNyZWF0ZVRyYW5zbGF0b3IoKTsKLQkJCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCi0JCQkJdHJhbnNsYXRvcnMucHV0KHRyYW5zbGF0b3JEZXNjcmlwdG9yLCB0cmFuc2xhdG9yKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFjNjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVXNlckV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9XRlRVdGlsc1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDYzMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3ZnR1dGlscyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREFOR0xJTkdfSFJFRl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZWdlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1lcmF0aW9uX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG9ydF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb25nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3VibGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmxvYXRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ5dGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2ZPYmplY3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU1GMkRPTUFkYXB0ZXJJbXBsX0VSUk9SXzA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBhYTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Xcml0ZUJhY2tIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgd2lsbCBiZSBkZWxldGVkLiBJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhpcyBjbGFzcywgcGxlYXNlIGNvbnRhY3QgdGhlCi0gKiAgICAgICAgICAgICBXQ0NNIHRlYW0uIEEgY2xhc3Mgd2hpY2ggY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBFbmNvZGVyL0RlY29kZXJzIHRvIHNhdmUKLSAqICAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGV5IGFyZSBtYWRlIGRpcnR5IGJ5IGF1dG9tYXRpYyBlbmNvZGluZyBzdXBwb3J0LiBVc2FnZSBFeGFtcGxlOgotICogCi0gKiA8cHJlPgotICogCi0gKiAKLSAqIC8vIFVzZSB0aGUgc3RhbmRhcmQgV2ViU3BoZXJlIHBhc3N3b3JkIHZhbHVlIGVuY29kZXIvZGVjb2Rlci4KLSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkuZ2V0RGVmYXVsdFJlZ2lzdHJ5KCkuc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKG5ldyBjb20uaWJtLmVqcy5zZWN1cml0eS51dGlsLldBU0VuY29kZXJEZWNvZGVyKCkpOwotICogLy8gQmVnaW4gdHJhY2tpbmcgY2hhbmdlcy4uLgotICogV3JpdGVCYWNrSGVscGVyLmJlZ2luKCk7Ci0gKiAvLyBMb2FkIGEgcmVzb3VyY2Ugd2hpY2ggbWF5IGhhdmUgdW4tZW5jb2RlZCB2YWx1ZXMuLi4KLSAqIC8vIE5vdGU6IFRoZSBXQ0NNIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3QgdW4tZW5jb2RlZCB2YWx1ZXMuICBJZiB1bmVuY29kZWQgdmFsdWVzCi0gKiAvLyBhcmUgZm91bmQsIHRoZSB2YWx1ZSB3aWxsIGJlIGVuY29kZWQsIGFuZCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUKLSAqIC8vIFdyaXRlQmFja0hlbHBlci4KLSAqIFJlc291cmNlIHJlcyA9IHJlc291cmNlU2V0LmxvYWQoJnF1b3Q7bXlSZXNvdXJjZSZxdW90Oyk7Ci0gKiAvLyBFbnN1cmUgdGhhdCBhbnkgY2hhbmdlcyBkdWUgdG8gZW5jb2RpbmcgYXJlIHdyaXR0ZW4gYmFjayBvdXQuCi0gKiBXcml0ZUJhY2tIZWxwZXIuZW5kKCk7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRlQmFja0hlbHBlciB7Ci0JcHJpdmF0ZSBTZXQgZGlydHlPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIGJvb2xlYW4gdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgV3JpdGVCYWNrSGVscGVyIF9pbnN0YW5jZTsKLQlzdGF0aWMgewotCQkvL0RlcHJlY2F0ZWQgY2xhc3MKLQkJUmV2aXNpdC5kZWxldGVNZSgpOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgZW5zdXJlcyBwcm9wZXIgdXNhZ2UgdGhyb3VnaCBzaW5nbGV0b24uCi0JICovCi0JcHJpdmF0ZSBXcml0ZUJhY2tIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc291cmNlIHdoaWNoIGlzIGRpcnR5LCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlydHlPYmplY3QoRU9iamVjdCBkaXJ0eU9iamVjdCkgewotCQlkaXJ0eU9iamVjdHMuYWRkKGRpcnR5T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBCZWdpbiBjb2xsZWN0aW5nIG9iamVjdHMgd2hpY2ggaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luKCkgewotCQl0cmFja2luZ0NoYW5nZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIHNhdmUgYWxsIGRpcnR5IHJlc291cmNlcyAoaWYgcG9zc2libGUpLCB0aGVuIG1hcmtzIHRoZSByZXNvdXJjZXMgYXMgbm9uLWRpcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZCgpIHsKLQkJc2F2ZURpcnR5UmVzb3VyY2VzKCk7Ci0JCXJlc2V0KCk7Ci0JCXRyYWNraW5nQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjaGFuZ2VzIHRvIG1vZiBvYmplY3RzIGFyZSBjdXJyZW50bHkgYmVpbmcgdHJhY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRyYWNraW5nQ2hhbmdlczsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgZGlydHkgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQlkaXJ0eU9iamVjdHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBzYXZlIGFsbCBkaXJ0eSByZXNvdXJjZXMgKGlmIHBvc3NpYmxlKSwgdGhlbiBtYXJrcyB0aGUgcmVzb3VyY2VzIGFzIG5vbi1kaXJ0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGlydHlSZXNvdXJjZXMoKSB7Ci0JCVNldCBkaXJ0eVJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGRpcnR5T2JqSXRlciA9IGRpcnR5T2JqZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZGlydHlPYmpJdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBkaXJ0eU9iamVjdCA9IChFT2JqZWN0KSBkaXJ0eU9iakl0ZXIubmV4dCgpOwotCQkJaWYgKGRpcnR5T2JqZWN0LmVSZXNvdXJjZSgpICE9IG51bGwgJiYgIWRpcnR5UmVzb3VyY2VzLmNvbnRhaW5zKGRpcnR5T2JqZWN0KSkgewotCQkJCWRpcnR5UmVzb3VyY2VzLmFkZChkaXJ0eU9iamVjdC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgZGlydHlJdGVyID0gZGlydHlSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGRpcnR5SXRlci5oYXNOZXh0KCkpIHsKLQkJCVJlc291cmNlIGRpcnR5UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRpcnR5SXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWRpcnR5UmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl3YXJuKGRpcnR5UmVzb3VyY2UsIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHJlc291cmNlIHdoaWNoIGlzIGRpcnR5LCBhbmQgbmVlZHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBXcml0ZUJhY2tIZWxwZXIgc2luZ2xldG9uKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBXcml0ZUJhY2tIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFdhcm4gdGhlIHVzZXIgb2YgcHJvYmxlbXMgZHVyaW5nIHNhdmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd2FybihSZXNvdXJjZSByZXMsIEV4Y2VwdGlvbiBlKSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuV2FybmluZ19fQ291bGRfbm90X3dyaXRlX2JfV0FSTl8sIG5ldyBPYmplY3RbXXtyZXMuZ2V0VVJJKCl9KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9YTUxWYWx1ZUVuY29kZXJEZWNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTFkMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOwotCi0KLS8qKgotICogQW4gWE1MIHZhbHVlIGVzY2FwaW5nIEVuY29kZXJEZWNvZGVyIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyIGV4dGVuZHMgRW5jb2RlckRlY29kZXJBZGFwdGVyIGltcGxlbWVudHMgRW5jb2RlckRlY29kZXIgewotCS8qKgotCSAqIElkZW50aWZpZXMgdGhlIGxhc3QgcHJpbnRhYmxlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSByYW5nZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBlbmNvZGluZyB1c2VkIHdpdGggdGhpcyBzZXJpYWxpemVyLiBGb3IgOC1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSBlaXRoZXIgMHg3RSBvciAweEZGLiBGb3IKLQkgKiAxNi1iaXQgZW5jb2RpbmdzIHRoaXMgd2lsbCBiZSAweEZGRkYuIENoYXJhY3RlcnMgdGhhdCBhcmUgbm90IHByaW50YWJsZSB3aWxsIGJlIGVzY2FwZWQgdXNpbmcKLQkgKiBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIGludCBfbGFzdFByaW50YWJsZSA9IDB4N0U7Ci0JcHJvdGVjdGVkIHN0YXRpYyBYTUxWYWx1ZUVuY29kZXJEZWNvZGVyIF9zaW5nbGV0b247Ci0KLQkvKioKLQkgKiBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gTk9UX0lNUExFTUVOVEVECi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIGl0IG1heSBiZSBwcmludGVkIGFzIHRleHQgY29udGVudCBvciBhdHRyaWJ1dGUgdmFsdWUuIE5vbiBwcmludGFibGUKLQkgKiBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIGNoYXJhY3RlciByZWZlcmVuY2VzLiBXaGVyZSB0aGUgZm9ybWF0IHNwZWNpZmllcyBhIGRlYXVsdCBlbnRpdHkKLQkgKiByZWZlcmVuY2UsIHRoYXQgcmVmZXJlbmNlIGlzIHVzZWQgKGUuZy4gPHR0PiZhbXA7bHQ7PC90dD4pLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZXNjYXBlCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBjaGFyUmVmID0gbnVsbDsKLQkJY2hhciBjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCS8vIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcwotCQkJLy8gY2hhcmFjdGVyLCBwcmludCBpdC4gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGVudGl0eQotCQkJLy8gcmVmZXJlbmNlcyBpcyBhbG1vc3QgYnV0IG5vdCBpZGVudGljYWwgYmV0d2VlbgotCQkJLy8gWE1MIGFuZCBIVE1MLgotCQkJY2hhclJlZiA9IGdldEVudGl0eVJlZihjaCk7Ci0JCQlpZiAoY2hhclJlZiAhPSBudWxsKSB7Ci0JCQkJc2J1Zi5hcHBlbmQoJyYnKTsKLQkJCQlzYnVmLmFwcGVuZChjaGFyUmVmKTsKLQkJCQlzYnVmLmFwcGVuZCgnOycpOwotCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7Ci0JCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIgcmVmZXJlbmNlLgotCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCi0JCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZSB0aHJlc2hvbGQuCi0JCQkJc2J1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzYnVmLmFwcGVuZCgiJiMiKTsvLyROT04tTkxTLTEkCi0JCQkJc2J1Zi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOwotCQkJCXNidWYuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgWE1MVmFsdWVFbmNvZGVyRGVjb2RlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uLmVuY29kZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcyBjaGFyYWN0ZXIgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRpdHkKLQkgKiBleGlzdHMuIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCA8dHQ+JyZhbXA7JzwvdHQ+IHdpbGwgcmV0dXJuIDx0dD4iJmFtcDthbXA7IjwvdHQ+LgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlCi0JICogQHJldHVybiBDaGFyYWN0ZXIgZW50aXR5IG5hbWUsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eVJlZihjaGFyIGNoKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gImx0IjsvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSAnXCcnIDoKLQkJCQlyZXR1cm4gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvd2Z0dXRpbHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZTJhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi93ZnR1dGlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXz1JV0FFMDAwOFcgV2FybmluZzogQ291bGQgbm90IHdyaXRlIGJhY2sgezB9Ci1TdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl89SVdBRTAwMDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Ci1FbnVtZXJhdGlvbl9VSV89RW51bWVyYXRpb24KLURvdWJsZV9VSV89RG91YmxlCi1GbG9hdF9VSV89RmxvYXQKLUxvbmdfVUlfPUxvbmcKLVNob3J0X1VJXz1TaG9ydAotQm9vbGVhbl9VSV89Qm9vbGVhbgotSW50ZWdlcl9VSV89SW50ZWdlcgotQ2hhcmFjdGVyX1VJXz1DaGFyYWN0ZXIKLUJ5dGVfVUlfPUJ5dGUKLUZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXz1JV0FFMDAxNEUgRmFpbGVkIHRvIGNvbnZlcnQgezB9IHRvIHsxfS4KLURBTkdMSU5HX0hSRUZfRVJST1JfPUlXQUUwMDAxRSBVbmFibGUgdG8gcmVzb2x2ZSBIUkVGIHswfS4gQ2hlY2sgdGhlIGRlc2NyaXB0b3IgZmlsZXMgYW5kIGVuc3VyZSB0aGUgaWRzIGFyZSB2YWxpZC4KLU1vZk9iamVjdF9VSV89TW9mT2JqZWN0X1VJXwotUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMD1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wCi1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMD1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMAotCi1SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlcl9FUlJPUl8wPUlXQUUwMDAyRSBUaGUgUmVzb3VyY2VTZXQgY2Fubm90IGJlIG51bGwuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y2MzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuZW52IHBsdWdpbi4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBtYXN0ZXIgc3dpdGNoIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCBwbHVnaW4uCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGRpZmZlcmVudCB0cmFjaW5nIGxldmVsCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3RyYWNlL2luZm89dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93YXJuaW5nPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZXJyb3I9dHJ1ZQotCi0jIFR1cm4gb24gZGF0YSBmbG93IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZGF0YT10cnVlCi0KLSMgVHVybiBvbiBjb21tYW5kIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvY29tbWFuZD10cnVlCi0KLSMgVHVybiBvbiBlbWl0dGVyIHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvdHJhY2UvZW1pdHRlcj10cnVlCi0KLSMgVHVybiBvbiB3ZWIgc2VydmljZSBhbnQgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19hbnQ9dHJ1ZQotCi0jIFR1cm4gb24gd2ViIHNlcnZpY2UgZGV0YWlsZWQgY29tbWFuZCBlbmdpbmUgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS93c19kdF9jbWRfZW5naW5lPXRydWUKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTcyZWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODk2ZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gSmFuIDMwIDEwOjM3OjM2IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQzY2QwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBKYW4gMzAgMTA6NDA6MjYgRVNUIDIwMDYKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTg0ZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC51cmkuZmlsZTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuNC4wKSIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMy4xLjEwMCwzLjIuMCkiCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZSAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljNDAwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTU3NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1FbnZpb3JubWVudCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvQ2hvaWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDU4ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Nob2ljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHRoZSBJU3RhdHVzSGFuZGxlciBpbnRlcmZhY2UuCi0gKiBJdCBhbGxvd3MgY29kZSB0aGF0IGlzIHJlcG9ydGluZyBzdGF0dXMgdG8gc3BlY2lmeSBjaG9pY2VzIHRvIHRoZSB1c2VyCi0gKiB3aGljaCB0aGlzIHJlcG9ydGluZyBjb2RlIGNhbiByZWFjdCB0by4gCi0gKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hvaWNlIHsKLQotICBwcml2YXRlIGNoYXIgICBzaG9ydGN1dCA9ICcgJzsgCi0gIHByaXZhdGUgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAJCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKCkgewotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICogQHBhcmFtIHNob3J0Y3V0IHRoZSBzaW5nbGUgbGV0dGVyIHNob3J0Y3V0IGZvciB0aGlzIGNob2ljZS4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyBjaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZShjaGFyIHNob3J0Y3V0LCBTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0gICAqIEBwYXJhbSBzaG9ydGN1dCB0aGUgc2luZ2xlIGxldHRlciBzaG9ydGN1dCBmb3IgdGhpcyBjaG9pY2UuCi0gICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIGNob2ljZS4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKGNoYXIgc2hvcnRjdXQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFiZWwuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3J0Y3V0LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGNoYXIKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRTaG9ydGN1dCgpIHsKLQkJcmV0dXJuIHNob3J0Y3V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3J0Y3V0LgotCSAqIEBwYXJhbSBzaG9ydGN1dCBUaGUgc2hvcnRjdXQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoY2hhciBzaG9ydGN1dCkgewotCQl0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDMyZDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgZm9yIGNvbmRpdGlvbnMgcmFpc2VkIGJ5IHRoZSBJRW52aXJvbm1lbnQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzk3ODk4MzI3NTg5OTQwMjAzNkw7Ci0gIAotICAvKioKLSAgICogVGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCBJU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMgPT0gbnVsbCA/IG51bGwgOiBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvRW52aXJvbm1lbnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjNmZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0Vudmlyb25tZW50U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLkNvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBjb25zb2xlIGVudmlyb25tZW50LiAgSXQgYWxzbyBjb250YWlucyBzdGF0aWMKLSAqIGNvbnZpZW5jZXMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW4gSUxvZyBvYmplY3QgYXMgd2VsbCBhcyBhbiBFY2xpcHNlIGFuZAotICogRmlsZSBTY2hlbWUuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudFNlcnZpY2UKLXsKLSAgc3RhdGljIHByaXZhdGUgSUVudmlyb25tZW50IGVudmlyb25tZW50OwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gRWNsaXBzZSBjb25zb2xlIGVudmlyb25tZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJRW52aXJvbm1lbnQgZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpCi0gIHsKLSAgICBpZiggZW52aXJvbm1lbnQgPT0gbnVsbCApIGVudmlyb25tZW50ID0gbmV3IENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoKTsKLSAgICAKLSAgICByZXR1cm4gZW52aXJvbm1lbnQ7IAotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIEVjbGlwc2UgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nIGdldEVjbGlwc2VMb2coKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIAotICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRMb2coKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gRWNsaXBzZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElVUklTY2hlbWUgZ2V0RWNsaXBzZVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzY2hlbWUgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCkubmV3VVJJU2NoZW1lKCAicGxhdGZvcm0iICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7ICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc2NoZW1lOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgRmlsZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElVUklTY2hlbWUgZ2V0RmlsZVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzY2hlbWUgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCkubmV3VVJJU2NoZW1lKCAiZmlsZSIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzY2hlbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1MDNiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5OwotCi0KLS8qKgotICogQW4gSUVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgZ2V0dGluZyBhIAotICogPG9sPgotICogPGxpPkEgbG9nIGZvciB3cml0aW5nIG1lc3NhZ2VzIHRvIGEgbG9nZ2luZyBmYWNpbGl0eSw8L2xpPgotICogPGxpPkEgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgcmVjZWl2aW5nIHByb2dyZXNzIGluZm9ybWF0aW9uLDwvbGk+Ci0gKiA8bGk+QSBzdGF0dXMgaGFuZGxlciBmb3IgcmVjZWl2aW5nIGFuZCBwcm9jZXNzaW5nIHN0YXR1cyByZXBvcnRzLDwvbGk+Ci0gKiA8bGk+QSBmYWN0b3J5IGZvciB0aGUgaGFuZGxpbmcgb2YgVVJJcyAocmVzb3VyY2VzKS48L2xpPgotICogPC9vbD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbnZpcm9ubWVudAotewotICAvKioKLSAgICogUmV0dXJucyBhIGxvZ2dpbmcgZmFjaWxpdHkuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBsb2dnaW5nIGZhY2lsaXR5LgotICAgKi8KLSAgcHVibGljIElMb2cgZ2V0TG9nICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBzdGF0dXMgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgSVVSSSBmYWN0b3J5LgotICAgKiBIaW50OiBJbXBsZW1lbnRlcnMgc2hvdWxkIGluc3VyZSB0aGF0IHRoZSBGYWN0b3J5IHRoZXkgcmV0dXJuCi0gICAqIGhhcyBhIHJlZmVyZW5jZSB0byB0aGlzIElFbnZpcm9ubWVudCBzbyB0aGF0IElVUkkgb2JqZWN0cyBjYW4KLSAgICogcmVwb3J0IHByb2dyZXNzIGFuZCBhbm5vdW5jZSBzdGF0dXMuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBVUkkgZmFjdG9yeS4KLSAgICovCi0gIHB1YmxpYyBJVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5ICgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9JTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MWZjYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIElMb2cgb2JqZWN0cyBwcm92aWRlIGEgbWVhbnMgZm9yIGxvZ2dpbmcgaW5mb3JtYXRpb24gZm9yIEZGREMgZXRjLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZwotewotICAvKioKLSAgICogVGhpcyBjb25zdGFudCBpbmRpY2F0ZXMgdGhhdCBhIGxvZ2dpbmcgbWVzc2FnZSBpcyBPay4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gMDsKLSAgCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGluZm9ybWF0aW9uYWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLSAgCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IGluZGljYXRlcyB0aGF0IGEgbG9nZ2luZyBtZXNzYWdlIGlzIGFuIGVycm9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSA0OwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLgotICAgKiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCB0byBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBhdHRlbXB0aW5nCi0gICAqIGEgY2FsbCB0byBvbmUgb2YgdGhlIDxjb2RlPmxvZzwvY29kZT4gbWV0aG9kcywgYXMgdGhleSB3aWxsCi0gICAqIHF1aWV0bHkgZG8gbm90aGluZyBpZiBsb2dnaW5nIGlzIGRpc2FibGVkLiBUaGlzIG1ldGhvZCBjYW4gYmUKLSAgICogdXNlZnVsLCBob3dldmVyLCBhbnl3aGVyZSB0aGUgY29zdCBvZiBidWlsZGluZyB1cCB0aGUgcGFyYW1ldGVycwotICAgKiB0byBhIGxvZyBtZXRob2QgbWlnaHQgYmUgaGlnaCBhbmQgYmVzdCBhdm9pZGVkIGV4Y2VwdCB3aGVuIGxvZ2dpbmcKLSAgICogaXMgZW5hYmxlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi0gICAqIAotICAgKiBAcGFyYW0gb3B0aW9uIHRoaXMgZGVidWcgb3B0aW9uIHN0cmluZy4KLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhpcyBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQgKFN0cmluZyBvcHRpb24pOwotCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gb3B0aW9uIHRoaXMgZGVidWcgb3B0aW9uIHN0cmluZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIFRocm93YWJsZSB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlICk7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5TdGF0dXM8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIFN0YXR1cyB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBJU3RhdHVzIHN0YXR1cyApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5TdGF0dXM8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gb3B0aW9uIHRoaXMgZGVidWcgb3B0aW9uIHN0cmluZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBTdGF0dXMgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgSVN0YXR1cyBzdGF0dXMgKTsKLQotICAvKioKLSAgICogTG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gb3B0aW9uIHRoaXMgZGVidWcgb3B0aW9uIHN0cmluZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L0lTdGF0dXNIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5MmE5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvSVN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogUHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSAqIGluZGljYXRpb24gb2YgY2hvaWNlcyBtYWRlIGJ5IHRoZSByZWNpcGllbnQgb2YgdGhlIHN0YXR1cyBhbmQKLSAqIG1heSByYWlzZSBhbiBleGNlcHRpb24gYWdhaW5zdCB0aGUgY2FsbGVyIHRvIGhhdmUgdGhlbSBhYm9ydAotICogcHJvY2VzaW5nLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXR1c0hhbmRsZXIKLXsKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyB0byByZXBvcnQuCi0gICAqIEBwYXJhbSBjaG9pY2VzIHRoZSBjaG9pY2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIHVzZXIvaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0ICggSVN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMgKTsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgd2l0aCBpbXBsaWVkIG9wdGlvbnMgdG8gZWl0aGVyCi0gICAqIGNvbnRpbnVlIG9yIGFib3J0LgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgdG8gcmVwb3J0LgotICAgKiBAdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBoYW5kbGVyIGRlY2lkZXMgdGhlIGNhbGxlcgotICAgKiBzaG91bGQgc3RvcCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0ICggSVN0YXR1cyBzdGF0dXMgKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgZ2l2ZW4gRXJyb3IgU3RhdHVzLiAgTm8gdXNlciBmZWVkYmFjayBpcyBwcm92aWRlZC4KLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3Igc3RhdHVzIHRvIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKCBJU3RhdHVzIHN0YXR1cyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgZ2l2ZW4gSW5mbyBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBpbmZvIHN0YXR1cyB0byByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKCBJU3RhdHVzIHN0YXR1cyApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L051bGxTdGF0dXNIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxZjFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvTnVsbFN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSVN0YXR1c0hhbmRsZXIgaW50ZXJmYWNlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTnVsbFN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBJU3RhdHVzSGFuZGxlcgotewotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydChJU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcykgCi0gIHsKLSAgCUNob2ljZSByZXN1bHQgPSBudWxsOwotICAJCi0gIAkvLyBBbHdheXMgdGFrZSB0aGUgZmlyc3QgY2hvaWNlIGlmIGF2YWlsYWJsZS4KLSAgICBpZiggY2hvaWNlcyAhPSBudWxsICYmIGNob2ljZXMubGVuZ3RoID4gMCApCi0gICAgewotICAgIAlyZXN1bHQgPSBjaG9pY2VzWzBdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5JU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQoSVN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICB9Ci0gIAotICAvKgotICAgKiBSZXBvcnQgYW5kIGVycm9yLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydEVycm9yU3RhdHVzKElTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyI3JlcG9ydEVycm9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L1N0YXR1c0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDFiOGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC9TdGF0dXNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgYnkgU3RhdHVzSGFuZGxlcnMgdG8gdGVsbCB0aGVpcgotICogY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c0V4Y2VwdGlvbiBleHRlbmRzIEVudmlyb25tZW50RXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjE4MTQxMTYwMzIyMTE5OTkyTDsKLQotICAvKioKLSAgICogVGhlIENob2ljZSB0aGF0IGxlYWQgdG8gdGhlIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sCi0gICAqIGlmIGFueSAoaWUuIG1heSBiZSBudWxsKS4KLSAgICovCi0gIHByb3RlY3RlZCBDaG9pY2UgY2hvaWNlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cyBmb3IgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzRXhjZXB0aW9uKCBJU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlciggc3RhdHVzICk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZS4KLSAgICogVGhlIENob2ljZSBtYXkgYmUgbnVsbC4KLSAgICogQHBhcmFtIGNob2ljZSB0aGUgY2hvaWNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24gKCBDaG9pY2UgY2hvaWNlICkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gICAqIGFuZCBzdGF0dXMgb2JqZWN0LiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGNob2ljZSB0aGUgY2hvaWNlIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24gKCBJU3RhdHVzIHN0YXR1cywgQ2hvaWNlIGNob2ljZSApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMpOwotICAgIHRoaXMuY2hvaWNlID0gY2hvaWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgQ2hvaWNlIG9iamVjdCBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIGdldENob2ljZSAoKQotICB7Ci0gICAgcmV0dXJuIGNob2ljZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNjNiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBJVVJJIHJlcHJlc2VudHMgYSBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmZXIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJCi17Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0cmluZyBmb3JtIG9mIHRoZSBJVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIElVUklTY2hlbWUgZm9yIHRoZSBzY2hlbWUgb2YgdGhpcyBJVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBnZXRVUklTY2hlbWUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50ICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBJVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgYSBsZWFmLiBSZXR1cm5zIHRydWUgYWx3YXlzIGZvciBub24taGllcmFyY2hpY2FsIHNjaGVtZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyByZWFkYWJsZS4gQSByZWFkYWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gICAqIGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSByZWFkYWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBmb2xkZXIsIGlmIGFueSwKLSAgICogY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBsaXN0KCkgb3IgdmlzaXQoKSBtZXRob2RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSSBleGlzdHMKLSAgICogYW5kIGlzIHdyaXRhYmxlLiBBIHdyaXRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSB3cml0YWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgbmV3IHJlc291cmNlcyBjYW4gYmUgY3JlYXRlZCBpbiB0aGUgZm9sZGVyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWZmIHRoaXMgSVVSSSBiZWxvbmdzIHRvIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKiB0aGlzLmlzSGllcmFyY2hpY2FsKCkgPT0gdGhpcy5nZXRVUklTY2hlbWUoKS5pc0hpZXJhcmNoaWNhbCgpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmZiB0aGlzIElVUkkgaXMgYSByZWxhdGl2ZSBJVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlICgpOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIElVUkkgb2YgdGhlIGZvbGRlciBjb250YWluaW5nIHRoaXMgSVVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBwYXJlbnQgVVJJLgotICAgKi8KLSAgcHVibGljIElVUkkgcGFyZW50ICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSByZWxhdGl2ZVVSSSBhIHJlbGF0aXZlIFVSSS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3LCBub3JtYWxpemVkIElVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4KLSAgICogcmVsYXRpdmUgSVVSSSB0byB0aGlzIElVUkkuIEJvdGggVVJJcyBtdXN0IGJlIGhpZXJhcmNoaWNhbC4KLSAgICogVGhlIHJlc3VsdGluZyBJVVJJIHdpbGwgYWx3YXlzIGJlIGhpZXJhcmNoaWNhbC4gVGhlIGdpdmVuCi0gICAqIElVUkkgbXVzdCBiZSByZWxhdGl2ZS4gVGhpcyBJVVJJIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSAgICogdGhlIHJlc3VsdGluZyBJVVJJIHdpbGwgYmUgZXF1aXZhbGVudGx5IHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiByZWxhdGl2ZVVSSSBpcyBub3QgcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgSVVSSSBhcHBlbmQgKCBJVVJJIHJlbGF0aXZlVVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBHZXRzIGFuIElucHV0U3RyZWFtIGZvciByZWFkaW5nIGZyb20gdGhlIHJlc291cmNlCi0gICAqIGlkZW50aWZpZWQgYnkgdGhpcyBsZWFmIG9yIG5vbi1oaWVyYXJjaGljYWwgSVVSSS4KLSAgICogCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGEgc3RyZWFtIGZvciB0aGlzIFVSSSBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0gKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQHJldHVybiBHZXRzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgcmVzb3VyY2UKLSAgICogaWRlbnRpZmllZCBieSB0aGlzIGxlYWYgb3Igbm9uLWhpZXJhcmNoaWNhbCBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhIHN0cmVhbSBmb3IgdGhpcyBVUkkgY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0gKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIGlkZW50aWZpZWQgYnkKLSAgICogdGhlIElVUkkuIE9uIGNvbXBsZXRpb24sIHRoaXMuaXNMZWFmKCkgPT0gdHJ1ZS4gSWYgYSBsZWFmCi0gICAqIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEKLSAgICogbm9uLWxlYWYgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgdW5kZXIgdGhpcyBJVVJJLCBjcmVhdGlvbgotICAgKiB3aWxsIGZhaWwgYW5kIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHRvdWNoaW5nIHRoaXMgbGVhZiByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZiAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlciByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgSVVSSS4gVGhlIHNjaGVtZSBvZiB0aGUgSVVSSSBtdXN0IGJlIGhpZXJhcmNoaWNhbC4KLSAgICogT24gY29tcGxldGlvbiwgdGhpcy5pc0xlYWYoKSA9PSBmYWxzZS4gSWYgYSBmb2xkZXIgcmVzb3VyY2UKLSAgICogYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gSWYgYSBsZWFmIHJlc291cmNlCi0gICAqIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgSVVSSSwgY3JlYXRpb24gd2lsbCBmYWlsIGFuZCBhbgotICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB0b3VjaGluZyB0aGlzIGZvbGRlciByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEVyYXNlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBlcmFzaW5nIHRoaXMgcmVzb3VyY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgSVVSSQotICAgKiB0byB0aGUgbmV3IElVUkkuCi0gICAqIEBwYXJhbSBuZXdVUkkgdGhlIG5ldyBVUkkgbmFtZSBmb3IgdGhpcyBVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyByZW5hbWluZyB0aGlzIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lICggSVVSSSBuZXdVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWaXNpdHMgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGRlY2VuZGFudHMgaW4gcHJlLW9yZGVyIGZhc2hpb24uCi0gICAqIEZvciBlYWNoIHJlc291cmNlLCB3aGV0aGVyIGEgZm9sZGVyIG9yIGEgbGVhZiwgdGhlIGdpdmVuCi0gICAqIElVUklWaXNpdG9yJ3MgdmlzaXQoKSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIElVUkkgb2YgdGhlCi0gICAqIHJlc291cmNlLiBJZiBJVVJJVmlzaXRvci52aXNpdCgpIHJldHVybnMgZmFsc2UsIHRoZSB2aXNpdGluZwotICAgKiBhbGdvcml0aG0gd2lsbCAicHJ1bmUiIHRoZSBkZWNlbmRhbnRzIG9mIHRoZSByZXNvdXJjZSBhbmQKLSAgICogY2Fycnkgb24gdmlzaXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHRyZWUuIElmIElVUklWaXNpdG9yLnZpc2l0KCkKLSAgICogcmV0dXJucyB0cnVlLCB0aGUgdmlzaXRpbmcgYWxnb3JpdGhtIHdpbGwgY29udGludWUgaXRzIHdhbGsKLSAgICogZG93biB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSAgICogQHBhcmFtIHVyaVZpc2l0b3IgdGhlIHZpc2l0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCByZXNvdXJjZSB2aXNpdGVkLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdmlzaXRpbmcgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQgKCBJVVJJVmlzaXRvciB1cmlWaXNpdG9yICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQXMgZm9yIHZpc2l0KElVUklWaXNpdG9yKSwgZXhjZXB0IG9ubHkgcmVzb3VyY2UgVVJJcyB0aGF0IGFyZQotICAgKiBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLiBJZiBhIGZvbGRlciByZXNvdXJjZQotICAgKiBmYWlscyB0byBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyLCB0aGlzIHdpbGwgbm90IHByZXZlbnQgdGhlCi0gICAqIHZpc2l0aW5nIGFsZ29yaXRobSBmcm9tIHdhbGtpbmcgdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqIEl0IHJlbWFpbnMgdGhlIGpvYiBvZiB0aGUgdmlzaXRvciB0byBjaG9vc2Ugd2hldGhlciBvciBub3QgdG8KLSAgICogcHJ1bmUgYSBicmFuY2ggYnkgcmV0dXJuaW5nIGZhbHNlIG9yIHRydWUuCi0gICAqIEBwYXJhbSB1cmlWaXNpdG9yIHRoZSB2aXNpdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcmVzb3VyY2UgdmlzaXRlZC4KLSAgICogQHBhcmFtIHVyaUZpbHRlciB0aGUgcmVzb3VyY2UgZmlsdGVyLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdmlzaXRpbmcgdGhpcyByZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQgKCBJVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBJVVJJRmlsdGVyIHVyaUZpbHRlciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gICAqIGhpZXJhcmNoaWNhbCwgbm9uLWxlYWYgSVVSSS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotICAgKiB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGxvY2F0aW5nIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQXMgZm9yIGxpc3QoKSwgZXhjZXB0IG9ubHkgVVJJcyB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4KLSAgICogZmlsdGVyIGFyZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwKLSAgICogdGhvdWdoIGl0IG1heSByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheS4KLSAgICogQHBhcmFtIHVyaUZpbHRlciB0aGUgY2hpbGQgZmlsdGVyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpbHRlcmVkIGNoaWxkcmVuIGZvciB0aGlzIFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGxvY2F0aW5nIHRoZSBjaGlsZHJlbiBmb3IgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QgKCBJVVJJRmlsdGVyIHVyaUZpbHRlciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBhc1VSTCgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gICAqIGluIG90aGVyIHdvcmRzLCBpZiB0aGlzIElVUkkgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgVVJMLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc1VSTCAoKTsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIGEgVVJMIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSAgICogVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSAgICogd2lsbCBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkKLSAgICogaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgcmVwcmVzZW50YWJsZSBhcyBVUkxzLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgcmV0dXJuaW5nIHRoaXMgVVJMLgotICAgKi8KLSAgcHVibGljIFVSTCBhc1VSTCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXNGaWxlKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgSVVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBGaWxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBJVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSBiYWNrZWQgYnkgcGh5c2ljYWwgZmlsZXMuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyByZXR1cm5pbmcgdGhpcyBGaWxlLgotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgSVVSSSBhcyBhIHN0cmluZy4KLSAgICogRXF1aXZhbGVudCB0byB0b1N0cmluZygpLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBhc1N0cmluZyAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzM0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBpcyBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBJVVJJIGFuZCBJVVJJU2NoZW1lIG9iamVjdHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJRmFjdG9yeQotewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBJVVJJIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiB0aGUgbmV3IFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVyaSBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsaWQgVVJJLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggU3RyaW5nIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLSAgICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIHVzZSB0byBjcmVhdGUgdGhpcyBVUkkKLSAgICogQHJldHVybiB0aGUgbmV3IFVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVybCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsaWQgdXJsLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggVVJMIHVybCApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSVNjaGVtZSBmb3IgdGhlIGdpdmVuIHNjaGVtZSBzdHJpbmcuCi0gICAqIElmIHRoZSBzdHJpbmcgY29udGFpbnMgbm8gY29sb25zLCB0aGUgZW50aXJlIHN0cmluZyBpcyBpbnRlcnByZXR0ZWQKLSAgICogYXMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtZS4gSWYgdGhlIHN0cmluZyBjb250YWlucyBhIGNvbG9uLCB0aGVuIHRoZQotICAgKiBzdWJzdHJpbmcgdXAgdG8gYnV0IGV4Y2x1ZGluZyB0aGUgZmlyc3QgY29sb24gaXMgaW50ZXJwcmV0dGVkIGFzIHRoZQotICAgKiBuYW1lIG9mIHRoZSBzY2hlbWUsIG1lYW5pbmcgdGhlIGNhbGxlciBjYW4gcGFzcyBpbiBhbnkgSVVSSSBzdHJpbmcgaW4KLSAgICogb3JkZXIgdG8gZ2V0IGEgSVVSSVNjaGVtZSBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1lT3JVUkkgdGhlIHNjaGVtZSBvciBVUkkgZnJvbSB3aGljaCB0byBjcmVhdGUgdGhlIHNjaGVtZS4KLSAgICogQHJldHVybiB0aGUgbmV3IFNjaGVtZS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgc2NoZW1lT3JVcmkgcGFyYW1ldGVyIGRvZXMgbm90IGNvbnRhaW4KLSAgICogYSB2YWxpZCBzY2hlbWUgb3IgVVJJIG5hbWUuCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBuZXdVUklTY2hlbWUgKCBTdHJpbmcgc2NoZW1lT3JVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4NWMyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL0lVUklGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLgotICogUmVmZXIgdG8ge0BsaW5rIElVUkkjZ2V0Q2hpbGRyZW59LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSUZpbHRlcgotewotICAvKioKLSAgICogRmlsdGVycyB0aGUgZ2l2ZW4gSVVSSS4KLSAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2UgdG8gZmlsdGVyLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlc291cmNlIG1hdGNoZXMgdGhlIGZpbHRlciwKLSAgICogZmFsc2UgaWYgaXQgZG9lcyBub3QuCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpIGlzIGFjY2VwdGVkLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBJZiB0aGUgZmlsdGVyIGZhaWxzIHRvIGFuYWx5emUgdGhlIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyAoIElVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVNjaGVtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODc2MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQSBJVVJJU2NoZW1lIHJlcHJlc2VudHMgYSBzaW5nbGUgc2NoZW1lIGZvciBzb21lIGEgZmFtaWx5IG9mCi0gKiBVbml2ZXJhbCBSZXNvdXJjZSBJZGVudGlmaWVycy4gRXhhbXBsZXMgaW5jbHVkZSAiZmlsZSIsICJodHRwIgotICogYW5kICJwbGF0Zm9ybSIgKEVjbGlwc2UpLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSVNjaGVtZQotewotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIGJlIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBJVVJJLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiB0aGUgdXJpIHNwZWNpZmllZCBpcyBub3QgdmFsaWQgb3IKLSAgICogY2FuIG5vdCBiZSBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJICggU3RyaW5nIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB1c2VkIHRvIGNyZWF0ZSB0aGUgVVJJLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgSVVSSS4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgdGhlIHVybCBzcGVjaWZpZWQgaXMgbm90IHZhbGlkIG9yCi0gICAqIGNhbiBub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSSAoIFVSTCB1cmwgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IElVUkkuCi0gICAqIEB0aHJvd3MgVVJJRXhjZXB0aW9uIGlmIHRoZSB1cmkgc3BlY2lmaWVkIGlzIG5vdCB2YWxpZCBvcgotICAgKiBjYW4gbm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkgKCBJVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvcGVyIG5hbWUgb2YgdGhlIHNjaGVtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCk7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0byBjaGVjayBmb3IgdmFsaWRpdHkuCi0gICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBJVVJJIHNhdGlzZmllcyB0aGUKLSAgICogZ3JhbW1hdGljYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBzY2hlbWUuIEFic29sdXRlIFVSSXMgbXVzdAotICAgKiBiZWdpbiB3aXRoICI8c2NoZW1lPjoiLiBSZWxhdGl2ZSBVUklzIG11c3QgZWl0aGVyIG5vdCBjb250YWluCi0gICAqIGEgY29sb24sICI6Iiwgb3IgaXQgbXVzdCBiZWdpbiB3aXRoICIuLyIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICggSVVSSSB1cmkgKTsKLQotICAvKioKLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRvIGNoZWNrIGZvciB2YWxpZGl0eS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotICAgKiBJVVJJIGlzIHZhbGlkLiBUaGUgc2V2ZXJpdHkgYW5kIG1lc3NhZ2Ugb2YgdGhlIFN0YXR1cyBvYmplY3QKLSAgICogd2lsbCBkZXNjcmliZSB0aGlzLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUgKCBJVVJJIHVyaSApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9JVVJJVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZhM2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvSVVSSVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBJVVJJI3Zpc2l0fS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUklWaXNpdG9yCi17Ci0gIC8qKgotICAgKiBWaXNpdHMgdGhlIGdpdmVuIElVUkkuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIHRvIHZpc2l0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMgc2hvdWxkIGJlIHZpc2l0ZWQsCi0gICAqIG9yIGZhbHNlIGlmIHRoZXkgc2hvdWxkIG5vdCBiZSB2aXNpdGVkLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBJZiB0aGUgdmlzaXQgbWV0aG9kIGZhaWxzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gdmlzaXQgKCBJVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NiMmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVNjaGVtZTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJVVJJRmFjdG9yeSBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVVSSUZhY3RvcnkgaW1wbGVtZW50cyBJVVJJRmFjdG9yeQotewotICBwcml2YXRlIEhhc2h0YWJsZSAgICBzY2hlbWVzXyA9IG5ldyBIYXNodGFibGUoKTsgIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB1cmkgdGhlIHVyaSB0byBiZSBjcmVhdGVkLgotICAgKiBAcmV0dXJuIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoaXMgVVJJLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElVUklTY2hlbWUgc2NoZW1lID0gbmV3VVJJU2NoZW1lKCB1cmksIGZhbHNlICk7Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZS5uZXdVUkkoIHVyaSApOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB0byB1c2UgdG8gY3JlYXRlIHRoaXMgdXJpLgotICAgKiBAcmV0dXJuIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSVVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoaXMgVVJJLgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElVUklTY2hlbWUgc2NoZW1lID0gbmV3VVJJU2NoZW1lKCB1cmwudG9TdHJpbmcoKSwgZmFsc2UgKTsKLSAgICAKLSAgICByZXR1cm4gc2NoZW1lLm5ld1VSSSggdXJsICk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNjaGVtZU9yVVJJIHRoZSBzY2hlbWUgbmFtZSBvciBVUkkgZnJvbSB3aGljaCB0aGlzIHNjaGVtZSBpcyAKLSAgICogdG8gYmUgY3JlYXRlZC4KLSAgICogQHJldHVybiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IElVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLgotICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gICAqIGFzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWUuIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBjb2xvbiwgdGhlbiB0aGUKLSAgICogc3Vic3RyaW5nIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGZpcnN0IGNvbG9uIGlzIGludGVycHJldHRlZCBhcyB0aGUKLSAgICogbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IElVUkkgc3RyaW5nIGluCi0gICAqIG9yZGVyIHRvIGdldCBhIElVUklTY2hlbWUgb2JqZWN0LgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhpcyBVUkkgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIElVUklTY2hlbWUgbmV3VVJJU2NoZW1lKFN0cmluZyBzY2hlbWVPclVSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSVNjaGVtZSggc2NoZW1lT3JVUkksIHRydWUgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhIHNjaGVtZSBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLgotICAgKiAKLSAgICogQHBhcmFtIHByb3RvY29sIHRoZSBwcm90b2NvbC4KLSAgICogQHBhcmFtIHNjaGVtZSB0aGUgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJTY2hlbWUoIFN0cmluZyBwcm90b2NvbCwgSVVSSVNjaGVtZSBzY2hlbWUgKQotICB7Ci0gICAgc2NoZW1lc18ucHV0KCBwcm90b2NvbCwgc2NoZW1lICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVVSSVNjaGVtZSBuZXdVUklTY2hlbWUoU3RyaW5nIHNjaGVtZU9yVVJJLCBib29sZWFuIGNoZWNrRm9yU2NoZW1lICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVVSSVNjaGVtZSBuZXdTY2hlbWUgPSBudWxsOwotICAgIAotICAgIGlmKCBzY2hlbWVPclVSSSA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgCi0gICAgICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfTlVMTF9BUkdfU1BFQ0lGSUVELCAibmV3VVJJU2NoZW1lIiksIG51bGwgKSApOwotICAgIH0KLSAgICAKLSAgICBpbnQgY29sb24gICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCc6Jyk7Ci0gICAgaW50IHNsYXNoICAgID0gc2NoZW1lT3JVUkkuaW5kZXhPZignLycpOwotICAgIAotICAgIC8vIEEgcHJvdG9jb2wgd2FzIHNwZWNpZmllZC4gIE5vdGU6IGEgY29sb24gYXBwZWFyaW5nIGFmdGVyIGEgcGF0aCBpcyBub3QKLSAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sIGZvciB0aGlzIElVUkkuCi0gICAgaWYoICggY2hlY2tGb3JTY2hlbWUgJiYgY29sb24gPT0gLTEgKSB8fAotICAgICAgICAoIGNvbG9uICE9IC0xICYmIHNsYXNoID09IC0xKSB8fCAKLSAgICAgICAgKCBjb2xvbiAhPSAtMSAmJiBjb2xvbiA8IHNsYXNoICkgKQotICAgIHsKLSAgICAgIC8vIElmIGNvbG9uIGlzIC0xIHRoZW4gd2Ugd2lsbCB0cmVhdCB0aGUgZW50aXJlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgcHJvdG9jb2wuCi0gICAgICBpZiggY29sb24gPT0gLTEgKSBjb2xvbiA9IHNjaGVtZU9yVVJJLmxlbmd0aCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSBzY2hlbWVPclVSSS5zdWJzdHJpbmcoMCwgY29sb24gKTsKLSAgICAgIG5ld1NjaGVtZSAgICAgICA9IChJVVJJU2NoZW1lKXNjaGVtZXNfLmdldCggcHJvdG9jb2wgKTsKLSAgICAgIAotICAgICAgaWYoIG5ld1NjaGVtZSA9PSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAKLSAgICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX1NDSEVNRV9OT1RfRk9VTkQsIHNjaGVtZU9yVVJJICksIG51bGwgKSApOwotICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBzY2hlbWVPclVSSS5zdGFydHNXaXRoKCAiLyIpICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUUsIHNjaGVtZU9yVVJJICksIG51bGwgKSApOwotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBuZXdTY2hlbWUgPSBuZXcgUmVsYXRpdmVTY2hlbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ld1NjaGVtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC91cmkvVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjc1NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3VyaS9VUklFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgSVVSSSBjbGFzc2VzLgotICogRXZlcnkgVVJJRXhjZXB0aW9uIGNhcnJpZXMgYSBJVVJJIGFuZCBhIFN0YXR1cywgZWFjaCBvZiB3aGljaCBtYXkKLSAqIGJlIG51bGwuIFRoZSBnZXRNZXNzYWdlKCkgbWV0aG9kIGFzIGluaGVyaXRlZCBmcm9tIEV4Y2VwdGlvbiB3aWxsCi0gKiByZXR1cm4gdGhlIG1lc3NhZ2UgZnJvbSB0aGUgVVJJRXhjZXB0aW4ncyBTdGF0dXMgb2JqZWN0LCBpZiBhbnkuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVSSUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTgxMzAyNzE0MjQ3NTYwMThMOwotCi0gIC8qKgotICAgKiBBIFN0YXR1cyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBleGNlcHRpb24sCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSVN0YXR1cyBzdGF0dXM7Ci0KLSAgLyoqCi0gICAqIFRoZSBJVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSVVSSSB1cmk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIFN0YXR1cy4KLSAgICogVGhlIHN0YXR1cyBtYXkgYmUgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBVUklFeGNlcHRpb24gKCBJU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIGZvciB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBJVVJJLAotICAgKiBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIGZvciB0aGlzIGV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIHVyaSB0aGUgdXJpIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIElTdGF0dXMgc3RhdHVzLCBJVVJJIHVyaSApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMgIT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBudWxsKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFN0YXR1cyBvYmplY3QgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzICgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSVVSSSBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgSVVSSSBnZXRVUkkgKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5Yzk1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9Db25zb2xlRWNsaXBzZUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuTnVsbFN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5TaW1wbGVVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGUuRmlsZVNjaGVtZTsKLQotCi0vKioKLSAqICBUaGlzIGNsYXNzIGlzIGludGVuZGVkIGZvciB1c2UgaW4gYSBoZWFkbGVzcyBFY2xpcHNlIGVudmlyb25tZW50LiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50IGltcGxlbWVudHMgSUVudmlyb25tZW50Ci17Ci0JcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5ICB1cmlGYWN0b3J5XyAgICAgID0gbnVsbDsKLQlwcml2YXRlIElTdGF0dXNIYW5kbGVyICAgICBzdGF0dXNIYW5kbGVyXyAgID0gbnVsbDsKLQkgIAotCXB1YmxpYyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50KCkKLQl7Ci0JICB0aGlzKCBuZXcgTnVsbFN0YXR1c0hhbmRsZXIoKSApOwkKLQl9Ci0JCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoIElTdGF0dXNIYW5kbGVyICBzdGF0dXNIYW5kbGVyICkKLQl7Ci0JICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLQkgIHN0YXR1c0hhbmRsZXJfICAgPSBzdGF0dXNIYW5kbGVyOwotCSAgICAKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAicGxhdGZvcm0iLCBuZXcgRWNsaXBzZVNjaGVtZSggdGhpcyApICk7Ci0JICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggImZpbGUiLCBuZXcgRmlsZVNjaGVtZSgpICk7Ci0JfQotCQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0TG9nKCkKLQkgKi8KLQlwdWJsaWMgSUxvZyBnZXRMb2coKSAKLQl7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxvZygpOwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0U3RhdHVzSGFuZGxlcigpCi0JICovCi0JcHVibGljIElTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKSAKLQl7Ci0JCXJldHVybiBzdGF0dXNIYW5kbGVyXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0VVJJRmFjdG9yeSgpCi0JICovCi0JcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKSAKLQl7Ci0JCXJldHVybiB1cmlGYWN0b3J5XzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDc1ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIyMSAgIDEwMDM2NCBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTG9nIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nIAotewotCXByaXZhdGUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2cgbG9nZ2VyOwotCQotCXB1YmxpYyBFY2xpcHNlTG9nKCkgCi0JewotCQlQbHVnaW4gcGx1Z2luID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQkJCi0gICAgbG9nZ2VyID0gcGx1Z2luLmdldExvZygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIAotICB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uRW52aXJvbm1lbnQuSUxvZyNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG9wdGlvbikgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC90cmFjZS8iCi0JCQkJKyBvcHRpb24pKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgCi0JewotCQkKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQkJY2FzZSBJTG9nLkVSUk9SIDoKLQkJCQl7Ci0JCQkJCWlmIChpc0VuYWJsZWQoImVycm9yIikpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCSsgb2JqZWN0OwotCQkJCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQljYXNlIElMb2cuV0FSTklORyA6Ci0JCQkJewotCQkJCQlpZiAoaXNFbmFibGVkKCJ3YXJuaW5nIikpCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotCQkJCQkJCQkrICJXICIgKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kCi0JCQkJCQkJCSsgIjogb2JqZWN0PSIgKyBvYmplY3Q7Ci0JCQkJCQlsb2coIHNldmVyaXR5LCBtZXNzYWdlLCBudWxsICk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UgSUxvZy5JTkZPIDoKLQkJCQl7Ci0JCQkJCWlmIChpc0VuYWJsZWQoImluZm8iKSkKLQkJCQkJewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCQkrIG9iamVjdDsKLQkJCQkJCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2UsIG51bGwgKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBJU3RhdHVzIHN0YXR1cykgewotCQlsb2coc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KXN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZU51bSwgY2FsbGVyLCBtZXRob2QsIChPYmplY3QpbnVsbCApOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sCi0JCQlPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0KSAKLQl7Ci0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkKLQkJewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIiArIGNhbGxlcgotCQkJCQkrICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IiArIG9iamVjdDsKLQkJCWxvZyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCApOwotCQl9CQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZyNsb2coaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sCi0JCQlPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSAKLQl7Ci0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkgCi0JCXsKLQkJCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kOwotCQkJbG9nKCBzZXZlcml0eSwgbWVzc2FnZSwgdGhyb3dhYmxlICk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIElTdGF0dXMgc3RhdHVzKSAKLQl7Ci0JCWxvZ2dlci5sb2coIHN0YXR1cyApOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlTnVtU3RyaW5nKGludCBtZXNzYWdlTnVtKSB7Ci0JCVN0cmluZyBtZXNzYWdlTnVtU3RyaW5nID0gIklXQUIiOwotCQlpZiAobWVzc2FnZU51bSA+IDk5OTkgfHwgbWVzc2FnZU51bSA8IDApCi0JCQltZXNzYWdlTnVtID0gOTk5OTsgLy9kZWZhdWx0IG1lc3NhZ2UgbnVtYmVyCi0JCW1lc3NhZ2VOdW1TdHJpbmcgKz0gKG5ldyBJbnRlZ2VyKG1lc3NhZ2VOdW0pKS50b1N0cmluZygpOwotCQlyZXR1cm4gbWVzc2FnZU51bVN0cmluZzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyggaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4YyApCi0JewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyggc2V2ZXJpdHksICJpZCIsIDAsIG1lc3NhZ2UsIGV4YyApOwotCQlsb2dnZXIubG9nKCBzdGF0dXMgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDJjNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU2NoZW1lIGltcGxlbWVudHMgSVVSSVNjaGVtZQotewotICBwcml2YXRlIElFbnZpcm9ubWVudCAgICAgIGVudmlyb25tZW50XzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU2NoZW1lKCBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgZW52aXJvbm1lbnRfID0gZW52aXJvbm1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybSI7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChJVVJJIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAKLSAgICBpZiggdXJpID09IG51bGwgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS5pc1ZhbGlkKCB1cmkgKTsKLSAgICAgICAgCi0gICAgICBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbmV3VVJJID0gbnVsbDsKLSAgICAKLSAgICBpZiggdXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoICJwbGF0Zm9ybToiKSApCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIGhhcyBiZWVuIHNwZWNpZmllZCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgbmV3VVJJID0gdXJpOwotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkgPT0gbnVsbCB8fCB1cmkuaW5kZXhPZiggIjoiKSAhPSAtMSApCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIHVyaSBpcyBub3QgYWxsb3dlZCB0byBjb250YWluIHNvbWUgb3RoZXIgcHJvdG9jb2wuIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMLHVyaSksIG51bGwgKSApOwotICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpLnN0YXJ0c1dpdGgoICIvIikgKQotICAgIHsKLSAgICAgIC8vIFRoZSBwbGF0Zm9ybSBzY2hlbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBzbyB3ZSB3aWxsIGFkZCBpdC4KLSAgICAgIG5ld1VSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgdXJpOwotICAgIH0KLSAgICAKLSAgICBpZiggbmV3VVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBFY2xpcHNlVVJJKCBuZXdVUkksIGVudmlyb25tZW50XyApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKElVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmkgPT0gbnVsbCA/IG51bGwgOiB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJsID09IG51bGwgPyBudWxsIDogdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVVSSSB1cmkpCi0gIHsKLSAgICBJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIGlmKCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJyZWxhdGl2ZSIpICkgcmV0dXJuIHNjaGVtZS52YWxpZGF0ZSggdXJpICk7Ci0gICAgICAKLSAgICAgIGdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaS50b1N0cmluZygpICk7Ci0gICAgICBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgc3RhdHVzID0gZXhjLmdldFN0YXR1cygpOyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlICJwbGF0Zm9ybTovcmVzb3VyY2UiIElQYXRoIGdpdmVuIGEgdXJsCi0gICAqIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24gCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VGaWxlID0gbnVsbDsKLSAgICBVUkwgICAgdXJsICAgICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKCB1cmkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7IAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMLCB1cmkgKSwgZXhjICkgKTsKLSAgICB9Ci0gICAgCi0gICAgaWYoIHVybCA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfSU5WQUxJRF9QTEFURk9STV9VUkwsIHVyaSApLCBudWxsICkgKTsKLSAgICB9Ci0gICAgaWYoIHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSApIAotICAgIHsKLSAgICAgIFN0cmluZyByZXNvdXJjZVVSTCA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAKLSAgICAgIGlmIChyZXNvdXJjZVVSTC5zdGFydHNXaXRoKCIvcmVzb3VyY2UiKSkgCi0gICAgICB7Ci0gICAgICAgIHJlc291cmNlRmlsZSA9IHJlc291cmNlVVJMLnN1YnN0cmluZygxMCk7ICAgLy8gb21pdCB0aGUgIi9yZXNvdXJjZSIgcG9ydGlvbgotICAgICAgfQotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMLHVybC5nZXRGaWxlKCkgKSwgbnVsbCApICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXNvdXJjZUZpbGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGFic29sdXRlUGF0aCBhbiBhYnNvbHV0ZSBJUGF0aAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBsYXRmb3JtIElVUkkgZm9yIHRoaXMgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMRnJvbVBhdGgoIElQYXRoIGFic29sdXRlUGF0aCApCi0gIHsKLSAgICByZXR1cm4gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyBhYnNvbHV0ZVBhdGg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2MmE1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9FY2xpcHNlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlLlJlbGF0aXZlVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkKLXsKLSAgcHJpdmF0ZSBJRW52aXJvbm1lbnQgICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgRWNsaXBzZVNjaGVtZSAgc2NoZW1lXzsKLSAgcHJpdmF0ZSBGaWxlICAgICAgICAgICBmaWxlXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlVVJJKCBTdHJpbmcgdXJpLCBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgc3VwZXIoIHVyaSApOwotICAgIAotICAgIGVudmlyb25tZW50XyAgPSBlbnZpcm9ubWVudDsKLSAgICBzY2hlbWVfICAgICAgID0gbmV3IEVjbGlwc2VTY2hlbWUoIGVudmlyb25tZW50ICk7Ci0gICAgZmlsZV8gICAgICAgICA9IGdldEZpbGUoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2VyYXNlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIElSZXNvdXJjZSBmaWxlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICkgCi0gICAgICB7Ci0gICAgICAgIGlmKCBmaWxlIGluc3RhbmNlb2YgSUZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRmlsZSggKElGaWxlKWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGZpbGUgaW5zdGFuY2VvZiBJRm9sZGVyICkKLSAgICAgICAgewotICAgICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmRlbGV0ZUZvbGRlciggKElGb2xkZXIpZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBjYXRjaCggRXhjZXB0aW9uIGV4YyApIAotICAgIHsgICAgICAKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeSAKLSAgICB7Ci0gICAgICAvLyBJZiBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIGlzIHRocm93IGl0IHdpbGwgYmUgcHJvcG9nYXRlZCBhcwotICAgICAgLy8gYSBVUklFeGNlcHRpb24uCi0gICAgICBJRmlsZSBmaWxlID0gKElGaWxlKWdldFJlc291cmNlKCk7Ci0KLSAgICAgIC8vY2FsbCBnZXRDb250ZW50cyBvbiB0aGUgZWNsaXBzZSBGaWxlIG9iamVjdAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCApIAotICAgICAgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVGhyb3dhYmxlIGV4YyApIAotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZm9sZGVyIGV4aXN0cy4KLSAgICBJVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgIAotICAgIGlmKCAhcGFyZW50LmlzUHJlc2VudCgpICkKLSAgICB7Ci0gICAgICBwYXJlbnQoKS50b3VjaEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZ2V0T3V0U3RyZWFtKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIHB1YmxpYyBJVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc0xlYWYoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIAotICAgICAgICAgIHJlc291cmNlLmV4aXN0cygpICYmIAotICAgICAgICAgIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAKLSAgICAgICAgICAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgSVVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlICAgID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBJVVJJW10gICAgIHVyaUNoaWxkcmVuID0gbmV3IElVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICBJRm9sZGVyICAgICBmb2xkZXIgICA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlW10gY2hpbGRyZW4gICAgPSBmb2xkZXIubWVtYmVycygpOyAgCi0gIAotICAgICAgICB1cmlDaGlsZHJlbiA9IG5ldyBJVVJJW2NoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIElQYXRoIHBhdGggPSBjaGlsZHJlbltpbmRleF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICB1cmlDaGlsZHJlbltpbmRleF0gPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdXJpQ2hpbGRyZW47Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLklVUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoSVVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgSVVSSVtdICAgICByZXN1bHQgICA9IG5ldyBJVVJJWzBdOwotICAgIAotICAgIGlmKCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgIHsKLSAgICAgIElGb2xkZXIgICAgIGZvbGRlciAgID0gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiAgICA9IGZvbGRlci5tZW1iZXJzKCk7ICAgICAgIAotICAgICAgICBWZWN0b3IgICAgICB1cmlDaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgICAgewotICAgICAgICAgIElQYXRoIHBhdGggPSBjaGlsZHJlbltpbmRleF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICBJVVJJICAgdXJpICA9IG5ldyBFY2xpcHNlVVJJKCBzY2hlbWVfLmdldFVSTEZyb21QYXRoKHBhdGgpLCBlbnZpcm9ubWVudF8gKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIHVyaSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cmlDaGlsZHJlbi5hZGQoIHVyaSApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKElVUklbXSl1cmlDaGlsZHJlbi50b0FycmF5KCBuZXcgSVVSSVswXSApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKElVUkkgbmV3VVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoIG5ld1VSSSA9PSBudWxsIHx8ICEobmV3VVJJIGluc3RhbmNlb2YgRWNsaXBzZVVSSSkgKSByZXR1cm47Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRWNsaXBzZVVSSSBuZXdFY2xpcHNlVVJJID0gKEVjbGlwc2VVUkkpbmV3VVJJOwotICAgICAgSVBhdGggICAgICBuZXdQYXRoICAgICAgID0gbmV3IFBhdGgoIHNjaGVtZV8uZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSSggbmV3RWNsaXBzZVVSSS51cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElSZXNvdXJjZSAgcmVzb3VyY2UgICAgICA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2UubW92ZSggbmV3UGF0aCwgdHJ1ZSwgbnVsbCApOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5JVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgeyAKLSAgICAgIGlmKCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgICB7Ci0gICAgICAgIElGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpcmVzb3VyY2U7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmKCBmb2xkZXIubWVtYmVycygpLmxlbmd0aCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIAotICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX0ZPTERFUl9IQVNfQ0hJTERSRU4sIGZvbGRlci50b1N0cmluZygpICksIG51bGwgKSwKLSAgICAgICAgICAgICAgICB0aGlzICk7Ci0JCQkJCQkJCQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvLz8/PyBOb3Qgc3VyZSB3aGF0IHRvIGRvIGlmIHRvdWNoaW5nIGEgZm9sZGVyIGFuZCB0aGUgSVVSSSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZvbGRlci4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLm1ha2VGb2xkZXJQYXRoKCBuZXdQYXRoLAotCQkJICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuSVVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHNvIGRvIG5vdGhpbmcuCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZm9yIHRoaXMgbGVhZiBhbmQgY3JlYXRlIGl0IGlmIHJlcXVpcmVkLgotICAgICAgSVVSSSBwYXJlbnQgPSBwYXJlbnQoKTsKLSAgICAgIAotICAgICAgaWYoICFwYXJlbnQuaXNQcmVzZW50KCkgKQotICAgICAgeyAgCi0gICAgICAgIHBhcmVudCgpLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBHZXQgYW4gb3V0cHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIGZpbGUgYW5kIGltbWVkaWF0ZWx5IGNsb3NlIGl0LgotICAgICAgICAvLyBUaGlzIHNob3VsZCBjcmVhdGUgYSAwIGJ5dGUgZmlsZS4KLSAgICAgICAgZ2V0T3V0U3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgSVBhdGggIHBhdGggICAgICAgICAgICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKHVyaV8pICk7Ci0gICAgU3RyaW5nIGFic29sdXRlUGF0aG5hbWUgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0gICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGFic29sdXRlUGF0aG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLklVUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElQYXRoICAgICAgICBmaWxlICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAKLSAgICBzdHJlYW0gPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtICggZmlsZSwKLSAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsgICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgSVVSSS4KLSAgICogVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSAgICogd2lsbCBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkKLSAgICogaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlICgpCi0gIHsKLSAgCXJldHVybiBmaWxlXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKSAKLSAgewotICAJcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gbmV3IFVSTCggdXJpXyApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgZXhjLmdldE1lc3NhZ2UoKSwgZXhjICksIHRoaXMgKTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgVVJMIHRoZVVSTCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdGhlVVJMID0gYXNVUkwoKTsgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB0aGVVUkwgIT0gbnVsbCA7Ci0gIH0KLQotICBwcml2YXRlIEZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICBTdHJpbmcgcGxhdGZvcm1SZXMgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgICBGaWxlICAgcmVzdWx0ICAgICAgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlfLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXMpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZCh1cmlfLnN1YnN0cmluZyhwbGF0Zm9ybVJlcy5sZW5ndGgoKSwgdXJpXy5sZW5ndGgoKSkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZlYmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBkZWZpbmVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfS4KLSovCi1wdWJsaWMgY2xhc3MgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi17Ci0KLSAgSVBhdGggICAgICAgICAgICAgICAgIGZGaWxlUGF0aDsKLSAgSVN0YXR1c0hhbmRsZXIgICAgICAgICBmU3RhdHVzSGFuZGxlcjsKLSAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICBmT3BlbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gVGhlIHdvcmtzcGFjZSBpcyBuZWl0aGVyIGV4YW1pbmVkIG5vcgotICAqIGFsdGVyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4gQWxsIHJlc291cmNlIGNyZWF0aW9uIGlzIGRlZmVycmVkCi0gICogdW50aWwgbGF0ZXIgaW4gdGhlIHN0cmVhbSdzIGxpZmVjeWNsZSwgc3VjaCBhcyBkdXJpbmcgd3JpdGluZwotICAqIG9yIGNsb3N1cmUuCi0gICogPGI+Tm90ZTo8L2I+IFRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhIHN0cmVhbSB0aGF0Ci0gICogd3JpdGVzIHRvIGFuIElGaWxlIGlzIHRvIGNhbGwgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZAotICAqIHtAbGluayBGaWxlUmVzb3VyY2VVdGlscyNuZXdGaWxlT3V0cHV0U3RyZWFtIEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0oKX0KLSAgKiBhbmQgd29yayB3aXRoIHRoZSByZXN1bHRpbmcgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KLSAgKiBEaXJlY3QgY29uc3RydWN0aW9uIG9mIGEgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgKiBAcGFyYW0gZmlsZSBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZSByZXNvdXJjZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGltcGxpZWQgYnkgdGhlCi0gICogcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqLwotICBwdWJsaWMgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtICggCi0gIAkJCUlQYXRoICAgICAgICAgICBmaWxlUGF0aCwgCi0gIAkJCUlTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlcgotICAJCQkpCi0gIHsKLSAgICBmRmlsZVBhdGggPSBmaWxlUGF0aDsKLSAgICBmU3RhdHVzSGFuZGxlciA9IHN0YXR1c0hhbmRsZXI7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBmT3BlbiA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgKiBDbG9zZXMgdGhlIHN0cmVhbS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjbG9zaW5nIHRoZSBzdHJlYW0uCi0gICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZQotICAqIGFuZCBhIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiB3aWxsCi0gICogYmUgdGhyb3duIGVpdGhlciBub3cgb3IgZHVyaW5nIGFuIGVhcmxpZXIge0BsaW5rICN3cml0ZSB3cml0ZX0uCi0gICovCi0gIHB1YmxpYyB2b2lkIGNsb3NlICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFmT3BlbikgcmV0dXJuOwotICAgIGZPcGVuID0gZmFsc2U7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgIGJ5dGVbXSBidWZmZXIgPSBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdGVtcElucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlcik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShmRmlsZVBhdGgsIHRlbXBJbnB1dFN0cmVhbSwgZlN0YXR1c0hhbmRsZXIpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogRmx1c2hlcyB0aGUgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGltcGx5IHRoZSBGaWxlIHJlc291cmNlCi0gICogd2lsbCBiZSBjcmVhdGVkIG9yIGJlY29tZSB2aXNpYmxlIHdpdGhpbiB0aGUgd29ya2JlbmNoLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGFsbCBieXRlcyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiICkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IGJlZ2lubmluZyBhdCBzb21lIG9mZnNldAotICAqIGFuZCBjb250aW51aW5nIGZvciBzb21lIG51bWJlciBvZiBieXRlcyAobGVuKSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgdG8gYmVnaW4gd3JpdGluZy4KLSAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUgKCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbiApCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIsb2ZmLGxlbik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIHdyaXRlLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlICggaW50IGIgKQotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvRmlsZVJlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwZjQzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEVjbGlwc2UgcmVzb3VyY2VzLgotKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlUmVzb3VyY2VVdGlscwotewotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlIHdvcmtzcGFjZV8gPSBudWxsOwotICAvLwotICAvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZVJvb3QgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2VSb290KCkuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IHJvb3RfID0gbnVsbDsKLQotIC8qKgotICAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZVJvb3QgZ2V0V29ya3NwYWNlUm9vdCAoKQotICB7Ci0gICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgewotICAgICAgcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIH0KLSAgICByZXR1cm4gcm9vdF87Ci0gIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlICgpCi0gIHsKLSAgICBpZiAod29ya3NwYWNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyb290XyA9PSBudWxsKQotICAgICAgewotICAgICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdvcmtzcGFjZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGFuIGFycmF5IG9mIHRocmVlIGNvbW1vbiBjaG9pY2VzLiAoaWUuIFllcywgeWVzIGFsbCwgYW5kIGNhbmNlbCApCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENob2ljZVtdIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpIAotICB7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ1knLCBNZXNzYWdlcy5MQUJFTF9ZRVMgKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0EnLCBNZXNzYWdlcy5MQUJFTF9ZRVNfVE9fQUxMICkpOwotICAgIGNob2ljZXMuYWRkKG5ldyBDaG9pY2UoICdDJywgTWVzc2FnZXMuTEFCRUxfQ0FOQ0VMICkpOwotICAgIAotICAgIHJldHVybiAoQ2hvaWNlW10pY2hvaWNlcy50b0FycmF5KG5ldyBDaG9pY2VbY2hvaWNlcy5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRobmFtZSBvciBudWxsIGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGhuYW1lIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSApCi0gIHsKLSAgICBpZiAoYWJzb2x1dGVQYXRobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmluZFJlc291cmNlKG5ldyBQYXRoKGFic29sdXRlUGF0aG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIElSZXNvdXJjZX0KLSAgKiBvZiB0aGUgZ2l2ZW4gYWJzb2x1dGUgcGF0aCBvciBudWxsIGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIDxjb2RlPklQYXRoPC9jb2RlPiBvZiB0aGUgcmVzb3VyY2UuCi0gICogQHJldHVybiBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlICggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGggPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGFic29sdXRlUGF0aCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb3BpZXMgYSBmaWxlIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24KLSAgICogdG8gYW4gRWNsaXBzZSBmb2xkZXIuCi0gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gc291cmNlUGF0aCBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbjwvY29kZT4KLSAgICogaW5zdGFsbCBsb2NhdGlvbiwgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4KLSAgICogSWYgbnVsbCwgdGhlbiB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoCi0gICAqIChpZS4gbnVsbCBpcyBlcXVpdmFsZW50IHRvICIuIikuCi0gICAqIEBwYXJhbSBwYXRobmFtZSBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gY29weS4KLSAgICogVGhlIHBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBhYnNvbHV0ZSBFY2xpcHNlIHBhdGggb2YgdGhlIGZvbGRlciB0bwotICAgKiB3aGljaCB0aGUgZmlsZSB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lIG9mIHRoZQotICAgKiBmaWxlIGlzIHByZXNlcnZlZC4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIGNyZWF0ZUZvbGRlcnMgVGhlIGludGVybWVkaWF0ZSBmb2xkZXIgY3JlYXRpb24gcG9saWN5LCBvbmUgb2YKLSAgICoge0BsaW5rICNDUkVBVEUgQ1JFQVRFfSBvciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLSAgICogPHVsPgotICAgKiA8bGk+PGNvZGU+Q1JFQVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAgKiA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICAqIDwvdWw+Ci0gICAqIEBwYXJhbSBvdmVyd3JpdGVGaWxlIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLSAgICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgICogPHVsPgotICAgKiA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBmaWxlLAotICAgKiBpdCB3aWxsIGJlIHJlcGxhY2VkLgotICAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICAqIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICAqIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0gICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAgKiBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cywKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0gICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgICogbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLSAgICovCi0gICBzdGF0aWMgcHVibGljIHZvaWQgY29weUZpbGUoIFBsdWdpbiBwbHVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHNvdXJjZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCB0YXJnZXRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICBJUGF0aCB0YXJnZXQgPSB0YXJnZXRQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSVBhdGggc291cmNlID0gc291cmNlUGF0aCA9PSBudWxsID8gcGF0aG5hbWUgOiBzb3VyY2VQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0gICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotICAgICAgIGNyZWF0ZUZpbGUodGFyZ2V0LCBpbnB1dCwgc3RhdHVzTW9uaXRvcik7Ci0gICAgIH0KLSAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgIHsKLSAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuTVNHX0VSUk9SX0lPLGUpKTsKLSAgICAgfQotICAgfQotICAgCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gICAqIEBwYXJhbSBmaWxlIC0gdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoIElGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICB7ICAgICAgCi0gICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLSAgICAgIGlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SICkKLSAgICAgICAgewotICAgICAgICAgIHN0YXR1c01vbml0b3IucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBmaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLSAgICB9Ci0gICAgLy9BdCB0aGlzIHBvaW50LCBlaXRoZXIgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCBvciB3ZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAotICAgIC8vIGl0LiBSZXR1cm4gc3VjY2Vzcy4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZm9sZGVyIHVuZGVyIGEgY29udGFpbmVyLgotICAgKiBAcGFyYW0gZm9sZGVyIC0gdGhlIElGb2xkZXIgdG8gYmUgZGVsZXRlZAotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0gICAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0IG9yIGlmIGl0IGV4aXN0cyBhbmQgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVGb2xkZXIoIElGb2xkZXIgZm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0YXR1c0hhbmRsZXIgc3RhdHVzTW9uaXRvciApCi0gICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICB7Ci0gICAgIGlmICghZm9sZGVyLmV4aXN0cygpKSByZXR1cm4gdHJ1ZTsKLQotICAgICBib29sZWFuICAgICBkZWxldGVkICAgPSB0cnVlOwotICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBmb2xkZXIubWVtYmVycygpOwotICAgICAKLSAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykKLSAgICAgewotICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICB7Ci0gICAgICAgICBkZWxldGVkID0gZGVsZXRlRmlsZSgoSUZpbGUpcmVzb3VyY2UsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIChJRm9sZGVyKXJlc291cmNlLCBzdGF0dXNNb25pdG9yKTsKLSAgICAgICB9Ci0KLSAgICAgICBpZiggIWRlbGV0ZWQgKSBicmVhazsKLSAgICAgfQotICAgICAKLSAgICAgaWYoIGRlbGV0ZWQgKQotICAgICB7Ci0gICAgICAgZm9sZGVyLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgYSBmaWxlIG9mIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICogYW5kIHJldHVybnMgaXRzIGhhbmRsZSBhcyBhbiA8Y29kZT5JRmlsZTwvY29kZT4uCi0gICogSWYgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIGEKLSAgKiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIGFuCi0gICogPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0IGlzIHRocm93bi4KLSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KLSAgKiBUaGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgSVBhdGggICAgICAgICAgIGFic29sdXRlUGF0aCwKLSAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0gICAgSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7ICAgIAotICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJSZXNvdXJjZVV0aWxzIiwwLCBOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFLCBhYnNvbHV0ZVBhdGgudG9TdHJpbmcoKSApLG51bGwpKTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9FTVBUWSwgYWJzb2x1dGVQYXRoLnRvU3RyaW5nKCkgKSxudWxsKSk7Ci0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiUmVzb3VyY2VVdGlscyIsMCxOTFMuYmluZCggTWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiwgYWJzb2x1dGVQYXRoLnRvU3RyaW5nKCkgKSxudWxsKSk7Ci0gICAgfQotICAgIElDb250YWluZXIgcGFyZW50ICAgPSBtYWtlRm9sZGVyUGF0aChhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBzdGF0dXNIYW5kbGVyKTsKLSAgICBTdHJpbmcgICAgIGZpbGVOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgCi0gICAgcmV0dXJuIG1ha2VGaWxlKHBhcmVudCwgZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBzdGF0dXNIYW5kbGVyKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZXMgdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+Ci0gICogYSBmaWxlIG9mIHRoZSBnaXZlbiA8Y29kZT5yZWxhdGl2ZVBhdGg8L2NvZGU+Ci0gICogYW5kIHJldHVybnMgaXRzIGhhbmRsZSBhcyBhbiA8Y29kZT5JRmlsZTwvY29kZT4uCi0gICogSWYgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIGEKLSAgKiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIGFuCi0gICogPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0IGlzIHRocm93bi4KLSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KLSAgKiBUaGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdCwKLSAgKiB0aGF0IGlzLCB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgcHJvamVjdHMuCi0gICogQHBhcmFtIGNyZWF0ZUZvbGRlcnMgVGhlIGludGVybWVkaWF0ZSBmb2xkZXIgY3JlYXRpb24gcG9saWN5LCBvbmUgb2YKLSAgKiB7QGxpbmsgI0NSRUFURSBDUkVBVEV9IG9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotICAqIDx1bD4KLSAgKiA8bGk+PGNvZGU+Q1JFQVRFPC9jb2RlPiAtCi0gICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICogZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwgYmUgY3JlYXRlZC4KLSAgKiA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBkbyBub3QgZXhpc3QsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotICAqIDwvdWw+Ci0gICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotICAqIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX0gb3Ige0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0gICogPHVsPgotICAqIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+IC0KLSAgKiBJZiBhIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuCi0gICogPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYSBmaWxlLAotICAqIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICogSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGFuZCBpdCBpcyBub3QgYSBmaWxlLAotICAqIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgKiA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzLAotICAqIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgKiA8L3VsPgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZS4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIElGaWxlIGNyZWF0ZUZpbGUgKAotICAgIElQcm9qZWN0ICAgICAgICBwcm9qZWN0LAotICAgIElQYXRoICAgICAgICAgICByZWxhdGl2ZVBhdGgsCi0gICAgSW5wdXRTdHJlYW0gICAgIGlucHV0U3RyZWFtLAotICAgIElTdGF0dXNIYW5kbGVyICAgc3RhdHVzTW9uaXRvciApCi0gCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsKLSAgICBJUGF0aCBhYnNvbHV0ZVBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKHJlbGF0aXZlUGF0aCk7Ci0gICAgcmV0dXJuIGNyZWF0ZUZpbGUoYWJzb2x1dGVQYXRoLCBpbnB1dFN0cmVhbSwgc3RhdHVzTW9uaXRvcik7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gQWN0dWFsIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZQotICAqIG1heSBvY2N1ciBkdXJpbmcgY3JlYXRpb24gb2YgdGhlIHN0cmVhbSwgd2hpbGUgd3JpdGluZyB0bwotICAqIHRoZSBzdHJlYW0sIG9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICogQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nCi0gICogYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2lsbCBiZSB0aHJvd24KLSAgKiBhdCBzb21lIHBvaW50IGluIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN0cmVhbQotICAqIGlmIHRoZSBmaWxlIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBBbiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHRpZWQgdG8gdGhlIGZpbGUgcmVzb3VyY2UuCi0gICogQWN0dWFsIGNoZWNrcyBvZiBvciBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGFzIGVhcmx5IGR1cmluZwotICAqIHN0cmVhbSBjcmVhdGlvbiwgY2xvc3VyZSwgb3IgYW55IHRpbWUgaW4gYmV0d2Vlbi4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqIFJlYXNvbnMgaW5jbHVkZToKLSAgKiA8b2w+Ci0gICogPGxpPlRoZSBwcm9qZWN0IG9mIHRoZSBnaXZlbiBmaWxlJ3MgcGF0aCBkb2VzIG5vdCBleGlzdC4KLSAgKiA8bGk+QSBub24tZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMuCi0gICogPGxpPkEgZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMsIGFuZCA8Y29kZT5vdmVyd3JpdGVGaWxlPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8bGk+T25lIG9yIG1vcmUgaW50ZXJtZWRpYXRlIGZvbGRlcnMgdG8gdGhlIGdpdmVuIGZpbGUKLSAgKiBkbyBub3QgZXhpc3QsIGFuZCA8Y29kZT5jcmVhdGVGb2xkZXJzPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8L29sPgotICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIG5ld0ZpbGVPdXRwdXRTdHJlYW0gKAotICAgICAgIElQYXRoICAgICAgICAgICAgZmlsZSwKLSAgICAgICBJU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyICkKLSAKLSAgewotICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtKGZpbGUsIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIE5hdWdodHkgYml0cy4uLgotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLwotICAvLyBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotICAvLyBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0gIC8vCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotICAgKiBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0gICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgdGhlIHJlc291cmNlIGNvbnRleHQgZm9yIG1ha2luZyBmb2xkZXJzLgotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIHRoZSBwYXRoIG9mIGZvbGRlcnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZC4KLSAgICogQHBhcmFtIHN0YXR1c0hhbmRsZXIgdGhlIHN0YXR1cyBoYW5kbGVyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElDb250YWluZXIgb2YgdGhlIGNyZWF0ZWQgZm9sZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoICgKLSAgICBJUGF0aCAgICAgICAgICAgIGFic29sdXRlUGF0aCwKLSAgICBJU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyICkKLSAgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPD0gMSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBtYWtlRm9sZGVyUGF0aChhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICByZXR1cm4gbWFrZUZvbGRlcihwYXJlbnQsZm9sZGVyTmFtZSwgc3RhdHVzSGFuZGxlciApOwotICAgIH0KLSAgfQotICAvLwotICAvLyBDcmVhdGVzIGEgZm9sZGVyIHVuZGVyIGEgY29udGFpbmVyLgotICAvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLSAgLy8KLSBwcml2YXRlIHN0YXRpYyBJRm9sZGVyIG1ha2VGb2xkZXIgKAotICAgIElDb250YWluZXIgICAgICAgcGFyZW50LAotICAgIFN0cmluZyAgICAgICAgICAgZm9sZGVyTmFtZSwKLSAgICBJU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyICkKLSAgCi0gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgY2hpbGQgID0gcGFyZW50LmZpbmRNZW1iZXIoZm9sZGVyTmFtZSk7Ci0gICAgCi0gICAgaWYoIGNoaWxkID09IG51bGwgKQotICAgIHsgICAgICAKLSAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLSAgICAgIHJldHVybiBmb2xkZXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICByZXR1cm4gKElGb2xkZXIpY2hpbGQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLSAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJCU5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUiwgcGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCkpLAotCQkJbnVsbCApICk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZpbGUgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLSAgICBJQ29udGFpbmVyICAgICAgIHBhcmVudCwKLSAgICBTdHJpbmcgICAgICAgICAgIGZpbGVOYW1lLAotICAgIElucHV0U3RyZWFtICAgICAgaW5wdXRTdHJlYW0sCi0gICAgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlciApCi0gCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSBjaGlsZCAgPSBwYXJlbnQuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0gICAgCi0gICAgaWYoIGNoaWxkICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgICBpZiggY2hpbGQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICAgewotICAgICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0gICAgICAgICAgZmlsZXNbMF0gPSAoSUZpbGUpY2hpbGQ7Ci0gICAgICAgICAgCi0gICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzSGFuZGxlci5yZXBvcnQoIHN0YXR1cyApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCggU3RhdHVzRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9DaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBleGlzdGluZyBmaWxlLgotICAgICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGZpbGVOYW1lKSApOwotICAgICAgICBmaWxlLnNldENvbnRlbnRzKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgICAgICAgICAgIDAsIAotCQkJCSAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZJTEUsIHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSkpLAotCQkJCQkgIG51bGwgKSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZS4KLSAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZSggbmV3IFBhdGgoZmlsZU5hbWUpICk7Ci0gICAgICBmaWxlLmNyZWF0ZSggaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotICAgICAgCi0gICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA4ZWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9lY2xpcHNlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLmVudmlyb25tZW50IjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19OVUxMX0FSR19TUEVDSUZJRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19TQ0hFTUVfTk9UX0ZPVU5EOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfQUJTT0xVVEVfUEFUSF9XSVRIT1VUX1NDSEVNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX1VSSV9OT1RfUkVMQVRJVkU7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19JTlZBTElEX1BMQVRGT1JNX1VSTDsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19JTlZBTElEX0ZJTEVfVVJMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEU7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUEFUSF9FTVBUWTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9QQVRIX05PVF9GT0xERVI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRTsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTVNHX0VSUk9SX0lPOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfWUVTOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfWUVTX1RPX0FMTDsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NBTkNFTDsgCi0gIAotICBzdGF0aWMKLSAgewotICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoIEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L2VjbGlwc2UvZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MDhhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvZWNsaXBzZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGZvciBTaW1wbGVVUklGYWN0b3J5Ci0jCi1NU0dfTlVMTF9BUkdfU1BFQ0lGSUVEPU51bGwgc3BlY2lmaWVkIGFzIGFyZ3VtZW50IHRvIHswfS4KLU1TR19TQ0hFTUVfTk9UX0ZPVU5EPVNjaGVtZSBub3QgZm91bmQgZm9yIFVSSSB7MH0uCi1NU0dfQUJTT0xVVEVfUEFUSF9XSVRIT1VUX1NDSEVNRT1BYnNvbHV0ZSBwYXRoIHNwZWNpZmllZCB3aXRob3V0IGEgc2NoZW1lIGZvciBVUkkgezB9LgotCi0jCi0jIENvbW1vbiBNZXNzYWdlcwotIwotTVNHX1VSSV9OT1RfUkVMQVRJVkU9VVJMOiB7MH0gaXMgbm90IHJlbGF0aXZlLgotTVNHX0VSUk9SX1VORVhQRUNURURfRVJST1I9VW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJlZC4KLU1TR19JTlZBTElEX1BMQVRGT1JNX1VSTD1JbnZhbGlkIFVSTDogezB9IGZvciBhbiBFY2xpcHNlIHBsYXRmb3JtLgotTVNHX0lOVkFMSURfRklMRV9VUkw9SW52YWxpZCBVUkw6IHswfSBmb3IgdGhlIGZpbGUgcHJvdG9jb2wKLQotIwotIyBNZXNzYWdlcyBmb3IgUmVzb3VjZVV0aWxzCi0jCi1NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEU9UGF0aCB7MH0gaXMgbm90IGFic29sdXRlIGZvciBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUEFUSF9FTVBUWT1QYXRoIHswfSBpcyBlbXB0eSB3aGlsZSBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSPVBhdGggezB9IGlzIG5vdCBhIGZvbGRlciBmb3IgY3JlYXRpbmcgYSBmaWxlLgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVI9UmVzb3VyY2UgezB9IGlzIG5vdCBhIGZvbGRlci4KLU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRT1UaGUgZm9sbG93aW5nIHBhdGggaXMgbm90IGEgcmVzb3VyY2U6IHswfS4KLU1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOPUNhbiBub3QgY3JlYXRlIGZvbGRlcjogezB9IHRoYXQgYWxyZWFkeSBoYXMgY2hpbGRyZW4uCi1NU0dfRVJST1JfSU89QW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlc291cmNlICJ7MH0iLgotCi1MQUJFTF9ZRVM9WWVzCi1MQUJFTF9ZRVNfVE9fQUxMPVllcyBBbGwKLUxBQkVMX0NBTkNFTD1DYW5jZWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9wbHVnaW4vRW52aXJvbm1lbnRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9wbHVnaW4vRW52aXJvbm1lbnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzMDQ1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcGx1Z2luL0Vudmlyb25tZW50UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNjAyMjEgICAxMDAzNjQgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5wbHVnaW4uRW52aXJvbm1lbnRQbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50UGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17CQotCS8qKgotCSAqIFRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFbnZpcm9ubWVudFBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIEVjbGlwc2UgcGxhdGZvcm0gb25seS4KLQkgKi8KLQlwdWJsaWMgRW52aXJvbm1lbnRQbHVnaW4oKQotCXsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEVudmlyb25tZW50UGx1Z2luIGdldEluc3RhbmNlICgpCi0JewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2MGMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvcmVsYXRpdmUvUmVsYXRpdmVTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LnJlbGF0aXZlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVTY2hlbWUgaW1wbGVtZW50cyBJVVJJU2NoZW1lCi17Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gInJlbGF0aXZlIjsgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNIaWVyYXJjaGljYWwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoSVVSSSB1cmkpCi0gIHsKLSAgICByZXR1cm4gIXVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoICIvIiApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShJVVJJIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5uZXQuVVJMKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVybC50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjdmFsaWRhdGUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVVJJIHVyaSkKLSAgewotICAgIElTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggaXNWYWxpZCggdXJpICkgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCAiIixudWxsICk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC9yZWxhdGl2ZS9SZWxhdGl2ZVVSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjNkMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2Vudmlyb25tZW50L3JlbGF0aXZlL1JlbGF0aXZlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVudmlyb25tZW50LmVjbGlwc2UuTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFJlbGF0aXZlVVJJIGltcGxlbWVudHMgSVVSSQotewotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaV87Ci0gIAotICBwdWJsaWMgUmVsYXRpdmVVUkkoIFN0cmluZyB1cmkgKQotICB7Ci0gICAgdXJpXyA9IHVyaTsgICAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FwcGVuZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBJVVJJIGFwcGVuZChJVVJJIHJlbGF0aXZlVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiggIXJlbGF0aXZlVVJJLmlzUmVsYXRpdmUoKSkgCi0gICAgIHsgICAgICAKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsCi0gICAgICAgICAgICAgIE5MUy5iaW5kKCBNZXNzYWdlcy5NU0dfVVJJX05PVF9SRUxBVElWRSwgcmVsYXRpdmVVUkkudG9TdHJpbmcoKSApLCBudWxsICkgKTsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbmV3VVJJID0gdXJpXyArICIvIiArIHJlbGF0aXZlVVJJLnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgcmV0dXJuIGdldFVSSVNjaGVtZSgpLm5ld1VSSSggbmV3VVJJICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSgpIAotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNTdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBhc1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVyaV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIElVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVTY2hlbWUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0xlYWYoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlYWRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVsYXRpdmUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBJVVJJWzBdOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3Qob3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgSVVSSVtdIGxpc3QoSVVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgSVVSSVswXTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNwYXJlbnQoKQotICAgKi8KLSAgcHVibGljIElVUkkgcGFyZW50KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaW50IGxhc3RTbGFzaCAgPSB1cmlfLmxhc3RJbmRleE9mKCAnLycgKTsKLSAgICBpbnQgZmlyc3RTbGFzaCA9IHVyaV8uaW5kZXhPZiggJy8nICk7Ci0gICAgCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJlbnQsIHRoZW4gaXQgbXVzdCBzdGFydCB3aXRoIGEgc2xhc2gKLSAgICAvLyBhbmQgZW5kIHdpdGggYSBzbGFzaC4KLSAgICBpZiggbGFzdFNsYXNoID09IC0xIHx8IGZpcnN0U2xhc2ggPT0gLTEgKSByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgcmV0dXJuIGdldFVSSVNjaGVtZSgpLm5ld1VSSSggdXJpXy5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUoSVVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN2aXNpdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVZpc2l0b3IsIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSVVSSVZpc2l0b3IgdXJpVmlzaXRvciwgSVVSSUZpbHRlciB1cmlGaWx0ZXIpCi0gICAgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBJZiB0aGUgZmlsdGVyIGFjY2VwdHMgdGhpcyB3ZSB3aWxsIHZpc2l0IGl0LgotICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggdGhpcyApICkKLSAgICB7Ci0gICAgICBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgfQotICAgICAgIAotICAgIElVUklbXSBjaGlsZHJlbiAgPSBsaXN0KCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjb250aW51ZVZpc2l0OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBjaGlsZHJlbltpbmRleF0udmlzaXQoIHVyaVZpc2l0b3IsIHVyaUZpbHRlciApOwotICAgIH0gIAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KElVUklWaXNpdG9yIHVyaVZpc2l0b3IpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gY29udGludWVWaXNpdCA9IHVyaVZpc2l0b3IudmlzaXQoIHRoaXMgKTsgIAotICAgIAotICAgIElVUklbXSBjaGlsZHJlbiAgPSBsaXN0KCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjb250aW51ZVZpc2l0OyBpbmRleCsrICkKLSAgICAgewotICAgICAgY2hpbGRyZW5baW5kZXhdLnZpc2l0KCB1cmlWaXNpdG9yICk7Ci0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvdXJpL2ZpbGUvRmlsZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ0Zjg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5lY2xpcHNlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQucmVsYXRpdmUuUmVsYXRpdmVTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVNjaGVtZSBleHRlbmRzIFJlbGF0aXZlU2NoZW1lCi17Ci0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJmaWxlIjsgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoSVVSSSB1cmkpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiggdXJpID09IG51bGwgKSByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSB1cmkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICBpZiggc2NoZW1lLnRvU3RyaW5nKCkuZXF1YWxzKCAicmVsYXRpdmUiKSApIHJldHVybiBzY2hlbWUuaXNWYWxpZCggdXJpICk7Ci0gICAgICAgIAotICAgIFN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKLSAgICAgIAotICAgIGlmKCB1cmlTdHJpbmcgIT0gbnVsbCAmJiB1cmlTdHJpbmcuc3RhcnRzV2l0aCggImZpbGU6IiApICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0gIAotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgSVVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5ld1VSSSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKCAiZmlsZToiKSApCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgcHJvdG9jb2wgaGFzIGJlZW4gc3BlY2lmaWVkIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICBuZXdVUkkgPSB1cmk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHVyaSA9PSBudWxsIHx8IHVyaS5pbmRleE9mKCAiOiIpICE9IC0xICkKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSB1cmkgaXMgbm90IGFsbG93ZWQgdG8gY29udGFpbiBzb21lIG90aGVyIHByb3RvY29sLiAKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwKLSAgICAgICAgICAgICAgTkxTLmJpbmQoIE1lc3NhZ2VzLk1TR19JTlZBTElEX0ZJTEVfVVJMLHVyaSksIG51bGwgKSApOwotICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiggdXJpLnN0YXJ0c1dpdGgoICIvIikgKQotICAgIHsKLSAgICAgIC8vIFRoZSBmaWxlIHNjaGVtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIHNvIHdlIHdpbGwgYWRkIGl0LgotICAgICAgbmV3VVJJID0gImZpbGU6IiArIHVyaTsKLSAgICB9Ci0gICAgCi0gICAgaWYoIG5ld1VSSSA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRmlsZVVSSSggbmV3VVJJICk7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBJVVJJIG5ld1VSSShJVVJJIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ld1VSSSggdXJpID09IG51bGwgPyBudWxsIDogdXJpLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5uZXQuVVJMKQotICAgKi8KLSAgcHVibGljIElVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXdVUkkoIHVybCA9PSBudWxsID8gbnVsbCA6IHVybC50b1N0cmluZygpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW52aXJvbm1lbnQvdXJpL2ZpbGUvRmlsZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MxNjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbnZpcm9ubWVudC91cmkvZmlsZS9GaWxlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW52aXJvbm1lbnQudXJpLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbnZpcm9ubWVudC5yZWxhdGl2ZS5SZWxhdGl2ZVVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVVSSSBleHRlbmRzIFJlbGF0aXZlVVJJIAotewotICBwcml2YXRlIEZpbGUgZmlsZV8gPSBudWxsOwotICAKLSAgcHVibGljIEZpbGVVUkkoIFN0cmluZyB1cmkgKQotICB7Ci0gICAgc3VwZXIoIHVyaSApOwotICAgIAotICAgIGlmKCBnZXRVUklTY2hlbWUoKS5pc1ZhbGlkKCB0aGlzICkgKQotICAgIHsKLSAgICAgIGZpbGVfID0gbmV3IEZpbGUoIHVyaS5zdWJzdHJpbmcoIDUsIHVyaS5sZW5ndGgoKSApICk7Ci0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSgpIAotICB7Ci0gICAgcmV0dXJuIGZpbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBkZWxldGVGaWxlKCBmaWxlXyApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUZpbGUoIEZpbGUgZmlsZSApCi0gIHsKLSAgICBpZiggZmlsZS5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOwotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBjaGlsZC5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgewotICAgICAgICAgIGRlbGV0ZUZpbGUoIGNoaWxkICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGQuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZmlsZS5kZWxldGUoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlXyApOyAgCi0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZV8gKTsgIAotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBleGMuZ2V0TWVzc2FnZSgpLCBleGMgKSwgdGhpcyApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBwdWJsaWMgSVVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIHJldHVybiBmaWxlXyAhPSBudWxsOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IGZpbGVfID09IG51bGwgPyBudWxsIDogZmlsZV8udG9VUkwoKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uaXNGaWxlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uZXhpc3RzKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5SZWFkKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5Xcml0ZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZV8ubGlzdEZpbGVzKCk7Ci0gICAgSVVSSVtdICBVUklzICAgICA9IG5ldyBJVVJJWzBdOwotICAgIAotICAgIGlmKCBjaGlsZHJlbiAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpbnQgICBsZW5ndGggICA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIAotICAgICAgVVJJcyA9IG5ldyBJVVJJW2xlbmd0aF07Ci0gICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgVVJJc1tpbmRleF0gPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gVVJJczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIElVUklbXSBsaXN0KElVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gICBjaGlsZHJlbiA9IGZpbGVfLmxpc3RGaWxlcygpOwotICAgIGludCAgICAgIGxlbmd0aCAgID0gY2hpbGRyZW4gPT0gbnVsbCA/IDAgOiBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgVmVjdG9yICAgVVJJcyAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgCi0gICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIG5ld1VSSSkgKQotICAgICAgewotICAgICAgICBVUklzLmFkZCggbmV3VVJJICk7Ci0gICAgICB9IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKElVUklbXSlVUklzLnRvQXJyYXkoIG5ldyBJVVJJWzBdICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKElVUkkgbmV3VVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmlfID0gbmV3VVJJLnRvU3RyaW5nKCk7Ci0gICAgICBVUkwgbmV3VVJMID0gbmV3IFVSTCggdXJpXyApOwotICAgICAgZmlsZV8ucmVuYW1lVG8oIG5ldyBGaWxlKCBuZXdVUkwuZ2V0UGF0aCgpICkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7ICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgZmlsZV8ubWtkaXJzKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZm9sZGVycyBhcmUgY3JlYXRlZC4KLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBmaWxlXy5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsIGV4Yy5nZXRNZXNzYWdlKCksIGV4YyApLCB0aGlzICk7ICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMDYxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBfdWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWE3YTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3RwX3VpLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4ODVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWZkOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IE1hciAzMSAxNjo1ODo0NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNWM5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO3Zpc2liaWxpdHk6PXJlZXhwb3J0O2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNzNmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSB3dHBfdWkvLFwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgxOWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DdXQ9Q3V0Ci1GTEVYSUJMRV9QUk9KRUNUX1BSRUZFUkVOQ0U9SjJFRSBQcm9qZWN0IE1vZHVsZXMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1XVFAgVUkgUGx1Zy1pbgotV1RQX1VJX0FjdGlvbj1XVFAgVUkgQWN0aW9uCi1FeHRlbmRlZF9WaWV3ZXJzPUV4dGVuZGVkIFZpZXdlcnMKLUV4dGVuZGFibGVfV2l6YXJkPUV4dGVuZGFibGUgV2l6YXJkCi1FeHRlbmRhYmxlX1dpemFyZF9QYWdlPUV4dGVuZGFibGUgV2l6YXJkIFBhZ2UKLURhdGFNb2RlbFdpemFyZD1EYXRhTW9kZWxXaXphcmQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUzYWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3dHB1aUFjdGlvbiIgbmFtZT0iJVdUUF9VSV9BY3Rpb24iIHNjaGVtYT0ic2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuZGVkVmlld2VyIiBuYW1lPSIlRXh0ZW5kZWRfVmlld2VycyIgc2NoZW1hPSJzY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5kYWJsZVdpemFyZCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkIiBzY2hlbWE9InNjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZFBhZ2VHcm91cCIgbmFtZT0iJUV4dGVuZGFibGVfV2l6YXJkX1BhZ2UiIHNjaGVtYT0ic2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiIgbmFtZT0iJURhdGFNb2RlbFdpemFyZCIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlVJVGVzdGVyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpVGVzdGVyIj4KLSAgICAgIDx1aVRlc3RlcgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVUlUZXN0ZXJJbXBsIj4KLSAgICAgIDwvdWlUZXN0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy5zYXZlSGFuZGxlciIKLSAgICAgICAgIG5hbWU9IlNhdmUgSGFuZGxlciAtIEhlYWRsZXNzIENvbnRleHQgQ2xhc3MiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9InNhdmVIYW5kbGVyIgotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5TYXZlSGFuZGxlclVJIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuRW5hYmxlbWVudERldGVybWluYXRpb24iCi0gICAgICAgICBuYW1lPSJVSSBFbmFibGVtZW50IERldGVybWluYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgICAgIGNvbnRleHQ9IlVJIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVUlFbmFibGVtZW50TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLldUUEFjdGl2aXR5QnJpZGdlSGVscGVyIj4KLSAgICAgIDxXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwiPgotICAgICAgPC9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbHMuT3BlcmF0aW9uRXh0ZW5zaW9uIj4KLSAgICAgIDxvcGVyYXRpb25FeHRlbnNpb24KLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb24udWkuUG9zdFBhc3RlQWN0aW9uT3BlcmF0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9uLnVpLlBhc3RlQWN0aW9uT3BlcmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotICAgPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJIgotICAgICAgICAgIGNvbnRleHQ9IlVJIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRjYTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuY29tbW9uLnVpIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmRlZjEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3Byb2plY3RDb250ZW50c0xhYmVsID0gUHJvamVjdCBjb250ZW50czoKLVdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfdXNlRGVmYXVsdExhYmVsID0gVXNlICZkZWZhdWx0Ci1XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX2xvY2F0aW9uTGFiZWwgPSBEaXJlY3RvciZ5OgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9wcm9wZXJ0eV9maWxlcy93dHBjb21tb251aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzY2MWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3Byb3BlcnR5X2ZpbGVzL3d0cGNvbW1vbnVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUlBY3Rpb25XVFBPcGVyYXRpb25fVUlfMD1ObyBhY3Rpb24gYXZhaWxhYmxlIGZvciBleGVjdXRpb24uCi1XVFBBY3Rpb25EaWFsb2dfVUlfMD1TZWxlY3QgdGhlIG9wdGlvbmFsIGRlcGVuZGVudCBhY3Rpb25zIHlvdSB3b3VsZCBsaWtlIHRvIGV4ZWN1dGUuCi1XVFBPcHRpb25hbE9wZXJhdGlvbkRhdGFNb2RlbF9VSV8wPVJvb3QgdHJlZSBjYW4gbm90IGJlIHNlbGVjdGVkLgotV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMT1ObyBvcGVyYXRpb25zIGFyZSBzZWxlY3RlZC4KLU1hc3RlckRlc2NyaXB0b3JfRVJST1JfMj1JV0FFMDAwNUUgV1RQVUlPcGVyYXRpb24gZWxlbWVudHMgcmVxdWlyZSBleGFjdGx5IG9uZSA8c2VsZWN0aW9uRW5hYmxlbWVudCAvPi4KLVdUUE9wZXJhdGlvbkFjdGlvbl9VSV8wPU9wZXJhdGlvbiBTdGF0dXMKLVdUUE9wZXJhdGlvbkFjdGlvbl9VSV8xPVByb2JsZW0gZXhlY3V0aW5nIG9wZXJhdGlvbi4KLVRpbWVyUXVldWVfRVJST1JfMD1JV0FFMDAwNkUgQ2FuJ3Qgc3RhcnQgYSBUaW1lclF1ZXVlIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nCi1FeHRlbmRlZFdpemFyZFBhZ2VfRVJST1JfMD1JV0FFMDAwN0UgQ2Fubm90IG1vZGlmeSBpZCBhZnRlciBpdCBoYXMgYWxyZWFkeSBiZWVuIHNldC4KLUV4dGVuZGVkV2l6YXJkUGFnZV9FUlJPUl8xPUlXQUUwMDA4RSBUaGUgaWQgY2Fubm90IGJlIG51bGwKLU1hc3RlckRlc2NyaXB0b3JfVUlfMT1ObyBcIiB7MH0gXCIgYXR0cmlidXRlIGRlZmluZWQKLVRpbWVyX1VJXzA9SW52YWxpZCBkZWxheTogezB9Ci1UaW1lcl9VSV8xPUludmFsaWQgaW5pdGlhbCBkZWxheTogezB9Ci1XVFBXaXphcmRfVUlfMD1XaXphcmQgRXJyb3I6IHswfQotV1RQV2l6YXJkX1VJXzE9QW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoZW4gezB9IGZpbmlzaGVkLgotV1RQV2l6YXJkX1VJXzI9V2l6YXJkIFdhcm5pbmc6IHswfQotRXh0ZW5kYWJsZVdpemFyZF9VSV8wPVdpemFyZCBwYWdlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIHswfSB7MX0KLVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzA9RWxlbWVudDogezB9IGRvZXMgbm90IGFsbG93IHBhZ2UgaW5zZXJ0aW9uIGFmdGVyLgotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMT17MH0gd2lsbCBub3QgYmUgY3JlYXRlZAotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMj1DaXJjdWxhciBkZXBlbmRlbmN5LCBlbGVtZW50OiB7MH0gY2hlY2s6IHsxfQotV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMz1FZGl0b3IgZG9lcyBub3QgYWxsb3cgcGFnZSBpbnNlcnRpb25zCi1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV80PVBhcmVudCBDbGFzcyBOb3QgRm91bmQgRXJyb3I6IHswfSBcclxuIGZvciBhdHRyaWJ1dGU6IHsxfSBpbiBwbHVnaW4gezJ9IFxyXG5QYWdlIG5vdCBjcmVhdGVkCi1EZWxldGVfVUlfMD1EZWxldGUKLU5hbWVfPVByb2plY3QgbmFtZToKLUJyb3dzZV89QnJvd3NlLi4uCi1Qcm9qZWN0X2xvY2F0aW9uXz1Qcm9qZWN0IExvY2F0aW9uOgotTVVMVElQTEVfTU9EVUxFX1BSRUZfVEVYVD1BbGxvdyBNdWx0aXBsZSBtb2R1bGVzIHBlciBwcm9qZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzc1YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIiBuYW1lPSJEYXRhIE1vZGVsIFdpemFyZCBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQW4gZXh0ZW5zaW9uIHRvIGEgc3BlY2lmaWMgRGF0YSBNb2RlbCBXaXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkRhdGFNb2RlbFdpemFyZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iRGF0YU1vZGVsV2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZGF0YSBtb2RlbCB3aXphcmQgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGRhdGEgbW9kZWwgd2l6YXJkIGNsYXNzIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kYWJsZVdpemFyZC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ5OTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9ImV4dGVuZGFibGVXaXphcmQiIG5hbWU9IkV4dGVuZGFibGUgV2l6YXJkIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZGVjbGFyZXMgYSBkYXRhIG1vZGVsIHdpemFyZCBhcyBhIHZhbGlkIGV4dGVuZGFibGUgd2l6YXJkLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0ZW5kYWJsZVdpemFyZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5kYWJsZVdpemFyZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSByZXF1aXJlZCBpZCBmb3IgdGhlIGRhdGEgbW9kZWwgd2l6YXJkIGluc3RhbmNlIHRvIGJlIGV4dGVuZGVkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS9leHRlbmRhYmxlV2l6YXJkUGFnZS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGM4ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGFibGVXaXphcmRQYWdlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9IndpemFyZFBhZ2VHcm91cCIgbmFtZT0iRXh0ZW5kYWJsZSBXaXphcmQgUGFnZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGFsbG93cyB5b3UgdG8gYWRkIGFuIGRhdGEgbW9kZWwgd2l6YXJkIHBhZ2UgdG8gYSBwcmVkZWZpbmVkIGV4dGVuc2FibGUgZGF0YSBtb2RlbCB3aXphcmQuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2VHcm91cCIvPg0KLSAgICAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZUdyb3VwIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+DQotICAgICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndpemFyZElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBtYXRjaCB0aGUgaWQgZGVmaW5lZCBpbiB0aGUgZXh0ZW5kYWJsZVdpemFyZCBlbGVtZW50IGluIHRoZSBleHRlbmRhYmxlV2l6YXJkIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhpcyBwYWdlIGFsbG93cyBleHRlbmRlZCBwYWdlcyBhZnRlciBpdHNlbGYsIGRlZmF1bHQgaXQgdHJ1ZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdlR3JvdXBJbnNlcnRpb25JRCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgaXMgdG8gaW1tZWRpYXRlbHkgYWZ0ZXIgYW5vdGhlciBwYWdlLCB0aGlzIG11c3QgbWF0Y2ggdGhlIHBhZ2VJRCBvZiB0aGUgcGFnZSB0byBpbnNlcnQgYWZ0ZXIuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VHcm91cElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIHRoZSBwYWdlIGdyb3VwIElEDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhpcyBjbGFzcyBpcyBhbiBpbnN0YW5jb2YgY29tLmlibS53dHAuY29tbW9uLnVpLndpemFyZC5leHRlbnNpb25zLldpemFyZEV4dGVuc2lvbkZhY3RvcnkNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL2V4dGVuZGVkVmlld2VyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4OTA4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS9zY2hlbWEvZXh0ZW5kZWRWaWV3ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIiBpZD0iZXh0ZW5kZWRWaWV3ZXIiIG5hbWU9IkV4dGVuZGVkIFZpZXdlcnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGV4dGVuZGVkVmlld2VyIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdGhlIGNvbnRyaWJ1dGlvbiBvZiBuZXcgZnVuY3Rpb24gdG8gYW4gZXhpc3Rpbmcgdmlld2VyLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0ZW5kZWRWaWV3ZXIiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuZGVkVmlld2VyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3ZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHJlcXVpcmVkIGlkIGZvciB0aGUgZXh0ZW5kZWRWaWV3ZXIgaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50Vmlld2VySUQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWQgdXNlZCB0byBzcGVjaWZ5IGEgcGFyZW50IHZpZXdlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIGZhY3RvcnkgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgcGF0aCB0byBhbiBpY29uIGltYWdlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgcmVxdWlyZWQgbGFiZWwgZGVzY3JpcHRpb24gZm9yIHRoZSBleHRlbmRlZCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb25Hcm91cElEIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHNldHRpbmcgdG8gYXNzb2NpYXRlIHRoZSBleHRlbmRlZCB2aWV3ZXIgd2l0aCBhIHNwZWNpZmljIGZ1bmN0aW9uIGdyb3VwIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3NjaGVtYS93dHB1aUFjdGlvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODg2MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvc2NoZW1hL3d0cHVpQWN0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSIgaWQ9Ind0cHVpQWN0aW9uIiBuYW1lPSJXVFAgVUkgQWN0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGZvciBXVFAgT3BlcmF0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHRpZWQgdG8gYSBnZW5lcmljIFVJIGFjdGlvbiwgc3VjaCBhcyBDVVQsIENPUFksIFBBU1RFLCBERUxFVEUsIGFuZCBSRU5BTUUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1hc3Rlck9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2xhdmVPcGVyYXRpb24iLz4NCi0gICAgICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1hc3Rlck9wZXJhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgQSBtYXN0ZXJPcGVyYXRpb24gZW5hYmxlcyBhbiBleGlzdGluZyBXVFAgT3BlcmF0aW9uIHRvIGJlIHVzZWQgaW4gYSBVSSBhY3Rpb24uIEdlbmVyaWMgSWRzIGFnZ3JlZ2F0ZSBhIHNldCBvZiBtYXN0ZXJPcGVyYXRpb25zIGZvciB0aGUgc2FtZSBBYnN0cmFjdCBhY3Rpb24gKGxpa2UgYSAmcXVvdDtDVVQmcXVvdDsgb3BlcmF0aW9uKS4gV1RQIE9wZXJhdGlvbnMgYXJlIHRoZW1zZWx2ZXMgZXh0ZW5kaWJsZSwgc28gZm9yIGFueSBtYXN0ZXJPcGVyYXRpb24gZGVmaW5lZCwgdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgcHJlfHBvc3Qgb3BlcmF0aW9ucy4gVGhlc2UgcHJlfHBvc3Qgb3BlcmF0aW9uIGNhbiBoYXZlIHNsYXZlT3BlcmF0aW9uIGVsZW1lbnRzIGRlZmluZWQgd2hpY2ggaW5kaWNhdGUgdGhlIHByZXxwb3N0IG9wZXJhdGlvbiBtYXkgYmUgcnVuIGluZGVwZW5kZW50bHkuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VsZWN0aW9uRW5hYmxlbWVudCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbmRlZEdlbmVyaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgSUQgb2YgdGhlIEdlbmVyaWMgQWN0aW9uIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8uIChlLmcuIFRoZSBpZCBmb3IgQ1VULCBDT1BZLCBQQVNURSwgREVMRVRFLCBSRU5BTUUpLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLCB0aGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHJldHVybmVkIGJ5IHRoZSBkYXRhTW9kZWwgd2lsbCBiZSB1c2VkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9wdWxhdG9yQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHBvcHVsYXRvckNsYXNzIGtub3dzIGhvdyB0byBwcm92aWRlIGEgV1RQIE9wZXJhdGlvbiBEYXRhIE1vZGVsIGJhc2VkIG9uIGEgZ2l2ZW4gc2VsZWN0aW9uLiBUaGUgZ2V0RGVmYXVsdE9wZXJhdGlvbigpIG1ldGhvZCBvZiB0aGUgZGF0YSBtb2RlbCB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIG9wZXJhdGlvbkNsYXNzIGlzIHByb3ZpZGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbHdheXNFeGVjdXRlIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBzZXR0aW5nIHRvIGRldGVybWluZSBleGVjdXRpb24gY29udGV4dA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVycmlkZUlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgdG8gZGVmaW5lIGFuIG92ZXJyaWRhYmxlIGlkDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGlkZW50aWZpY2F0aW9uIGZvciBvcGVyYXRpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNlbGVjdGlvbkVuYWJsZW1lbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzZWxlY3Rpb25FbmFibGVtZW50IGVsZW1lbnQgYWxsb3dzIHlvdSB0byBmaWx0ZXIgd2hpY2gga2luZHMgb2Ygc2VsZWN0aW9uIHlvdXIgb2JqZWN0IGlzIGFwcGxpY2FibGUgdG8gdXNpbmcgU3RhbmRhcmQgRWNsaXBzZSBBY3Rpb24gRXhwcmVzaW9ucy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2xhdmVPcGVyYXRpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoZSBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50IGRlZmluZXMgZGlzcGxheSBpbmZvcm1hdGlvbiBmb3Igb3BlcmF0aW9ucyB3aGljaCBleHRlbmQgYSBkZWNsYXJlZCBtYXN0ZXIgb3BlcmF0aW9uLiBJZiBhIHByZXxwb3N0IG9wZXJhdGlvbiBvZiBhIG1hc3RlciBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzbGF2ZU9wZXJhdGlvbiBlbGVtZW50LCB0aGVuIHRoZSBwcmV8cG9zdCBvcGVyYXRpb24gd2lsbCBiZSBjb25zaWRlciByZXF1aXJlZCwgYW5kIG5vdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb25DbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9mIHlvdXIgb3BlcmF0aW9uLiBZb3VyIG9wZXJhdGlvbiBtdXN0IGJlIGEgV1RQT3BlcmF0aW9uIGFuZCBtdXN0IHByb3ZpZGUgYSBuby1hcmd1bWVudHMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gRm9yIHNsYXZlIG9wZXJhdGlvbnMsIHRoZSBkYXRhIG1vZGVsIG9mIHRoZSBtYXN0ZXIgb3BlcmF0aW9uIHdpbGwgYmUgcHJvdmlkZWQuIFRoZXJlZm9yZSwgc2xhdmVzIGNhbm5vdCBvdmVycmlkZSB0aGUgZGF0YSBtb2RlbCB1c2luZyBhIHNlcGVyYXRlIHBvcHVsYXRvckNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgbmFtZSB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgZm9yIHlvdXIgYWN0aW9uIChpZiB0aGUgb3BlcmF0aW9uIGlzIG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkICZxdW90OyVrZXkmcXVvdDsgZm9yIHRyYW5zbGF0YWJsZSB0ZXh0IHN0b3JlZCBpbiBwbHVnaW4ucHJvcGVydGllcy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdENsYXNzIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbmQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdFN0YXRlIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0Q2xhc3MiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG9iamVjdCBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGFwdGFibGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZyB0byBzcGVjaWZ5IHRoZSBvYmplY3QgY2xhc3MgYXMgYWRhcHRhYmxlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJhbmQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y2hvaWNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0Q2xhc3MiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9yIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0U3RhdGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIG9iamVjdCBzdGF0ZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIHNldHRpbmcgZm9yIGFuIG9iamVjdCBzdGF0ZSBuYW1lIHRvIGNoZWNrIHRoZSBzZWxlY3RlZCBvYmplY3QmYXBvcztzIHZhbHVlIGlzIG1hdGNoaW5nIHdpdGgNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDshLS0gVGhlIGV4YW1wbGVzIGluIHRoaXMgc2VjdGlvbiBoYXZlIGJlZW4gY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXkgcmVmZXJlbmNlIG9ubHkgZXh0ZW5zaW9uIHBvaW50IElEcy4gVGhlc2UgZXhhbXBsZXMgbXVzdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAtLSZndDsNCi0mbHQ7IS0tDQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlY2xhcmVzIHR3byBNYXN0ZXIgT3BlcmF0aW9ucyAoJmx0O2NvZGUmZ3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLk1hc3Rlck9wZXJhdGlvbkEmbHQ7L2NvZGUmZ3Q7IGFuZCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQiZsdDsvY29kZSZndDspIHdoaWNoIGFyZSBhdHRhY2hlZCB0byB0aGUgR2VuZXJpYyBJRCAmbHQ7Y29kZSZndDtjb20uYWNtZS51aS5XVFBPcHRpb25hbE9wZXJhdGlvblRlc3QmbHQ7L2NvZGUmZ3Q7LiANCi1UaGUgc2NlbmFyaW8gaGFzIE1hc3RlciBBIHdoaWNoIGhhcyBhcyBhIHByZS1vcGVyYXRpb24gb2YgU2xhdmUgQSBhbmQgYSBwb3N0LW9wZXJhdGlvbiBvZiBTbGF2ZSBDLiBTbGF2ZSBBIGlzIG1hZGUgb3B0aW9uYWwgYnkgdGhlICZsdDtjb2RlJmd0O3NsYXZlT3BlcmF0aW9uJmx0Oy9jb2RlJmd0OyBlbGVtZW50LCB3aGlsZSBTbGF2ZSBDIHdpbGwgYWx3YXlzIGJlIHJ1biAobm8gJmx0O2NvZGUmZ3Q7c2xhdmVPcGVyYXRpb24mbHQ7L2NvZGUmZ3Q7IGlzIGdpdmVuIHRvIHJ1biBpdCBzZXBlcmF0ZWx5KS4gU2xhdmUgQSBmdXJ0aGVyIGhhcyBhbiBvcHRpb25hbCBwcmUtb3BlcmF0aW9uIChTbGF2ZSBCKSB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbmRlcGVudGx5IG9mIGVpdGhlciBTbGF2ZSBBIG9yIE1hc3RlciBBLg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkud3RwdWlBY3Rpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O21hc3Rlck9wZXJhdGlvbg0KLSAgICAgICAgICAgIHBvcHVsYXRvckNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5BY21lT3BlcmF0aW9uUG9wdWxhdG9yJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslbWFzdGVyX2FfbmFtZSZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JW1hc3Rlcl9hX2Rlc2NyaXB0aW9uJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvbWFzdGVyT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90O1NsYXZlIEEmcXVvdDsNCi0gICAgICAgICAgICBvcGVyYXRpb25DbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvc2xhdmVPcGVyYXRpb24mZ3Q7IA0KLSAgICAgICZsdDtzbGF2ZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7U2xhdmUgQiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkImcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9zbGF2ZU9wZXJhdGlvbiZndDsgICAgICANCi0gICAgICAmbHQ7bWFzdGVyT3BlcmF0aW9uDQotICAgICAgICAgICAgcG9wdWxhdG9yQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLkFjbWVPcGVyYXRpb25Qb3B1bGF0b3ImcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90O0VBUiBQcm9qZWN0IEFjdGlvbiZxdW90Ow0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25CJnF1b3Q7DQotICAgICAgICAgICAgZXh0ZW5kZWRHZW5lcmljSWQ9JnF1b3Q7Y29tLmFjbWUudWkuV1RQT3B0aW9uYWxPcGVyYXRpb25UZXN0JnF1b3Q7Jmd0Ow0KLSAgICAgICAgICAgICZsdDtzZWxlY3Rpb25FbmFibGVtZW50Jmd0OyANCi0gICAgICAgICAgICAgJmx0O29iamVjdFN0YXRlIG5hbWU9JnF1b3Q7cHJvamVjdE5hdHVyZSZxdW90OyB2YWx1ZT0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUmcXVvdDsgLyZndDsNCi0gICAgICAgICAgICAmbHQ7L3NlbGVjdGlvbkVuYWJsZW1lbnQmZ3Q7DQotICAgICAgJmx0Oy9tYXN0ZXJPcGVyYXRpb24mZ3Q7ICAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7ICAgDQotLS0mZ3Q7DQotJmx0OyEtLQ0KLUZvciBlYWNoIG9mIHRoZSBzbGF2ZU9wZXJhdGlvbnMgcmVmZXJlbmNlZCBhYm92ZSwgeW91IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgV1RQIE9wZXJhdGlvbiBFeHRlbnNpb24gZGVjbGFyZWQgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9JnF1b3Q7d3RwdWlBY2l0b24uQWNtZS5FeHRlbnNpb25zJnF1b3Q7DQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24mcXVvdDsmZ3Q7DQotICAgICAgJmx0O2V4dGVuZGFibGVPcGVyYXRpb24NCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uTWFzdGVyT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAgICAmbHQ7ZXh0ZW5kYWJsZU9wZXJhdGlvbg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uYWNtZS51aS5vcGVyYXRpb24uU2xhdmVPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvZXh0ZW5kYWJsZU9wZXJhdGlvbiZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiZxdW90OyZndDstLSZndDsNCi0gICAgICAmbHQ7IS0tIE1hZGUgb3B0aW9uYWwgYnkgdGhlIGFib3ZlIGRlY2xhcmF0aW9uIC0tJmd0Ow0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQSZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0Oy0tJmd0Ow0KLSAgICAgICZsdDshLS0gTWFkZSBvcHRpb25hbCBieSB0aGUgYWJvdmUgZGVjbGFyYXRpb24gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQiZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5TbGF2ZU9wZXJhdGlvbkEmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7LS0mZ3Q7ICAgDQotICAgICAgJmx0OyEtLSBOb24tb3B0aW9uYWwgb3BlcmF0aW9uLCB3aWxsIGFsd2F5cyBydW4gLS0mZ3Q7DQotICAgICAgJmx0OyEtLSZsdDtvcGVyYXRpb25FeHRlbnNpb24NCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Y29tLmFjbWUudWkub3BlcmF0aW9uLlNsYXZlT3BlcmF0aW9uQyZxdW90Ow0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5hY21lLnVpLm9wZXJhdGlvbi5NYXN0ZXJPcGVyYXRpb25BJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvb3BlcmF0aW9uRXh0ZW5zaW9uJmd0OyAgDQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IA0KLSZsdDsvcHJlJmd0Ow0KLS0tJmd0Ow0KLSZsdDshLS0NCi1JbiBnZW5lcmFsLCB1c2VycyBleHRlbmRpbmcgZXhpc3RpbmcgYWN0aW9ucyBvbmx5IG5lZWQgdG8gZGVjbGFyZSB0aGUgZm9sbG93aW5nOiANCi0tLSZndDsNCi0mbHQ7IS0tDQotJmx0O3ByZSZndDsNCi0gJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24mcXVvdDsmZ3Q7LS0mZ3Q7IA0KLSAmbHQ7IS0tIFRoZSBhY3Rpb24gcmVmZXJlbmNlZCBtdXN0IGJlIGRlY2xhcmVkIGFzIGV4dGVuc2libGUgYnkgdGhlICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkV4dGVuZGFibGVPcGVyYXRpb24gZXh0ZW5zaW9uIHBvaW50IC0tJmd0OyAgICAgICAgIA0KLSAgICAgICZsdDshLS0mbHQ7b3BlcmF0aW9uRXh0ZW5zaW9uDQotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlkPSZxdW90Oy4uLklEIE9GIEVYSVNUSU5HIE9QRVJBVElPTi4uLiZxdW90OyZndDsgDQotICAgICAgJmx0Oy9vcGVyYXRpb25FeHRlbnNpb24mZ3Q7IA0KLSAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsgICAgICANCi0tLSZndDsNCi0mbHQ7IS0tDQotQW5kIGlmIHlvdXIgb3BlcmF0aW9uIGlzIG9wdGlvbmFsIGRlY2xhcmUgdGhlIHNsYXZlT3BlcmF0aW9uOg0KLS0tJmd0Ow0KLSZsdDshLS0NCi0mbHQ7cHJlJmd0OyANCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLnd0cHVpQWN0aW9uJnF1b3Q7Jmd0OyANCi0gICAmbHQ7c2xhdmVPcGVyYXRpb24NCi0gICAgICAgICAgICBuYW1lPSZxdW90Oy4uTkFNRSBPRiBZT1VSIE9QRVJBVElPTi4uLiZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90Oy4uLkRFU0NSSVBUSU9OIE9GIFlPVVIgQUNUSU9OLi4uJnF1b3Q7DQotICAgICAgICAgICAgb3BlcmF0aW9uQ2xhc3M9JnF1b3Q7Li4uWU9VUiBDTEFTUy4uLiZxdW90OyZndDsNCi0gICAgICAmbHQ7L3NsYXZlT3BlcmF0aW9uJmd0OyANCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsgICAgICANCi0mbHQ7L3ByZSZndDsNCi0tLSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0FkZGFibGVQYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjMzM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9BZGRhYmxlUGFnZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRkYWJsZVBhZ2VHcm91cCBleHRlbmRzICBJRE1QYWdlR3JvdXAKLXsKLSAgcHVibGljIHZvaWQgYWRkUGFnZSggSVdpemFyZFBhZ2UgcGFnZSApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFN5bmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGNmZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsU3luY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5UaW1lZE1vZGlmeUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTGludXggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5lcXVhbHMoIkxpbnV4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByb3RlY3RlZCBNYXAgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2g7Ci0JcHJvdGVjdGVkIE1hcCBwcm9wZXJ0eVRvV2lkZ2V0SGFzaDsKLQlwcm90ZWN0ZWQgTWFwIHdpZGdldFRvRGVwQ29udHJvbHM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eTsKLQlwcm90ZWN0ZWQgV2lkZ2V0IGN1cnJlbnRXaWRnZXQ7Ci0JcHJvdGVjdGVkIFdpZGdldCBjdXJyZW50V2lkZ2V0RnJvbUV2ZW50OyAvLyBUT0RPIE00IHNlZSBpZiB0aGlzIHNob3VsZCBiZSBzZXQgd2l0aCBmb3IKLQkvLyBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVNb2RpZnlFdmVudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBjbGFzcyBNb2RpZnlUZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gdGV4dCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHRleHQpOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBtb2RpZnlUZXh0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBUaW1lZE1vZGlmeUxpc3RlbmVyIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJaWYgKGlnbm9yZU1vZGlmeUV2ZW50KQotCQkJCXJldHVybjsKLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gY29tYm8pCi0JCQkJcmV0dXJuOwotCi0JCQl0cnkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBjb21ibzsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJLy8gT24gYSBjb21ibyBzZWxlY3Rpb24gbGludXggZmlyZXMgMiBldmVudHM7Ci0JCQkJLy8gdGhlIGZpcnN0IGNsZWFycyB0aGUgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgaWdub3JlZCB3aGVuIHRoZSB0eXBlIGlzIG5vdCBTdHJpbmcKLQkJCQkvLyB0aGUgc2Vjb25kIHNldHMgdGhlIG5ldyB2YWx1ZQotCQkJCWlmIChpc0xpbnV4ICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID09IDAgJiYgZGVzY3JpcHRvcnMubGVuZ3RoICE9IDAgJiYgIShkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eVZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGNvbWJvLmdldFRleHQoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBjb21ibykKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGNvbWJvKTsKLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID49IDApIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRhdGFNb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpKSB7Ci0JCQkJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBjb21iby5nZXRJdGVtKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbWJvTGlzdGVuZXIgY29tYm9MaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoY3VycmVudFdpZGdldCA9PSBidXR0b24pCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHdpZGdldFRvUHJvcGVydHlIYXNoLmdldChidXR0b24pOwotCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgQm9vbGVhbihidXR0b24uZ2V0U2VsZWN0aW9uKCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgY2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlcihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gbW9kZWw7Ci0JCWRhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIENoZWNrQm94Vmlld2VyTGlzdGVuZXIgY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGVja0JveFZpZXdlckxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGV2ZW50LmdldFNvdXJjZSgpOwotCQkJQ2hlY2tib3hUYWJsZVZpZXdlciBjaGVja0JveFRhYmxlVmlld2VyOwotCQkJQ2hlY2tib3hUcmVlVmlld2VyIGNoZWNrQm94VHJlZVZpZXdlcjsKLQkJCU9iamVjdFtdIGl0ZW1zID0gbnVsbDsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRhYmxlVmlld2VyKSB7Ci0JCQkJY2hlY2tCb3hUYWJsZVZpZXdlciA9IChDaGVja2JveFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJfSBlbHNlIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBDaGVja2JveFRyZWVWaWV3ZXIpIHsKLQkJCQljaGVja0JveFRyZWVWaWV3ZXIgPSAoQ2hlY2tib3hUcmVlVmlld2VyKSB2aWV3ZXI7Ci0JCQkJaXRlbXMgPSBjaGVja0JveFRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQkJc2V0UHJvcGVydHlJdGVtcyhwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWludCBmbGFnID0gZXZlbnQuZ2V0RmxhZygpOwotCQlpZiAoZmxhZyA9PSBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKQotCQkJc2V0RW5hYmxlbWVudChwcm9wZXJ0eU5hbWUsIGV2ZW50LmlzUHJvcGVydHlFbmFibGVkKCkpOwotCQllbHNlCi0JCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eUl0ZW1zKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCWN1cnJlbnRQcm9wZXJ0eSA9IHByb3BlcnR5TmFtZTsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGl0ZW1zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBVSSB0byBoYXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBkZWZpbmVkIGluIHRoZSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAbGluayBJRGF0YU1vZGVsTGlzdGVuZXIgZm9yIHRoZSBmbGFnIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5VG9XaWRnZXRIYXNoICYmIHByb3BlcnR5VG9XaWRnZXRIYXNoLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljdXJyZW50V2lkZ2V0ID0gKFdpZGdldCkgcHJvcGVydHlUb1dpZGdldEhhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQkJCQlpZiAoY3VycmVudFdpZGdldCAhPSBudWxsICYmIGN1cnJlbnRXaWRnZXQgIT0gY3VycmVudFdpZGdldEZyb21FdmVudCkgewotCQkJCQkJCS8vV2UgbXVzdCBob2xkIGEgY29weSBpbiBhIHRlbXAgdmFyaWFibGUgYmVjYXVzZSBzZXR0aW5nIHRoZSB3aWRnZXQgdmFsdWUKLQkJCQkJCQkvL21heSB0cmlnZ2VyIGFuIGV2ZW50IHRoYXQgd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4uCi0JCQkJCQkJV2lkZ2V0IHdpZGdldCA9IGN1cnJlbnRXaWRnZXQ7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaWdub3JlTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCQkJCQlpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRleHQpCi0JCQkJCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChUZXh0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChDb21ibykgY3VycmVudFdpZGdldCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikKLQkJCQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKEJ1dHRvbikgY3VycmVudFdpZGdldCk7Ci0JCQkJCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKExhYmVsKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChMaXN0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQkJCQkJZWxzZSBpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRhYmxlKQotCQkJCQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVGFibGUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkKLQkJCQkJCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRyZWUpIGN1cnJlbnRXaWRnZXQpOwotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCS8vUGFzcyB0aGUgY29weSBvZiB0aGUgY3VycmVudFdpZGdldAotCQkJCQkJCXNldEVuYWJsZW1lbnQoKENvbnRyb2wpIHdpZGdldCwgZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSkpOwotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250cm9sCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChjb250cm9sLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbmFibGVtZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAocHJvcGVydHlUb1dpZGdldEhhc2ggIT0gbnVsbCkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHByb3BlcnR5VG9XaWRnZXRIYXNoLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFbmFibGVtZW50KGNvbnRyb2wsIGVuYWJsZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlcGVuZGVudENvbnRyb2xFbmFibGVtZW50KENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCUNvbnRyb2xbXSBkZXBlbmRlbnRzID0gKENvbnRyb2xbXSkgd2lkZ2V0VG9EZXBDb250cm9scy5nZXQoY29udHJvbCk7Ci0JCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsKSB7Ci0JCQkJQ29udHJvbCBkZXAgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwZW5kZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlkZXAgPSBkZXBlbmRlbnRzW2ldOwotCQkJCQlpZiAoZGVwLmlzRW5hYmxlZCgpICE9IGVuYWJsZWQpCi0JCQkJCQlkZXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULkNIRUNLKSA9PSBTV1QuQ0hFQ0sgfHwgKGJ1dHRvbi5nZXRTdHlsZSgpICYgU1dULlJBRElPKSA9PSBTV1QuUkFESU8pIHsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9IGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCWlmIChidXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0gY2hlY2tlZCkgewotCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24oY2hlY2tlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgQ29tYm8gY29tYm8pIHsKLQkJaWYgKGZsYWcgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyB8fCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkvLyBEaXNwbGF5IHByb3BlcnRpZXMgc2hvdWxkIG9ubHkgZmlyZSBpZiB0aGUgY29udGVudHMgY2hhbmdlLgotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbZGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7Ci0JCWludCBzZWxJbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxJbmRleCA8IDAgfHwgIW5ld1RleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oc2VsSW5kZXgpKSkgewotCQkJU3RyaW5nW10gaXRlbXMgPSBjb21iby5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXS5lcXVhbHMobmV3VGV4dCkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbWJvLnNldFRleHQobmV3VGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRleHQgdGV4dCkgewotCQlTdHJpbmcgbmV3VGV4dCA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIW5ld1RleHQuZXF1YWxzKHRleHQuZ2V0VGV4dCgpKSkgewotCQkJdGV4dC5zZXRUZXh0KG5ld1RleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIFRhYmxlIHRhYmxlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXNldFRhYmxlSXRlbXNDaGVja2VkKHRhYmxlLmdldEl0ZW1zKCksIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlqYXZhLnV0aWwuTGlzdCBlbGVtZW50TGlzdCA9IEFycmF5cy5hc0xpc3QoZWxlbWVudHMpOwotCQlUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlSXRlbXNbaV07Ci0JCQlpZiAoZWxlbWVudExpc3QuY29udGFpbnMoaXRlbS5nZXREYXRhKCkpKQotCQkJCWl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCWVsc2UKLQkJCQlpdGVtLnNldENoZWNrZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVJdGVtc0NoZWNrZWQoVGFibGVJdGVtW10gdGFibGVJdGVtcywgYm9vbGVhbiBiKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLQkJCXRhYmxlSXRlbXNbaV0uc2V0Q2hlY2tlZChiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXRWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgZmxhZywgVHJlZSB0cmVlKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKE9iamVjdFtdKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWphdmEudXRpbC5MaXN0IGVsZW1lbnRMaXN0ID0gQXJyYXlzLmFzTGlzdChlbGVtZW50cyk7Ci0JCVRyZWVJdGVtW10gdHJlZUl0ZW1zID0gdHJlZS5nZXRJdGVtcygpOwotCQlpZiAoZWxlbWVudExpc3Quc2l6ZSgpID09IDApIHsKLQkJCXNldFRyZWVJdGVtc0dyZXkodHJlZUl0ZW1zLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRyZWVJdGVtcy5sZW5ndGggPiAwKQotCQkJc2V0VHJlZUl0ZW1DaGVja2VkKHRyZWVJdGVtcywgZWxlbWVudExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyZWVJdGVtc0dyZXkoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGJvb2xlYW4gYikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IHRyZWVJdGVtc1tpXTsKLQkJCWl0ZW0uc2V0R3JheWVkKGIpOwotCQkJc2V0VHJlZUl0ZW1zR3JleSh0cmVlSXRlbXNbaV0uZ2V0SXRlbXMoKSwgYik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlSXRlbUNoZWNrZWQoVHJlZUl0ZW1bXSB0cmVlSXRlbXMsIGphdmEudXRpbC5MaXN0IGl0ZW1zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXRlbXMuY29udGFpbnModHJlZUl0ZW1zW2ldLmdldERhdGEoKSkpewotCQkJCXRyZWVJdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOwotCQkJCXRyZWVJdGVtc1tpXS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfWVsc2V7Ci0JCQkJdHJlZUl0ZW1zW2ldLnNldEdyYXllZCh0cnVlKTsKLQkJCX0KLQkJCVRyZWVJdGVtW10gY2hpbGRlcm5JdGVtcyA9IHRyZWVJdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGNoaWxkZXJuSXRlbXMubGVuZ3RoID4gMCkgewotCQkJCXRyZWVJdGVtc1tpXS5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQlzZXRUcmVlSXRlbUNoZWNrZWQoY2hpbGRlcm5JdGVtcywgaXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcsIExhYmVsIGxhYmVsKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghbmV3VGV4dC5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkgewotCQkJbGFiZWwuc2V0VGV4dChuZXdUZXh0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBMaXN0IGxpc3QpIHsKLQkJT2JqZWN0IG5ld0NvbnRlbnRzID0gZGF0YU1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChuZXdDb250ZW50cyA9PSBudWxsKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKG5ldyBTdHJpbmdbMF0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBtb2RlbENvbnRlbnRzID0gKGphdmEudXRpbC5MaXN0KSBuZXdDb250ZW50czsKLQkJCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1ttb2RlbENvbnRlbnRzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsQ29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpdGVtc1tpXSA9IG1vZGVsQ29udGVudHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQkJfSBlbHNlIGlmIChuZXdDb250ZW50cyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlsaXN0LnNldEl0ZW1zKChTdHJpbmdbXSkgbmV3Q29udGVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hBbGxVSVdpdGhNb2RlbCgpIHsKLQkJaWYgKG51bGwgIT0gcHJvcGVydHlUb1dpZGdldEhhc2gpIHsKLQkJCUNvbGxlY3Rpb24ga2V5cyA9IHByb3BlcnR5VG9XaWRnZXRIYXNoLmtleVNldCgpOwotCQkJaWYgKCFrZXlzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIHByb3BlcnR5TmFtZXMgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IG51bGw7Ci0JCQkJd2hpbGUgKHByb3BlcnR5TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCXByb3BlcnR5TmFtZSA9IChTdHJpbmcpIHByb3BlcnR5TmFtZXMubmV4dCgpOwotCQkJCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaENvbXBvc2l0ZShXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwQ29udHJvbHMpIHsKLQkJaWYgKG51bGwgPT0gd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gpCi0JCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9PSBudWxsKQotCQkJcHJvcGVydHlUb1dpZGdldEhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaC5wdXQod2lkZ2V0LCBwcm9wZXJ0eU5hbWUpOwotCQlwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5wdXQocHJvcGVydHlOYW1lLCB3aWRnZXQpOwotCQlpZiAoZGVwQ29udHJvbHMgIT0gbnVsbCkgewotCQkJaWYgKHdpZGdldFRvRGVwQ29udHJvbHMgPT0gbnVsbCkKLQkJCQl3aWRnZXRUb0RlcENvbnRyb2xzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXdpZGdldFRvRGVwQ29udHJvbHMucHV0KHdpZGdldCwgZGVwQ29udHJvbHMpOwotCQl9Ci0JCXN5bmNoVUlXaXRoTW9kZWwocHJvcGVydHlOYW1lLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaFRleHQodGV4dCwgcHJvcGVydHlOYW1lLCBmYWxzZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoVGV4dChUZXh0IHRleHQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gaXNUaW1lTW9kaWZpZWQsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZSh0ZXh0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKGlzVGltZU1vZGlmaWVkKQotCQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihnZXRUaW1lZExpc3RlbmVyKCkpOwotCQllbHNlCi0JCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGdldE1vZGlmeVRleHRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaExhYmVsKExhYmVsIGxhYmVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUobGFiZWwsIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGlzIHRvIHN5bmNoIHRoZSBjb250ZW50cyBvZiB0aGUgPGNvZGU+bGlzdDwvY29kZT4gdG8gdGhlIExpc3QgZWxlbWVudHMgcmV0dXJuZWQgZnJvbQotCSAqIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoTGlzdChMaXN0IGxpc3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShsaXN0LCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jaCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBDb21ibyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lLiBUaGUKLQkgKiBwb3NzaWJsZSB2YWx1ZXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGFyZSBkZXRlcm1pbmVkIGJ5IHJldHVybiBvZgotCSAqIElEYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykuCi0JICogCi0JICogQHBhcmFtIGNvbWJvCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSBkZXBlbmRlbnRDb250cm9scwotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNoQ29tYm8oQ29tYm8gY29tYm8sIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjb21ibywgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNvbWJvTGlzdGVuZXIpIHsKLQkJCWNvbWJvTGlzdGVuZXIgPSBuZXcgQ29tYm9MaXN0ZW5lcigpOwotCQl9Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyB0byBzeW5jIHRoZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNoZWNrYm94IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eU5hbWUuIFRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIG11c3QgY29udGFpbiBhIGphdmEubGFuZy5Cb29sZWFuIHR5cGVkIE9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tib3gKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIGRlcGVuZGVudENvbnRyb2xzCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hDaGVja2JveChCdXR0b24gY2hlY2tib3gsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIENvbnRyb2xbXSBkZXBlbmRlbnRDb250cm9scykgewotCQlzeW5jaENvbXBvc2l0ZShjaGVja2JveCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChudWxsID09IGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCWNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUYWJsZVZpZXdlcihDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJc3luY2hDb21wb3NpdGUodGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQkJaWYgKG51bGwgPT0gY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKSB7Ci0JCQljaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIgPSBuZXcgQ2hlY2tCb3hWaWV3ZXJMaXN0ZW5lcigpOwotCQl9Ci0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNoQ2hlY2tCb3hUcmVlVmlld2VyKENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwZW5kZW50Q29udHJvbHMpIHsKLQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJc3luY2hDb21wb3NpdGUodHJlZVZpZXdlci5nZXRDb250cm9sKCksIHByb3BlcnR5TmFtZSwgZGVwZW5kZW50Q29udHJvbHMpOwotCQlpZiAobnVsbCA9PSBjaGVja0JveFZpZXdlclN0YXRlTGlzdGVuZXIpIHsKLQkJCWNoZWNrQm94Vmlld2VyU3RhdGVMaXN0ZW5lciA9IG5ldyBDaGVja0JveFZpZXdlckxpc3RlbmVyKCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2hlY2tCb3hWaWV3ZXJTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaFJhZGlvKEJ1dHRvbiByYWRpbywgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCS8vIFVzZXMgY2hlY2tib3ggc3luY2hlcgotCQlzeW5jaENoZWNrYm94KHJhZGlvLCBwcm9wZXJ0eU5hbWUsIGRlcGVuZGVudENvbnRyb2xzKTsKLQl9Ci0KLQlwcml2YXRlIFRpbWVkTW9kaWZ5TGlzdGVuZXIgZ2V0VGltZWRMaXN0ZW5lcigpIHsKLQkJaWYgKHRpbWVkTW9kaWZ5TGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRpbWVkTW9kaWZ5TGlzdGVuZXIgPSBuZXcgVGltZWRNb2RpZnlMaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQkJV2lkZ2V0IHcgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQkJCQlpZiAoY3VycmVudFdpZGdldCA9PSB3IHx8IHcuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KHcpOwotCQkJCQlzZXRUZXh0UHJvcGVydHkocHJvcGVydHlOYW1lLCAoVGV4dCkgdyk7Ci0JCQkJfQotCQkJfSkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoaWdub3JlTW9kaWZ5RXZlbnQpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXN1cGVyLm1vZGlmeVRleHQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIHRpbWVkTW9kaWZ5TGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGV4dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFRleHQgdGV4dCkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRleHQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeVRleHRMaXN0ZW5lciBnZXRNb2RpZnlUZXh0TGlzdGVuZXIoKSB7Ci0JCWlmIChudWxsID09IG1vZGlmeVRleHRMaXN0ZW5lcikKLQkJCW1vZGlmeVRleHRMaXN0ZW5lciA9IG5ldyBNb2RpZnlUZXh0TGlzdGVuZXIoKTsKLQkJcmV0dXJuIG1vZGlmeVRleHRMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGF0YU1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQljaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCW1vZGlmeVRleHRMaXN0ZW5lciA9IG51bGw7Ci0JCXByb3BlcnR5VG9XaWRnZXRIYXNoID0gbnVsbDsKLQkJdGltZWRNb2RpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCXdpZGdldFRvRGVwQ29udHJvbHMgPSBudWxsOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmMmZiNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLldhcm5pbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWkuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuUGFnZUdyb3VwTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFNb2RlbFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElETVBhZ2VIYW5kbGVyIHsKLQlwcml2YXRlIFBhZ2VHcm91cE1hbmFnZXIgcGFnZUdyb3VwTWFuYWdlcjsKLQlwcml2YXRlIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByaXZhdGUgQWRkYWJsZVBhZ2VHcm91cCByb290UGFnZUdyb3VwOwotCXByaXZhdGUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHJvb3RPcGVyYXRpb247Ci0KLQkvLyBwcml2YXRlIElXaXphcmRQYWdlIGZpcnN0cGFnZTsKLQotCXB1YmxpYyBEYXRhTW9kZWxXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIElEIHRoYXQgY2xpZW50cyBzaG91bGQgZXh0ZW5kIHRvIGFkZCB0byB0aGlzIHdpemFyZAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0V2l6YXJkSUQoKSB7Ci0JCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRJRCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgcm9vdCBvcGVyYXRpb24gZm9yIHRoaXMgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gZ2V0Um9vdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZ2V0RGF0YU1vZGVsKCkuZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgZmluYWxpemVkIHRvIGhhbmRsZSB0aGUgYWRkaW5nIG9mIGV4dGVuZGVkIHBhZ2VzLiBDbGllbnRzIHNob3VsZCBvdmVycmlkZQotCSAqIGRvQWRkUGFnZXMoKSB0byBhZGQgdGhlaXIgcGFnZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWluaXQoKTsKLQkJZG9BZGRQYWdlcygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBwYWdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCX0KLQotCS8vIFRPRE8gbWFrZSB0aGlzIGZpbmFsCi0JcHVibGljIElXaXphcmRQYWdlIGdldFN0YXJ0aW5nUGFnZSgpIHsKLQkJcGFnZUdyb3VwTWFuYWdlci5yZXNldCgpOwotCQlyZXR1cm4gZ2V0TmV4dFBhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0KLQkJSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKTsKLQotCQkvLyBJZiBhbiBlcnJvciBvY2N1cmVkIHRoZW4gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIG5leHQgcGFnZSB3aWxsIGJlIHRoZSBzYW1lLgotCQlpZiAoY3VycmVudFBhZ2UgIT0gbmV4dFBhZ2UgJiYgbmV4dFBhZ2UgIT0gbnVsbCkgewotCQkJbmV4dFBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCQkJbmV4dFBhZ2Uuc2V0UHJldmlvdXNQYWdlKGN1cnJlbnRQYWdlKTsKLQkJfQotCi0JCXJldHVybiBjdXJyZW50UGFnZSA9PSBuZXh0UGFnZSA/IG51bGwgOiBuZXh0UGFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZE5leHRQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWROZXh0UGFnZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB3aXNoaW5nIHRvIGNvbnRyb2wgdGhlIHBhZ2Ugb3JkZXJpbmcgc2hvdWxkIGRvIHNvIGJ5IG92ZXJyaWRpbmcKLQkgKiBnZXROZXh0UGFnZShTdHJpbmcsIFN0cmluZykgYW5kIGdldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKiAKLQkgKiBAbGluayAjZ2V0TmV4dFBhZ2UoU3RyaW5nLCBTdHJpbmcpCi0JICogQGxpbmsgI2dldFByZXZpb3VzUGFnZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQkvLyBUT0RPIG1ha2UgdGhpcyBmaW5hbAotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlyZXR1cm4gcGFnZSAhPSBudWxsID8gcGFnZS5nZXRQcmV2aW91c1BhZ2UoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSkgewotCQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKCFzdXBlci5jYW5GaW5pc2goKSB8fCAhZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlciBnZXRQYWdlR3JvdXBNYW5hZ2VyKCkgewotCQlyZXR1cm4gcGFnZUdyb3VwTWFuYWdlcjsKLQl9Ci0KLQkvLyBUT0RPIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMuIFBlcmhhcHMgaW4gdGhlIFBhZ2VHcm91cE1hbmFnZXIKLQkvLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWZ0ZXJGaW5pc2hFcnJvcigpIHsKLQkJLy8gSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJLy8gRGF0YU1vZGVsV2l6YXJkUGFnZSB3dHBQYWdlID0gKERhdGFNb2RlbFdpemFyZFBhZ2UpIHBhZ2VzW2ldOwotCQkvLyB3dHBQYWdlLnZhbGlkYXRlUGFnZSh0cnVlKTsKLQkJLy8gfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhlY3V0aW5nKCkgewotCQlyZXR1cm4gZXhlY3V0aW5nOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0aW5nID0gZmFsc2U7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJZXhlY3V0aW5nID0gdHJ1ZTsKLQkJCWlmIChwcmVQZXJmb3JtRmluaXNoKCkpIHsKLQkJCQlzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCi0JCQkJZmluYWwgSVN0YXR1cyBzdCA9IHJ1bk9wZXJhdGlvbnMoKTsKLQotCQkJCWlmIChzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQkJV1RQVUlQbHVnaW4ubG9nKHN0KTsKLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBuZXcgQ29yZUV4Y2VwdGlvbihzdCksIDAsIGZhbHNlKTsKLQkJCQl9IGVsc2UgaWYoc3QuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpewotCQkJCQlXYXJuaW5nRGlhbG9nLm9wZW5XYXJuaW5nKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMiwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgc3QuZ2V0TWVzc2FnZSgpLCBzdCwgSVN0YXR1cy5XQVJOSU5HKTsKLQkJCQl9Ci0KLQkJCQlwb3N0UGVyZm9ybUZpbmlzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlXVFBVSVBsdWdpbi5sb2coZXhjKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV1RQV2l6YXJkX1VJXzAsIG5ldyBPYmplY3RbXXtnZXRXaW5kb3dUaXRsZSgpfSksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgZXhjLCAwLCBmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlleGVjdXRpbmcgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBydW5PcGVyYXRpb25zKCkgewotCQlmaW5hbCBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbMV07Ci0JCWNsYXNzIENhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQkJcHVibGljIFRocm93YWJsZSBjYXVnaHQgPSBudWxsOwotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChyb290T3BlcmF0aW9uID09IG51bGwpIHsKLQkJCQkJCS8vVGhpcyB3aWxsIGJlIHRoZSB0eXBpY2FsIGNhc2UgYmVjYXVzZSBtb3N0IHdpemFyZHMgd2lsbAotCQkJCQkJLy9ub3QgaW5pdGlhbGl6ZSB0aGUgcm9vdCBvcGVyYXRpb24gZHVyaW5nIGluaXQuCi0JCQkJCQlyb290T3BlcmF0aW9uID0gZ2V0Um9vdE9wZXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCXN0YXR1c1swXSA9IHJvb3RPcGVyYXRpb24uZXhlY3V0ZShwbSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJY2F1Z2h0ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ2F0Y2hUaHJvd2FibGVSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzKCk7Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihydW5Gb3JrZWQoKSwgaXNDYW5jZWxhYmxlKCksIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCXJ1bm5hYmxlLmNhdWdodCA9IGU7Ci0JCX0KLQkJaWYgKHJ1bm5hYmxlLmNhdWdodCAhPSBudWxsKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocnVubmFibGUuY2F1Z2h0KTsKLQkJCXN0YXR1c1swXSA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgcnVubmFibGUuY2F1Z2h0LmdldE1lc3NhZ2UoKSwgcnVubmFibGUuY2F1Z2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8xLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCBydW5uYWJsZS5jYXVnaHQsIDAsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzWzBdOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCXBhZ2VHcm91cE1hbmFnZXIudW5kb0FsbEN1cnJlbnRPcGVyYXRpb25zKCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRvIHBlcmZvcm0gYW55IHRhc2tzIHByaW9yIHRvIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4gUmV0dXJuIHRydWUgdG8KLQkgKiBoYXZlIHRoZSBvcGVyYXRpb24gcnVuIGFuZCBmYWxzZSB0byBzdG9wIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcGVyZm9ybSBhbnkgYWN0aW9ucyBuZWNlc3NhcnkgYWZ0ZXIgcGVyZm9ybWluZyBGaW5pc2guCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCXBhZ2VHcm91cE1hbmFnZXIuc3RvcmVEZWZhdWx0U2V0dGluZ3ModGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSBpbnN0YW5jZW9mIERhdGFNb2RlbFdpemFyZFBhZ2UpCi0JCQkoKERhdGFNb2RlbFdpemFyZFBhZ2UpIHBhZ2UpLnN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSBpZiB0aGV5IG5lZWQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgd2hlbiBzdG9yaW5nIHRoZSBkZWZhdWx0Ci0JICogc2V0dGluZ3MgZm9yIGEgcGFydGljdWxhciBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogQHBhcmFtIHBhZ2VJbmRleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKElXaXphcmRQYWdlIHBhZ2UsIGludCBwYWdlSW5kZXgpIHsKLQkJc3RvcmVEZWZhdWx0U2V0dGluZ3MocGFnZSk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uIGlzIGFsbG93ZWQgdG8gYmUgY2FuY2VsbGVkLiBUaGUgZGVmYXVsdAotCSAqIGlzIGZhbHNlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhbmNlbGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byByZXR1cm4gZmFsc2UgaWYgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBydW4gZm9ya2VkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5Gb3JrZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCWlmIChudWxsID09IGRhdGFNb2RlbCkgewotCQkJZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoZ2V0RGVmYXVsdFByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChudWxsICE9IHJvb3RQYWdlR3JvdXApIHsKLQkJCUxpc3QgcGFnZXMgPSByb290UGFnZUdyb3VwLmdldFBhZ2VzKGRhdGFNb2RlbCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlPYmplY3QgcGFnZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElXaXphcmRQYWdlKQotCQkJCXsKLQkJCQkJKChJV2l6YXJkUGFnZSlwYWdlKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChudWxsICE9IGRhdGFNb2RlbCkgewotCQkJZGF0YU1vZGVsLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBhIFNpbXBsZVBhZ2VHcm91cC4gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBvdmVycmlkZWQgdGhpcyBtZXRob2QgdG8KLQkgKiByZXR1cm4gYSBkaWZmZXJlbnQgcm9vdCBwYWdlIGdyb3VwIGZvciB0aGUgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQWRkYWJsZVBhZ2VHcm91cCBjcmVhdGVSb290UGFnZUdyb3VwKCkgewotCQlTdHJpbmcgaWQgPSBnZXRXaXphcmRJRCgpOwotCQkvLyBGb3IgdGhlIHJvb3QgcGFnZSBncm91cCB0aGUgd2l6YXJkIGlkIGFuZCB0aGUgZ3JvdXAgaWQgYXJlIHRoZSBzYW1lLgotCQlTaW1wbGVQYWdlR3JvdXAgcGFnZUdyb3VwID0gbmV3IFNpbXBsZVBhZ2VHcm91cChpZCwgaWQpOwotCQlwYWdlR3JvdXAuc2V0UGFnZUhhbmRsZXIodGhpcyk7Ci0JCXJldHVybiBwYWdlR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyB3aXphcmQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJRW52aXJvbm1lbnQgY3JlYXRlRW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUVudmlyb25tZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXJvb3RQYWdlR3JvdXAuYWRkUGFnZShwYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJcm9vdFBhZ2VHcm91cCA9IGNyZWF0ZVJvb3RQYWdlR3JvdXAoKTsKLQkJaWYgKG5lZWRzVG9SdW5PcGVyYXRpb25zQmVmb3JlRmluaXNoKCkpIHsKLQkJCXJvb3RPcGVyYXRpb24gPSBnZXRSb290T3BlcmF0aW9uKCk7Ci0JCQlwYWdlR3JvdXBNYW5hZ2VyID0gbmV3IFBhZ2VHcm91cE1hbmFnZXIocm9vdE9wZXJhdGlvbiwgcm9vdFBhZ2VHcm91cCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWdlR3JvdXBNYW5hZ2VyID0gbmV3IFBhZ2VHcm91cE1hbmFnZXIoZ2V0RGF0YU1vZGVsKCksIHJvb3RQYWdlR3JvdXApOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJldHVybiB0cnVlIGlmIHRoZXkgcmVxdWlyZSB0aGUgcnVubmluZwotCSAqIG9mIHRoZSBvcGVyYXRpb24gZHVyaW5nIHBhZ2UgdHVybmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgYm9vbGVhbiBkZWZhdWx0ZWQgdG8gZmFsc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmVlZHNUb1J1bk9wZXJhdGlvbnNCZWZvcmVGaW5pc2goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB7Ci0JCXJldHVybiBzdXBlci5uZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKSB8fCBnZXRQYWdlR3JvdXBNYW5hZ2VyKCkuaGFzTXVsdGlwbGVQYWdlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM3NmY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlcjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFdpemFyZEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyIHJlYWRlcjsKLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBEYXRhTW9kZWxXaXphcmQgYnkgdGhlIHNwZWNpZmllZCBpZCBhbmQKLQkgKiBjb25zdHJ1Y3RzIGEgbmV3IERhdGFNb2RlbFdpemFyZCB1c2luZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSURhdGFNb2RlbAotCSAqIGxvb2tlZCB1cCB3aXRoIHRoZSBzYW1lIGlkLiBJZiB0aGUgRGF0YU1vZGVsV2l6YXJkIGlzIG5vdCBmb3VuZCB0aGVuIGEKLQkgKiBSdW50aW1lRXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgRGF0YU1vZGVsV2l6YXJkCi0JICogQHJldHVybiBhIG5ldyBEYXRhTW9kZWxXaXphcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGFNb2RlbFdpemFyZCBjcmVhdGVXaXphcmQoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBjcmVhdGVXaXphcmQoRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIHRoZSBpZCByZXR1cmVkIGZyb20KLQkgKiA8Y29kZT5kYXRhTW9kZWwuZ2V0SUQoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEByZXR1cm4gYSBuZXcgRGF0YU1vZGVsV2l6YXJkCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxXaXphcmQgY3JlYXRlV2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBsb2FkV2l6YXJkKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGxvYWRXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRXaXphcmQoZGF0YU1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgRGF0YU1vZGVsV2l6YXJkIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjbGFzcyBhcyB0aGUgaWQuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG8KLQkgKiA8Y29kZT5jcmVhdGVXaXphcmQoY2xhc3NJRC5nZXROYW1lKCkpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NJRAotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIG5hbWUgaXMgdGhlIGlkIG9mIHRoZSBEYXRhTW9kZWxXaXphcmQKLQkgKiBAcmV0dXJuIGEgbmV3IERhdGFNb2RlbFdpemFyZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsV2l6YXJkIGNyZWF0ZVdpemFyZChDbGFzcyBkYXRhTW9kZWxQcm92aWRlcklEKSB7Ci0JCXJldHVybiBjcmVhdGVXaXphcmQoZGF0YU1vZGVsUHJvdmlkZXJJRC5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0RhdGFNb2RlbFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwNTdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9EYXRhTW9kZWxXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuVmFsaWRhdGlvblN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBORVhUID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUkVWSU9VUyA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9TSVRFX0JPUkRFUiA9IFNXVC5OVUxMOwotCXByaXZhdGUgVmFsaWRhdGlvblN0YXR1cyBzdGF0dXMgPSBuZXcgVmFsaWRhdGlvblN0YXR1cygpOwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpcnN0VGltZVRvUGFnZSA9IHRydWU7Ci0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBNYXAgdmFsaWRhdGlvbk1hcDsKLQlwcml2YXRlIFN0cmluZ1tdIHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzOwotCXByb3RlY3RlZCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wSUQ7Ci0JcHJpdmF0ZSBEYXRhTW9kZWxXaXphcmQgd2l6YXJkOwotCXByaXZhdGUgSVdpemFyZFBhZ2UgcHJldmlvdXNQYWdlOwotCi0JLyoqCi0JICogSjJFRVdpemFyZFBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbml0aWFsaXplU3luY2hIZWxwZXIoSURhdGFNb2RlbCBkbSkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKGRtKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFV2l6YXJkUGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0aXRsZUltYWdlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0YU1vZGVsV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQltb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJc3luY2hIZWxwZXIgPSBpbml0aWFsaXplU3luY2hIZWxwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIGRpYWxvZyBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLiBUaGlzCi0JICogbWV0aG9kIGhhcyBiZWVuIGFic3RyYWN0IGFuZCBpdCB1c2VzIHRoZSB0ZW1wbGF0ZSBwYXR0ZXJuIHRvIGdldCB0aGUgY29ycmVjdCBpdGVtcyBzZXR1cCBpbgotCSAqIHRoZSBjb3JyZWN0IG9yZGVyLiBTZWUgdGhlIHNldCBvZiBtZXRob2RzIGJlbG93IHRoYXQgYXJlIGNhbGxlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBjcmVhdGVkIGNvbnRyb2wgY2FuIGJlIGFjY2Vzc2VkIHZpYQotCSAqIDxjb2RlPmdldENvbnRyb2w8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlzZXRDb250cm9sKHRvcCk7Ci0JCXNldHVwSW5mb3BvcCh0b3ApOwotCQlzZXREZWZhdWx0cygpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpIHsKLQkJdmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPT0gbnVsbCB8fCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGggPT0gMCkKLQkJCXZhbGlkYXRpb25NYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCWVsc2UgewotCQkJdmFsaWRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKQotCQkJCXZhbGlkYXRpb25NYXAucHV0KHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldLCBuZXcgSW50ZWdlcihpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJLy8gVE9ETyB3aHkgaXMgdGhhdCBsYXN0IGdldE5leHRQYWdlKCkgY2FsbCBoZXJlPz8/Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpICYmICgobnVsbCAhPSB3aXphcmQgJiYgd2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5oYXNOZXh0UGFnZSgpIHx8IG51bGwgIT0gZ2V0TmV4dFBhZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdpemFyZFBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2l6YXJkKElXaXphcmQgbmV3V2l6YXJkKSB7Ci0JCXN1cGVyLnNldFdpemFyZChuZXdXaXphcmQpOwotCQlpZiAobmV3V2l6YXJkIGluc3RhbmNlb2YgRGF0YU1vZGVsV2l6YXJkKSB7Ci0JCQl3aXphcmQgPSAoRGF0YU1vZGVsV2l6YXJkKSBuZXdXaXphcmQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKCkgewotCQlyZXR1cm4gcHJldmlvdXNQYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXN1cGVyLnNldFByZXZpb3VzUGFnZShwYWdlKTsKLQkJcHJldmlvdXNQYWdlID0gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBzaG91bGQgcmV0dXJuIHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkIG9uIHRoaXMgcGFnZSBpbiB0aGUKLQkgKiBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIHByZXNlbnQgdGhlaXIgbWVzc2FnZXMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3AgbGV2ZWwgQ29tcG9zaXRlIGZvciB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIFNldCB1cCBpbmZvIHBvcCBob29rcyBpZiBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBJbmZvcG9wKENvbnRyb2wgcGFyZW50KSB7Ci0JCWlmIChnZXRJbmZvcG9wSUQoKSAhPSBudWxsKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIGdldEluZm9wb3BJRCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXR1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoaXMgcGFnZS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhcHByb3ByaWF0ZQotCSAqIGRlZmF1bHRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRzKCkgewotCQlyZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgaGF2ZSBkZWZhdWx0IHNldHRpbmdzIHRoYXQgaGF2ZSBiZWVuIHN0b3JlZAotCSAqIGFuZCBuZWVkIHRvIGJlIHJlc3RvcmVkLgotCSAqIAotCSAqIEBzZWUgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JfQotCi0JLyoqCi0JICogQWRkIExpc3RlbmVycyB0byBjb250cm9scyBhdCB0aGlzIHBvaW50IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGV2ZW50cy4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0byBhZGQgbGlzdGVuZXJzIHRvIGl0cyBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhZ2UgaXMgYmVpbmcgbWFkZSBjdXJyZW50IGFuZCB2aXNpYmxlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG1vdmluZyBiYWNrIG9uZSBwYWdlLgotCQkJaWYgKG51bGwgIT0gd2l6YXJkICYmIHdpemFyZC5nZXRQcmV2aW91c1BhZ2Uod2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5nZXRDdXJyZW50UGFnZSgpKSA9PSB0aGlzKSB7Ci0JCQkJd2l6YXJkLmdldFBhZ2VHcm91cE1hbmFnZXIoKS5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJCX0KLQotCQkJdmFsaWRhdGVQYWdlKHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzRmlyc3RUaW1lVG9QYWdlID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gdHJ1ZSB1bmxlc3MgaXQgaXMgdGhlIGZpcnN0IHRpbWUgZW50ZXJpbmcgdGhpcyBwYWdlIGluCi0JICogd2hpY2ggY2FzZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBwYWdlIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBub3QuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaWYgdGhleSBkbyBub3Qgd2FudCB0aGlzIGRlZmF1bHQgYmVoYXZpb3IuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkgewotCQlyZXR1cm4gIWlzRmlyc3RUaW1lVG9QYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIHRydWUgdW5sZXNzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIGVudGVyaW5nIHRoaXMgcGFnZSBpbgotCSAqIHdoaWNoIGNhc2Ugd2UgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgcGFnZSBhbmQgcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbm90LgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHNob3dWYWxpZGF0b2luRXJyb3JzT25FbnRlciBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVPbkVudGVyKCkgewotCQlyZXR1cm4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhpdGluZyB0aGUgcGFnZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4aXQoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXJldHVybiBzdGF0dXMuaGFzRXJyb3Ioa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYW4gZXZlbnQgdGhhdCB0aGUgcmVjZWl2ZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG9jY3Vycy4gSWYgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhpcwotCSAqIG1ldGhvZCwgaXQgbXVzdCBjYWxsIHN1cGVyLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHdoaWNoIG9jY3VycmVkCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZSBiYXNlZCBvbiB0aGUgbGFzdCBlcnJvciBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvciA9IHN0YXR1cy5nZXRMYXN0RXJyTXNnKCk7Ci0JCWlmIChlcnJvciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQlzZXRFcnJvck1lc3NhZ2UoKFN0cmluZykgbnVsbCk7Ci0JCQlTdHJpbmcgd2FybmluZyA9IHN0YXR1cy5nZXRMYXN0V2FybmluZ01zZygpOwotCQkJaWYgKHdhcm5pbmcgPT0gbnVsbCkgewotCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORykKLQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgaW5mbyA9IHN0YXR1cy5nZXRMYXN0SW5mb01zZygpOwotCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKQotCQkJCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0gZWxzZSBpZiAoIWluZm8uZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoaW5mbywgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF3YXJuaW5nLmVxdWFscyhnZXRNZXNzYWdlKCkpKQotCQkJCXNldE1lc3NhZ2Uod2FybmluZywgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfSBlbHNlIGlmICghZXJyb3IuZXF1YWxzKGdldEVycm9yTWVzc2FnZSgpKSkKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQkJfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldEVycm9yU3RhdHVzKGtleSwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgd2FybmluZ01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldFdhcm5pbmdTdGF0dXMoa2V5LCB3YXJuaW5nTWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEluZm9TdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBpbmZvTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0SW5mb1N0YXR1cyhrZXksIGluZm9NZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlzdGF0dXMuc2V0T0tTdGF0dXMoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGlhbG9nUGFnZTwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JRGlhbG9nUGFnZTwvY29kZT4gbWV0aG9kIHNldHMKLQkgKiB0aGUgY29udHJvbCB0byB0aGUgZ2l2ZW4gdmlzaWJpbGl0eSBzdGF0ZS4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kLgotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWVudGVyKCk7Ci0JCX0gZWxzZQotCQkJZXhpdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgV2l6YXJkIGp1c3QgcHJpb3IgdG8gcnVubmluZyB0aGUgcGVyZm9ybUZpbmlzaCBvcGVyYXRpb24uCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gc3RvcmUgdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBub3cgYmVpbmcgdmFsaWRhdGVkLiBBdCB0aGlzIHRpbWUsIGVhY2ggY29udHJvbCBpcyB2YWxpZGF0ZWQgYW5kIHRoZW4gdGhlCi0JICogY29udHJvbHMgYXJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMgd2hpY2ggd2FzIHVwZGF0ZWQgZHVyaW5nCi0JICogPGNvZGU+dmFsaWRhdGVDb250cm9scygpPC9jb2RlPi4gRmluYWxseSwgaXQgd2lsbCBkaXNwbGF5IHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgYW5kIGl0Ci0JICogd2lsbCBzZXQgdGhlIHBhZ2UgY29tcGxldGUuIFN1YmNsYXNzZXMgd2lsbCBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJdmFsaWRhdGVQYWdlKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZShib29sZWFuIHNob3dNZXNzYWdlKSB7Ci0JCWlmICghaXNWYWxpZGF0aW5nKSB7Ci0JCQlpc1ZhbGlkYXRpbmcgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpOwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQkJaWYgKHNob3dNZXNzYWdlKQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoc3RhdHVzLmdldExhc3RFcnJNc2coKSA9PSBudWxsKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaXNWYWxpZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBpbmRpdmlkdWFsIGNvbnRyb2xzLiBVc2UgdmFsaWRhdGlvbiBrZXlzIHRvIGtlZXAgdHJhY2sgb2YgZXJyb3JzLgotCSAqIAotCSAqIEBzZWUgc2V0T0tTdGF0dXMoSW50ZWdlcikgYW5kIHNldEVycm9yTWVzc2FnZShJbnRlZ2VyLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpIHsKLQkJaWYgKCF2YWxpZGF0aW9uTWFwLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIHByb3BOYW1lOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXByb3BOYW1lID0gdmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV07Ci0JCQkJSW50ZWdlciB2YWxLZXkgPSAoSW50ZWdlcikgdmFsaWRhdGlvbk1hcC5nZXQocHJvcE5hbWUpOwotCQkJCWlmICh2YWxLZXkgIT0gbnVsbCkKLQkJCQkJdmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSwgdmFsS2V5KTsKLQkJCQlpZiAoIWdldFN0YXR1cyh2YWxLZXkpKQotCQkJCQlyZXR1cm4gcHJvcE5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSB2YWxpZGF0aW9ua2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSW50ZWdlciB2YWxpZGF0aW9uS2V5KSB7Ci0JCXNldE9LU3RhdHVzKHZhbGlkYXRpb25LZXkpOwotCQlJU3RhdHVzIHN0YXR1czEgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghc3RhdHVzMS5pc09LKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzMS5pc011bHRpU3RhdHVzKCkgPyBzdGF0dXMxLmdldENoaWxkcmVuKClbMF0uZ2V0TWVzc2FnZSgpIDogc3RhdHVzMS5nZXRNZXNzYWdlKCk7Ci0JCQlzd2l0Y2ggKHN0YXR1czEuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJCXNldEVycm9yU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCXNldFdhcm5pbmdTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJc2V0SW5mb1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YgY29udHJvbHMgYWZ0ZXIgdmFsaWRhdGlvbi4gU3VibGNhc3NlcyBzaG91bGQgY2hlY2sgdGhlIHN0YXR1cyBvZgotCSAqIHZhbGlkYXRpb24ga2V5cyB0byBkZXRlcm1pbmUgZW5hYmxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpc0ZpcnN0VGltZVRvUGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaXJzdFRpbWVUb1BhZ2UoKSB7Ci0JCXJldHVybiBpc0ZpcnN0VGltZVRvUGFnZTsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhU3RhdHVzTWVzc2FnZShJU3RhdHVzIGphdmFTdGF0dXMsIEludGVnZXIgc3RhdHVzS2V5LCBTdHJpbmcgbWVzc2FnZSkgewotCS8vIGlmIChqYXZhU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCS8vIHNldFdhcm5pbmdTdGF0dXMoc3RhdHVzS2V5LCBtZXNzYWdlKTsKLQkvLyBlbHNlCi0JLy8gc2V0RXJyb3JTdGF0dXMoc3RhdHVzS2V5LCBtZXNzYWdlKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpcnN0VGltZVRvUGFnZShib29sZWFuIGIpIHsKLQkJaXNGaXJzdFRpbWVUb1BhZ2UgPSBiOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnb3REYXRhTW9kZWxXaXphcmQgPSBmYWxzZTsKLQlwcml2YXRlIERhdGFNb2RlbFdpemFyZCBkYXRhTW9kZWxXaXphcmQgPSBudWxsOwotCXByb3RlY3RlZCBEYXRhTW9kZWxXaXphcmQgZ2V0RGF0YU1vZGVsV2l6YXJkKCl7Ci0JCWlmKCFnb3REYXRhTW9kZWxXaXphcmQpewotCQkJZ290RGF0YU1vZGVsV2l6YXJkID0gdHJ1ZTsKLQkJCUlXaXphcmQgd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCQlpZih3aXphcmQgaW5zdGFuY2VvZiBEYXRhTW9kZWxXaXphcmQpewotCQkJCWRhdGFNb2RlbFdpemFyZCA9IChEYXRhTW9kZWxXaXphcmQpd2l6YXJkOwotCQkJfQotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWxXaXphcmQ7Ci0JfQotCQotCQotCS8qCi0JICogSWYgYSBwcm9wZXJ0eSBjaGFuZ2VzIHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSwgZm9yY2UgdmFsaWRhdGlvbiBvbiB0aGlzIHBhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJRGF0YU1vZGVsV2l6YXJkIHcgPSBnZXREYXRhTW9kZWxXaXphcmQoKTsKLQkJaWYodyA9PSBudWxsIHx8ICF3LmlzRXhlY3V0aW5nKCkpewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzICE9IG51bGwgJiYgKGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcgfHwgKCFpc1BhZ2VDb21wbGV0ZSgpICYmIGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHKSkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQkJdmFsaWRhdGVQYWdlKHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChzeW5jaEhlbHBlciAhPSBudWxsKSB7Ci0JCQlzeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCQlzeW5jaEhlbHBlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIGluZm9wb3BJRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcG9wSUQoU3RyaW5nIGluZm9wb3BJRCkgewotCQl0aGlzLmluZm9wb3BJRCA9IGluZm9wb3BJRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjEwNWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJRE1QYWdlR3JvdXAgCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkSUQoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSW5zZXJ0aW9uSUQoKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKTsKLSAgCi0gIHB1YmxpYyBMaXN0IGdldFBhZ2VzKElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLSAgCi0gIHB1YmxpYyBJRE1QYWdlSGFuZGxlciBnZXRQYWdlSGFuZGxlciggSURhdGFNb2RlbCBkYXRhTW9kZWwgKTsKLSAgCi0gIHB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlR3JvdXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzBlNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvSURNUGFnZUdyb3VwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotLyoqCi0gKiAKLSAqIFRoZSB3aXphcmQgZnJhbWV3b3JrIGFsbG93cyBwYWdlIGdyb3VwcyB0byBiZSBpbnNlcnRlZCBhZnRlciBvdGhlciBwYWdlIGdyb3VwLgotICogSWYgbW9yZSB0aGFuIG9uZSBwYWdlIGdyb3VwIGluc2VydHMgaXRzZWxmIGFmdGVyIGEgcGFydGljdWxhciBwYWdlIGdyb3VwIGl0IG1heQotICogbm90IGJlIGRldGVybWluaXN0aWMgd2hpY2ggcGFnZSBncm91cCBzaG91bGQgZm9sbG93IGVhY2ggb3RoZXIuICBUaGlzIGNsYXNzCi0gKiBhbGxvd3MgYSBwYXJ0aWN1bGFyIHBhZ2UgZ3JvdXAgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBzdWJzZXF1ZW50IHBhZ2UKLSAqIGdyb3VwcyBzaG91bGQgYmUgb3JkZXJlZC4KLSAqIAotICogRm9yIGV4YW1wbGU6IEEgcGFnZSBncm91cCBUIGhhcyB0aHJlZSBwYWdlIGdyb3VwcyBYLCBZLCBhbmQgWiB0aGF0IGhhdmUgcmVnaXN0ZXJlZAotICogICAgICAgICAgICAgIHZpYSB0aGUgd2l6YXJkUGFnZUdyb3VwIGV4dGVuc2lvbiBwb2ludCB0byBmb2xsb3cgaXQuCi0gKiAgICAgICAgICAgICAgVGhlIHdpemFyZCBmcmFtZXdvcmsgd2lsbCBjYWxsIGdldE5leHRHcm91cCB3aXRoOgotICogICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIFQuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJYIiwgIlkiLCAiWiIgfSApCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBlaXRoZXIgIlgiLCAiWSIsICJaIiwgb3IgbnVsbCBpZiBubyBwYWdlIGdyb3VwCi0gKiAgICAgICAgICAgICAgc2hvdWxkIGZvbGxvdy4gIElmICJZIiB3YXMgcmV0dXJuZWQgdGhlbiBhIHN1YmVxdWVudCBjYWxsCi0gKiAgICAgICAgICAgICAgd2lsbCBiZSBtYWRlIGJ5IHRoZSBmcmFtZXdvcmsgd2l0aDoKLSAqICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBULmdldE5leHRHcm91cCggIlkiLCB7ICJYIiwgIlkiLCAiWiIgfSApCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgQWdhaW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBlaXRoZXIgIlgiLCAiWSIsICJaIiwgb3IgbnVsbCBpZiBubyBwYWdlCi0gKiAgICAgICAgICAgICAgZ3JvdXAgc2hvdWxkIGZvbGxvdyB0aGlzIHBhZ2UgZ3JvdXAgIlkiLgotICogICAgICAgICAgICAgIAotICogTm90ZTogYW55IHBhZ2UgZ3JvdXAgY2FuIGhhdmUgYSBwYWdlIGdyb3VwIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGl0IHNvIHRoaXMgbWV0aG9kCi0gKiAgICAgICBjYWxsIGlzIHJlY3Vyc2l2ZSBpbiBuYXR1cmUuICBGb3IgZXhhbXBsZTogdGhlIHBhZ2UgZ3JvdXAgWSBtaWdodCBoYXZlIHBhZ2UKLSAqICAgICAgIGdyb3VwcyBZMSwgWTIsIGFuZCBZMyBmb2xsb3dpbmcgaXQuICBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNhbGxzOgotICogICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoIG51bGwsIHsgIlgiLCAiWSIsICJaIiB9ICkgIC8vICJZIiBpcyBzZWxlY3RlZCB1c2luZyBUcyBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIFkuZ2V0TmV4dEdyb3VwKCBudWxsLCB7ICJZMSIsICJZMiIsICJZMyIgfSApIC8vICJZMSIgaXMgc2VsZWN0ZWQgdXNpbmcgWXMgaGFuZGxlci4KLSAqICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICBGb3IgdGhpcyBleGFtcGxlIFkxIGhhcyBubyBwYWdlIGdyb3VwcyBmb2xsb3dpbmcgaXQuCi0gKiAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgVC5nZXROZXh0R3JvdXAoICJZIiwgeyAiWCIsICJZIiwgIloiIH0gKSAgLy8gbnVsbCBpcyBzZWxlY3RlZCB1c2luZyBUcyBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgIEZvciB0aGlzIGV4YW1wbGUsIHRoZSBUIGhhbmRsZXIgZGVjaWRlZCB0aGF0IG5vIHBhZ2UgZ3JvdXAgZm9sbG93ZWQgWSBub3QgZXZlbiBYIG9yIFouCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElETVBhZ2VHcm91cEhhbmRsZXIgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGN1cnJlbnRQYWdlR3JvdXBJRCB0aGUgY3VycmVudCBwYWdlIGdyb3VwIElELiAgVGhpcyB2YWx1ZSB3aWxsIGJlIG51bGwgdGhlIGZpcnN0IHRpbWUgCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgKiBAcGFyYW0gcGFnZUdyb3VwSURzIGEgbGlzdCBvZiBwYWdlIGdyb3VwIElEcyB0aGF0IGZvbGxvdyB0aGUgcGFnZSBncm91cCBmb3IgdGhpcyBoYW5kbGVyLgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBhZ2UgZ3JvdXAgaWQgdGhhdCBzaG91bGQgZm9sbG93IGN1cnJlbnRQYWdlR3JvdXBJRCwgb3IgaXQKLSAgICogc2hvdWxkIHJldHVybiBudWxsIGlmIG5vIHBhZ2UgZ3JvdXAgZm9sbG93cyBjdXJyZW50UGFnZUdyb3VwSUQuCi0gICAqIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKCBTdHJpbmcgY3VycmVudFBhZ2VHcm91cElELCBTdHJpbmdbXSBwYWdlR3JvdXBJRHMgKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9JRE1QYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQxOWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL3VpL0lETVBhZ2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gc3Vic3RhbnRpYWwgY2hhbmdlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRE1QYWdlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhpcyBhcyB0aGUgcGFnZSBuYW1lIGlmIHRoZSBleHBlY3RlZE5leHRQYWdlTmFtZSBvciBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUgc2hvdWxkCi0JICogYmUgc2tpcHBlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfUEFHRSA9ICJJRE1FeHRlbmRlZFBhZ2VIYW5kbGVyLlNLSVBfUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHByZWZpeCB0aGlzIHN0cmluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWdlIHdoaWNoIG9jY3VycyBiZWZvcmUgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUKLQkgKiByZXR1cm5lZC4gRS5HLiBzdXBwb3NlIHlvdXIgcGFnZSBjb250cmlidXRpb25zIGtub3cgYWJvdXQgcGFnZXMgQSwgQiBhbmQgQywgYW5kIHlvdSB3YW50IHRoZQotCSAqIHRvIHNraXAgcGFnZXMgQiBhbmQgQywgd2hlbiBnb2luZyB0byB0aGUgbmV4dCBwYWdlIGZyb20gQS4gVG8gZG8gdGhpcywgcmV0dXJuIFBBR0VfQUZURVIrQy4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgdGhlbiBhc2sgdGhlIHdpemFyZCBmb3IgdGhlIHBhZ2UgdGhhdCBub3JtYWxseSBjb21lcyBhZnRlciBwYWdlIEMuCi0JICogUEFHRV9CRUZPUkUgd29ya3Mgc2ltaWxhcmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfQUZURVIgPSAiSURNRXh0ZW5kZWRQYWdlSGFuZGxlci5QQUdFX0FGVEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogc2FtZSBhcyBQQUdFX0FGVEVSLCBleGNlcHQgZm9yIHJldHVyaW5nIHRoZSBwYWdlIGJlZm9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0JFRk9SRSA9ICJJRE1FeHRlbmRlZFBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYWdlIHRoYXQgc2hvdWxkIGJlIG5leHQKLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGUgd2l6YXJkIGlzIGN1cnJlbnRseSBvbgotCSAqIEBwYXJhbSBleHBlY3RlZE5leHRQYWdlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHBhZ2UgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBuZXh0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV4dFBhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkTmV4dFBhZ2VOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFnZSB0aGF0IHNob3VsZCBiZSBwcmV2aW91cwotCSAqIAotCSAqIEBwYXJhbSBjdXJyZW50UGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwYWdlIHRoZSB3aXphcmQgaXMgY3VycmVudGx5IG9uCi0JICogQHBhcmFtIGV4cGVjdGVkTmV4dFBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHByZXZpb3VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJldmlvdXNQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvdWkvU2ltcGxlUGFnZUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9TaW1wbGVQYWdlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5MzZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC91aS9TaW1wbGVQYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUGFnZUdyb3VwIGltcGxlbWVudHMgQWRkYWJsZVBhZ2VHcm91cCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRDsKLQlwcml2YXRlIFN0cmluZyB3aXphcmRJRDsKLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCXByaXZhdGUgU3RyaW5nIHJlcXVpcmVkRGF0YU9wZXJhdGlvbjsKLQlwcml2YXRlIFNldCAgICBkYXRhTW9kZWxJRHM7Ci0KLQlwcml2YXRlIElETVBhZ2VIYW5kbGVyIHBhZ2VIYW5kbGVyOwotCXByaXZhdGUgSURNUGFnZUdyb3VwSGFuZGxlciBwYWdlR3JvdXBIYW5kbGVyOwotCXByaXZhdGUgVmVjdG9yIHBhZ2VzOwotCi0JcHVibGljIFNpbXBsZVBhZ2VHcm91cChTdHJpbmcgZ3JvdXBJRCwgU3RyaW5nIHdpemFyZElELCBib29sZWFuIGFsbG93RXh0ZW5kZWRQYWdlcywgU3RyaW5nIHJlcXVpcmVEYXRhT3BlcmF0aW9uKSB7Ci0JCXRoaXMuZ3JvdXBJRCA9IGdyb3VwSUQ7Ci0JCXRoaXMud2l6YXJkSUQgPSB3aXphcmRJRDsKLQkJdGhpcy5hbGxvd0V4dGVuZGVkUGFnZXMgPSBhbGxvd0V4dGVuZGVkUGFnZXM7Ci0JCXRoaXMucmVxdWlyZWREYXRhT3BlcmF0aW9uID0gcmVxdWlyZURhdGFPcGVyYXRpb247Ci0JCXBhZ2VzID0gbmV3IFZlY3RvcigpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVQYWdlR3JvdXAoU3RyaW5nIGdyb3VwSUQsIFN0cmluZyB3aXphcmRJRCkgewotCQl0aGlzKGdyb3VwSUQsIHdpemFyZElELCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJcGFnZXMuYWRkKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKElXaXphcmRQYWdlW10gbmV3UGFnZXMpIHsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5ld1BhZ2VzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJcGFnZXMuYWRkKG5ld1BhZ2VzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd3NFeHRlbmRlZFBhZ2VzKCkgewotCQlyZXR1cm4gYWxsb3dFeHRlbmRlZFBhZ2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VHcm91cEhhbmRsZXIoSURNUGFnZUdyb3VwSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXBhZ2VHcm91cEhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VHcm91cEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFnZUhhbmRsZXIoSURNUGFnZUhhbmRsZXIgaGFuZGxlcikgewotCQlwYWdlSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gcGFnZXM7Ci0JfQotCQotCXB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldEV4dGVuZGVkUGFnZXMoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIChJV2l6YXJkUGFnZVtdKSBwYWdlcy50b0FycmF5KG5ldyBJV2l6YXJkUGFnZVswXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJRCgpIHsKLQkJcmV0dXJuIGdyb3VwSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZERhdGFPcGVyYXRpb25Ub1J1bigpIHsKLQkJcmV0dXJuIHJlcXVpcmVkRGF0YU9wZXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZElEKCkgewotCQlyZXR1cm4gd2l6YXJkSUQ7Ci0JfQotCi0JcHVibGljIFNldCBnZXREYXRhTW9kZWxJRHMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWxJRHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsSURzKFNldCBkYXRhTW9kZWxJRHMpIHsKLQkJdGhpcy5kYXRhTW9kZWxJRHMgPSBkYXRhTW9kZWxJRHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMGQxMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIEVycm9yRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0luZm9EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL0luZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjNTY1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9JbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEluZm9EaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBJbmZvRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL01lc3NhZ2VEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL01lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ODYyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9NZXNzYWdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kaWFsb2cudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0gIC8qKgotICAgKiBSZXNlcnZlIHJvb20gZm9yIHRoaXMgbWFueSBsaXN0IGl0ZW1zLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQotICAvKioKLSAgICogVGhlIERldGFpbHMgYnV0dG9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCi0gIC8qKgotICAgKiBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBTV1QgbGlzdCBjb250cm9sIHRoYXQgZGlzcGxheXMgdGhlIGVycm9yIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotICBwcm90ZWN0ZWQgVGV4dCBkZXRhaWxzOwotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXJyb3IgZGV0YWlscyB2aWV3ZXIgaXMgY3VycmVudGx5IGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0Q3JlYXRlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhaWxzQ3JlYXRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBGaWx0ZXIgbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggc3RhdHVzIGl0ZW1zIHRvIGRpc3BsYXkuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGRpc3BsYXlNYXNrID0gMHhGRkZGOwotCi0gIC8qKgotICAgKiBUaGUgbWFpbiBzdGF0dXMgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIElTdGF0dXMgc3RhdHVzOwotICAKLSAgcHJpdmF0ZSBQb2ludCBzYXZlZFNpemUgPSBudWxsOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHRoZSBtYWluIGVycm9yIG9iamVjdCdzIGRldGFpbGVkIGVycm9ycyAoZWxlbWVudCB0eXBlOiA8Y29kZT5TdGF0dXM8L2NvZGU+KS4KLSAgICovCi0gIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgTWVzc2FnZURpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLSAgZGlhbG9nVGl0bGU7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IEpGYWNlUmVzb3VyY2VzLmZvcm1hdCgiUmVhc29uIiwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgc3RhdHVzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldENoaWxkcmVuKCkpOwotICAgIHRoaXMuZGlzcGxheU1hc2sgPSBkaXNwbGF5TWFzazsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rIG9yCi0gICAqIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLSAgICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotICAgKiBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uIHdpbGwgb25seSBiZQotICAgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICB7IC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMKLSAgICogb2YgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLSAgICAvLyBjcmVhdGUgY29tcG9zaXRlCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBDb21wb3NpdGUgaW1hZ2VBbmRMYWJlbCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgaW1hZ2VBbmRMYWJlbC5zZXRMYXlvdXQoZ2wpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICBJbWFnZSBpbWFnZSA9IGdldERpYWxvZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaW1hZ2VBbmRMYWJlbCwgMCk7Ci0gICAgICBpbWFnZS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICBsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKAotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIG1lc3NhZ2UKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KGltYWdlQW5kTGFiZWwsIFNXVC5SRUFEX09OTFl8U1dULldSQVApOwotICAgICAgdGV4dC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgICBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotICAgICAgICAgICAgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLSAgICAgIGRhdGEud2lkdGhIaW50ID0KLSAgICAgICAgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0gICAgIAotICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgdGV4dC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotICAgIH0KLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVEcm9wRG93bkxpc3QoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgbGlzdAotICAgIGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgLy8gZmlsbCB0aGUgbGlzdAotICAgIHBvcHVsYXRlTGlzdChsaXN0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gbGlzdC5nZXRJdGVtSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGxpc3RDcmVhdGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICBwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93bkRldGFpbHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGRldGFpbHMgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAvL2RldGFpbHMuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIENvbG9yIGNvbG9yID0gbmV3IENvbG9yKHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDI1NSk7Ci0gICAgZGV0YWlscy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLSAgICBwb3B1bGF0ZURldGFpbHMoZGV0YWlscywgc3RhdHVzLCAwKTsKLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRldGFpbHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZXRhaWxzLnNldFNlbGVjdGlvbigwKTsKLSAgICBkZXRhaWxzQ3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGRldGFpbHM7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotICAgKi8KLSAgLyoqCi0gICAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0gICAqIHRoZSBlcnJvci4gSWYgeW91IHNwZWNpZmllZCBhIG1hc2sgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0gICAqIGNoaWxkcmVuLCB0aGUgZXJyb3IgZGlhbG9nIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lCi0gICAqIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLSAgICovCi0gIHB1YmxpYyBpbnQgb3BlbigpCi0gIHsKLSAgICBpZiAoc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIub3BlbigpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotICAvKioKLSAgICogVGhpcyBlc3NlbnRpYWxseSBkb2VzIHRoZSB3b3JrIG9mIGEgZmFjdG9yeSBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8KLSAgICogZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nCi0gICAqIGRpc3BsYXllZCBkb2VzIG5vdCBjb250YWluIGNoaWxkIGl0ZW1zLCBvciBpZiB5b3Ugd2lzaCB0byBkaXNwbGF5IGFsbCBzdWNoCi0gICAqIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHJldHVybiB0aGUgY29kZSBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nIGNsb3NpbmcuIFRoaXMgd2lsbCBiZSA8Y29kZT5EaWFsb2cuT0s8L2NvZGU+IGlmIHRoZSBPSwotICAgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotICAgKiAgICAgICAgIGRpYWxvZydzIGNsb3NlIHdpbmRvdyBkZWNvcmF0aW9uIG9yIHRoZSBFU0Mga2V5IHdhcyB1c2VkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cykKLSAgewotCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuSU5GTyA6Ci0gICAgICAgIHJldHVybiBvcGVuSW5mbygKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgZGlhbG9nVGl0bGUsCi0gICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTyB8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotICAgICAgICByZXR1cm4gb3Blbldhcm5pbmcoCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICByZXR1cm4gb3BlbkVycm9yKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuTWVzc2FnZSgKLSAgICBTaGVsbCBwYXJlbnQsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIENob2ljZVtdIG9wdGlvbnMpCi0gIHsKLQotICAgIHJldHVybiBvcGVuT3B0aW9ucygKLSAgICAgIHBhcmVudCwKLSAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgbWVzc2FnZSwKLSAgICAgIHN0YXR1cywKLSAgICAgIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SLAotICAgICAgb3B0aW9ucyk7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlCi0gICAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSB3aXNoCi0gICAqIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLSAgICogY2hpbGRyZW4uIFRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLSAgICogY2hpbGQgc3RhdHVzIG1hdGNoaW5nIHRoZSBtYXNrLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICogQHJldHVybiB0aGUgY29kZSBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHByZXNzZWQgdGhhdCByZXN1bHRlZCBpbiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nIGNsb3NpbmcuIFRoaXMgd2lsbCBiZSA8Y29kZT5EaWFsb2cuT0s8L2NvZGU+IGlmIHRoZSBPSwotICAgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotICAgKiAgICAgICAgIGRpYWxvZydzIGNsb3NlIHdpbmRvdyBkZWNvcmF0aW9uIG9yIHRoZSBFU0Mga2V5IHdhcyB1c2VkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBFcnJvckRpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IEVycm9yRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuSW5mbygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgSVN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgSW5mb0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IEluZm9EaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5XYXJuaW5nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBJU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBXYXJuaW5nRGlhbG9nIGRpYWxvZyA9Ci0gICAgICBuZXcgV2FybmluZ0RpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk9wdGlvbnMoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaywKLSAgICBDaG9pY2VbXSBvcHRpb25zKQotICB7Ci0gICAgT3B0aW9uc0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IE9wdGlvbnNEaWFsb2coCi0gICAgICAgIHBhcmVudFNoZWxsLAotICAgICAgICB0aXRsZSwKLSAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgc3RhdHVzLAotICAgICAgICBkaXNwbGF5TWFzaywKLSAgICAgICAgb3B0aW9ucyk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICByZXR1cm4gZGlhbG9nLmdldFJldHVybkNvZGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzIHRoZQotICAgKiBjaGlsZCBzdGF0aSBvZiB0aGUgc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZSBmb3JtYXQKLSAgICogZm9yIGVhY2ggZW50cnkgaXMgc3RhdHVzX3BhdGggOiBzdGF0dXNfbWVzc2FnZSBJZiB0aGUgc3RhdHVzJ3MgcGF0aCB3YXMKLSAgICogbnVsbCB0aGVuIGl0IChhbmQgdGhlIGNvbG9uKSBhcmUgb21pdHRlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgSXRlcmF0b3IgZW51bWVyYXRpb24gPSBzdGF0dXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJU3RhdHVzIGNoaWxkU3RhdHVzID0gKElTdGF0dXMpIGVudW1lcmF0aW9uLm5leHQoKTsKLSAgICAgIHBvcHVsYXRlTGlzdChsaXN0LCBjaGlsZFN0YXR1cywgMCk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0LCBJU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpCi0gIHsKLSAgICBpZiAoIXN0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgc2IuYXBwZW5kKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgIGxpc3QuYWRkKHNiLnRvU3RyaW5nKCkpOwotICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZURldGFpbHMoVGV4dCB0ZXh0LCBJU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpCi0gIHsKLSAgICBpZiAoIXN0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBTdHJpbmcgICAgdGFiQ2hhcnMgICAgPSByZXBlYXQoICcgJywgbmVzdGluZyAqIDIgKTsKLSAgICBTdHJpbmcgICAgbWVzc2FnZUxpbmUgPSB0YWJDaGFycyArIHN0YXR1cy5nZXRNZXNzYWdlKCkgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLSAgICBUaHJvd2FibGUgZXhjZXB0ICAgICAgPSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgCi0gICAgdGV4dC5hcHBlbmQoIG1lc3NhZ2VMaW5lICk7Ci0gICAgCi0gICAgaWYoIGV4Y2VwdCAhPSBudWxsICkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB0cmFjZSA9IGdldFN0YWNrVHJhY2UoIGV4Y2VwdCApOwotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2UubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgdGV4dC5hcHBlbmQoIHRhYkNoYXJzICsgIiAgICAiICsgdHJhY2VbaW5kZXhdICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlRGV0YWlscyh0ZXh0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgYSBzdGF0dXMgb2JqZWN0Ci0gICAqIEBwYXJhbSBtYXNrCi0gICAqICAgICAgICAgICAgYSBtYXNrIGFzIHBlciA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZAotICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGREaXNwbGF5KElTdGF0dXMgc3RhdHVzLCBpbnQgbWFzaykKLSAgewotICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBzdGF0dXMubWF0Y2hlcyhtYXNrKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY2hpbGRyZW5baV0ubWF0Y2hlcyhtYXNrKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKioKLSAgICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyCi0gICAqIHByZXNzaW5nIHRoZSBkZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpCi0gIHsKLSAgICBQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0gICAgaW50ICAgbmV3SGVpZ2h0ICA9IC0xOwotICAgIAotICAgIGlmIChkZXRhaWxzQ3JlYXRlZCkKLSAgICB7Ci0gICAgICBkZXRhaWxzLmRpc3Bvc2UoKTsKLSAgICAgIGRldGFpbHNDcmVhdGVkID0gZmFsc2U7Ci0gICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotICAgICAgCi0gICAgICAvLyBXaXRob3V0IHRoZSBmb2xsb3dpbmcgY29tcHV0ZVNpemUgY2FsbCB0aGUgc2V0U2l6ZSBjYWxsIGJlbG93IHRocm93cyBhbiBhcnJheSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi4KLSAgICAgIC8vIFZlcnkgd2VpcmQuCi0gICAgICBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAKLSAgICAgIG5ld0hlaWdodCA9IHNhdmVkU2l6ZS55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYoIHNhdmVkU2l6ZSA9PSBudWxsICkgc2F2ZWRTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgCi0gICAgICBkZXRhaWxzID0gY3JlYXRlRHJvcERvd25EZXRhaWxzKChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLSAgICAgIG5ld0hlaWdodCA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotICAgIH0KLQotCi0gICAgbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0ID4gNDAwID8gNDAwIDogbmV3SGVpZ2h0OwotICAgIAotICAgIGdldFNoZWxsKCkuc2V0U2l6ZSggbmV3IFBvaW50KHdpbmRvd1NpemUueCwgbmV3SGVpZ2h0KSApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZ1tdIGdldFN0YWNrVHJhY2UoIFRocm93YWJsZSBleGMgKQotICB7Ci0gICAgVmVjdG9yICAgICAgIGxpbmVzICAgICAgICA9IG5ldyBWZWN0b3IoKTsKLSAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyICBwcmludFdyaXRlciAgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmluZ1dyaXRlciApOwotICAgIAotICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoIHByaW50V3JpdGVyICk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgcHJpbnRXcml0ZXIuY2xvc2UoKTsKLSAgICAgIHN0cmluZ1dyaXRlci5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCggRXhjZXB0aW9uIG5lc3RlZEV4YyApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgfQotICAgIAotICAgIFN0cmluZ1JlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSApOwotICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIHN0cmluZ1JlYWRlciApOwotICAgIFN0cmluZyAgICAgICAgIGxpbmUgICAgICAgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAKLSAgICAgIHdoaWxlKCBsaW5lICE9IG51bGwgKQotICAgICAgewotICAgICAgICBsaW5lcy5hZGQoIGxpbmUudHJpbSgpICk7Ci0gICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKWxpbmVzLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcmVwZWF0KCBjaGFyIHRoZV9jaGFyLCBpbnQgY291bnQgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIGNvdW50ICk7Ci0KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGJ1Zi5hcHBlbmQoIHRoZV9jaGFyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvT3B0aW9uc0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvT3B0aW9uc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTg2OWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGlhbG9nL3VpL09wdGlvbnNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIHByaXZhdGUgQ2hvaWNlW10gY2hvaWNlczsKLSAgcHJpdmF0ZSBpbnQgcmV0dXJuQ29kZV87Ci0KLSAgcHVibGljIE9wdGlvbnNEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaywKLSAgICBDaG9pY2VbXSBjaG9pY2VzKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICB0aGlzLmNob2ljZXMgPSBjaG9pY2VzOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBidXR0b24gZm9yIGVhY2ggb3B0aW9ucwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCksIGNob2ljZXNbaV0uZ2V0TGFiZWwoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpICkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpCi0gICAgICAvLyB3YXMgdGhlIERldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UmV0dXJuQ29kZShpZCk7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFJldHVybkNvZGUoaW50IGlkKQotICB7Ci0gICAgcmV0dXJuQ29kZV8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0UmV0dXJuQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gcmV0dXJuQ29kZV87Ci0gIH0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBJU3RhdHVzLklORk8gOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjYTM2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9TdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi0vKioKLSogQ29uc3RhbnRzIGZvciBzdGF0dXMgZGlhbG9ncwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfTEFCRUwiKTsKLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1RPX0FMTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX1RPX0FMTF9MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9MQUJFTCA9IEVudmlyb25tZW50UGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfQ0FOQ0VMX0xBQkVMIik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9XYXJuaW5nRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RpYWxvZy91aS9XYXJuaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNjZkODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kaWFsb2cvdWkvV2FybmluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgV2FybmluZ0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIFdhcm5pbmdEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIElTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSywgQ2FuY2VsIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLSAgICBjcmVhdGVCdXR0b24oCi0gICAgICBwYXJlbnQsCi0gICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAotICAgICAgZmFsc2UpOwotICAgIGlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBUaGlzIGlzIG9uZSBvZiB0aGUgZmV3IG1ldGhvZHMgdGhhdCBuZWVkcyB0byBiZSBvdmVyd3JpdHRlbiBieSB0aGUKLSAgICogc3ViY2xhc3Nlcy4gVGhlIGltYWdlIG5hbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgRGlhbG9nIGNsYXNzCi0gICAqLwotICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGlhbG9nSW1hZ2UoKQotICB7Ci0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZmY0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYW4gSUVudmlyb25tZW50IGNsYXNzIGZvciB0aGUgRWNsaXBzZSBJRW52aXJvbm1lbnQuCi0gKiBUaGlzIElFbnZpcm9ubWVudCBjdXJyZW50bHkgc3VwcG9ydHMgdGhlICJwbGF0Zm9ybSIgcHJvdG9jb2wgYW5kIHRoZSAiZmlsZSIKLSAqIHByb3RvY29sLgotICoKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VFbnZpcm9ubWVudCBpbXBsZW1lbnRzIElFbnZpcm9ubWVudAotewotICBwcml2YXRlIFNpbXBsZVVSSUZhY3RvcnkgdXJpRmFjdG9yeV8gICAgICA9IG51bGw7Ci0gIHByaXZhdGUgSVN0YXR1c0hhbmRsZXIgICAgc3RhdHVzSGFuZGxlcl8gICA9IG51bGw7Ci0gIHByaXZhdGUgSUxvZyAgICAgICAgICAgICAgbG9nZ2VyXyAgICAgICAgICA9IG51bGw7Ci0gIAotICBwdWJsaWMgRWNsaXBzZUVudmlyb25tZW50KCkKLSAgewotICAgIHRoaXMoIG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpICk7ICAKLSAgfQotICAKLSAgcHVibGljIEVjbGlwc2VFbnZpcm9ubWVudCggSVN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLSAgewotICAgIElVUklTY2hlbWUgZWNsaXBzZVNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlU2NoZW1lKCk7Ci0gICAgSVVSSVNjaGVtZSBmaWxlU2NoZW1lICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICBzdGF0dXNIYW5kbGVyXyAgID0gc3RhdHVzSGFuZGxlcjsKLSAgICAKLSAgICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggInBsYXRmb3JtIiwgZWNsaXBzZVNjaGVtZSApOyAvLyROT04tTkxTLTEkCi0gICAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJmaWxlIiwgZmlsZVNjaGVtZSApOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldExvZygpCi0gICAqLwotICBwdWJsaWMgSUxvZyBnZXRMb2coKQotICB7Ci0JICBpZiggbG9nZ2VyXyA9PSBudWxsICkKLSAgICB7ICAKLSAgICAgIGxvZ2dlcl8gPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUxvZygpOyAKLSAgICB9OwotCQotICAgIHJldHVybiBsb2dnZXJfOwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQjZ2V0U3RhdHVzSGFuZGxlcigpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1c0hhbmRsZXIgZ2V0U3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzSGFuZGxlcl87Ci0gIH0KLQotICAvKiogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50I2dldFVSSUZhY3RvcnkoKQotICAgKi8KLSAgcHVibGljIElVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHVyaUZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvRWNsaXBzZVN0YXR1c0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRjODJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRpYWxvZy51aS5TdGF0dXNEaWFsb2dDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBFY2xpcHNlIFVJIHZlcnNpb24gb2YgdGhlIElTdGF0dXNIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyCi17Ci0gIHByaXZhdGUgU2hlbGwgICAgICAgIHNoZWxsXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpCi0gIHsKLSAgICB0aGlzKCBuZXcgU2hlbGwoKSApOwotICB9Ci0KLSAgcHVibGljIEVjbGlwc2VTdGF0dXNIYW5kbGVyKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc2hlbGxfID0gc2hlbGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoSVN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpIAotICB7Ci0gICAgaW50IHJlc3VsdCA9Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBNZXNzYWdlcy5USVRMRV9XQVJOSU5HLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzLAotCQkJCWNob2ljZXMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICAgewotICAgICAgaWYgKGNob2ljZXNbaV0uZ2V0U2hvcnRjdXQoKSA9PSByZXN1bHQpCi0gICAgICAgIHJldHVybiBjaG9pY2VzW2ldOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uSVN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KElTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHVzZXJPayA9IGZhbHNlOwotICAgIAotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgLy8gYW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgYW5kIHdlIG5lZWQgdG8gc3RvcCBleGVjdXRpbmcgdGhlIGNvbW1pbmcKLSAgICAgIC8vIGNvbW1hbmRzCi0gICAgICBjYXNlIFN0YXR1cy5FUlJPUiA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydEVycm9yU3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTdGF0dXMuV0FSTklORyA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHJlcG9ydFdhcm5pbmcoc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAKLSAgICAgIGNhc2UgU3RhdHVzLklORk8gOgotICAgICAgewotICAgICAgICB1c2VyT2sgPSB0cnVlOwotICAgICAgICByZXBvcnRJbmZvKHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiggIXVzZXJPayApIHRocm93IG5ldyBTdGF0dXNFeGNlcHRpb24oIHN0YXR1cyApOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0V2FybmluZyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIGludCB1c2VyUmVzcG9uc2UgPQotICAgICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBNZXNzYWdlcy5USVRMRV9XQVJOSU5HLAotICAgICAgICBudWxsLAotICAgICAgICBzdGF0dXMpOwotICAgIHJldHVybiAodXNlclJlc3BvbnNlID09IFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoSVN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBNZXNzYWdlRGlhbG9nLm9wZW5NZXNzYWdlKAotICAgICAgc2hlbGxfLAotICAgICAgTWVzc2FnZXMuVElUTEVfRVJST1IsCi0gICAgICBudWxsLAotICAgICAgc3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JU3RhdHVzSGFuZGxlciNyZXBvcnRJbmZvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhJU3RhdHVzIHN0YXR1cykKLSAgewotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgTWVzc2FnZXMuVElUTEVfSU5GTywKLSAgICAgICAgbnVsbCwKLSAgICAgICAgc3RhdHVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjMjllZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VjbGlwc2UvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVjbGlwc2UudWkuZW52aXJvbm1lbnQiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9XQVJOSU5HOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBUSVRMRV9FUlJPUjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVElUTEVfSU5GTzsKLSAgCi0gIHN0YXRpYwotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyggQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZWNsaXBzZS91aS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL2Vudmlyb25tZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmRlOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lY2xpcHNlL3VpL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dBUk5JTkc9V2FybmluZzoKLVRJVExFX0VSUk9SPUVycm9yOgotVElUTEVfSU5GTz1JbmZvOgotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0NvbW1vblVJUGx1Z2luQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjU1ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMTYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uVUlQbHVnaW5Db25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZjBjZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIHN1YnN0YW50aWFsIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkgewotCi0JcHVibGljIERNV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEKTsKLQotCS8qCi0JICogdGhpcyBpcyBvcHRpb25hbAotCSAqLwotCXB1YmxpYyBJRE1QYWdlSGFuZGxlciBjcmVhdGVQYWdlSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEKSAKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFRoaXMgcGFnZSBncm91cCBoYW5kbGVyIGNhbiBiZSBvcHRpb25hbGx5IG92ZXJyaWRlbi4KLQkgKi8KLQlwdWJsaWMgSURNUGFnZUdyb3VwSGFuZGxlciBjcmVhdGVQYWdlR3JvdXBIYW5kbGVyKCBJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VHcm91cElEICkKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzRmNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSWRlbnRpZmlhYmxlQ29tcGFyYXRvcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX0dST1VQID0gIndpemFyZFBhZ2VHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQUdFX0lEID0gInBhZ2VHcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1dJWkFSRF9JRCA9ICJ3aXphcmRJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9SRVFVSVJFU19EQVRBX09QRVJBVElPTl9JRCA9ICJyZXF1aXJlc0RhdGFPcGVyYXRpb25JZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9EQVRBX01PREVMX0lEUyA9ICJkYXRhTW9kZWxJZHMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSID0gImFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQUdFX0lOU0VSVElPTl9JRCA9ICJwYWdlR3JvdXBJbnNlcnRpb25JRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkFDVE9SWSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklEOwotCXByb3RlY3RlZCBTdHJpbmcgd2l6YXJkSUQ7Ci0JcHVibGljIFN0cmluZyBwYWdlR3JvdXBJRDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpemFyZEZhY3RvcnlFbGVtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcXVpcmVzRGF0YU9wZXJhdGlvbklkOwotCXByb3RlY3RlZCBTZXQgZGF0YU1vZGVsSURzOwotCXByb3RlY3RlZCBTdHJpbmcgcGFnZUluc2VydGlvbklEOwotCXByaXZhdGUgaW50IGxvYWRPcmRlcjsKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9hZE9yZGVyQ291bnRlcjsKLQotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXB1YmxpYyBETVdpemFyZFBhZ2VFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50MSkgewotCQlzdXBlcihlbGVtZW50MSk7Ci0JCXBsdWdpbklEID0gZWxlbWVudDEuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCXdpemFyZElEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9XSVpBUkRfSUQpOwotCQlwYWdlR3JvdXBJRCA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfUEFHRV9JRCk7Ci0JCXJlcXVpcmVzRGF0YU9wZXJhdGlvbklkID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9SRVFVSVJFU19EQVRBX09QRVJBVElPTl9JRCk7Ci0JCWRhdGFNb2RlbElEcyA9IGdldERhdGFNb2RlbElkcyggZWxlbWVudDEgKTsKLQkJcmVhZEFsbG93c0V4dGVuZGVkUGFnZUFmdGVyKGVsZW1lbnQxKTsKLQkJcGFnZUluc2VydGlvbklEID0gZWxlbWVudDEuZ2V0QXR0cmlidXRlKEFUVF9QQUdFX0lOU0VSVElPTl9JRCk7Ci0JCXJlYWRGYWN0b3J5KGVsZW1lbnQxKTsKLQkJdmFsaWRhdGVTZXR0aW5ncygpOwotCQlsb2FkT3JkZXIgPSBsb2FkT3JkZXJDb3VudGVyKys7Ci0JfQotCi0gIHByaXZhdGUgU2V0IGdldERhdGFNb2RlbElkcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBIYXNoU2V0IGlkcyAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgU3RyaW5nICBpZExpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREFUQV9NT0RFTF9JRFMpOwotICAgIAotICAgIGlmKCBpZExpc3QgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gZGF0YU1vZGVsSURzID0gaWRMaXN0LnNwbGl0KCAiICoiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFNb2RlbElEcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBpZHMuYWRkKCBkYXRhTW9kZWxJRHNbaW5kZXhdICk7ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGlkczsKLSAgfQotICAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTZXR0aW5ncygpIHsKLQkJaWYgKHdpemFyZElEID09IG51bGwgfHwgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID09IG51bGwpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW5jb21wbGV0ZSBwYWdlIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCByZWFkQWxsb3dzRXh0ZW5kZWRQYWdlQWZ0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCVN0cmluZyBhbGxvd3NQYWdlQWZ0ZXJWYWx1ZSA9IGVsZW1lbnQxLmdldEF0dHJpYnV0ZShBVFRfQUxMT1dTX0VYVEVOREVEX1BBR0VTX0FGVEVSKTsKLQkJYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyID0gYWxsb3dzUGFnZUFmdGVyVmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKGFsbG93c1BhZ2VBZnRlclZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQxKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGVsZW1lbnQxLmdldENoaWxkcmVuKEVMRU1FTlRfRkFDVE9SWSk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCAmJiBmYWN0b3JpZXMubGVuZ3RoID4gMCkgewotCQkJd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID0gbmV3IERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KGZhY3Rvcmllc1swXSwgcGFnZUdyb3VwSUQpOwotCQl9Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGNyZWF0ZVBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICh3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuY3JlYXRlUGFnZUhhbmRsZXIoZGF0YU1vZGVsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJaWYgKHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5jcmVhdGVQYWdlR3JvdXAoZGF0YU1vZGVsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgY3JlYXRlUGFnZUdyb3VwSGFuZGxlcihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlyZXR1cm4gd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50ID09IG51bGwgPyBudWxsIDogd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlyZXR1cm4gSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcywgbyk7Ci0JCS8qCi0JCSAqIGlmIChvID09IG51bGwpIHJldHVybiBHUkVBVEVSX1RIQU47IFdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSAoV2l6YXJkUGFnZUVsZW1lbnQpIG87IGlmCi0JCSAqIChnZXRJRCgpID09IG51bGwgJiYgZWxlbWVudC5nZXRJRCgpID09IG51bGwpIHJldHVybiBjb21wYXJlTG9hZE9yZGVyKGVsZW1lbnQpOyBpZgotCQkgKiAoZ2V0SUQoKSA9PSBudWxsKSByZXR1cm4gR1JFQVRFUl9USEFOOyBlbHNlIGlmIChlbGVtZW50LmdldElEKCkgPT0gbnVsbCkgcmV0dXJuCi0JCSAqIExFU1NfVEhBTjsKLQkJICogCi0JCSAqIGludCBwcmlvcml0eSA9IGdldFByaW9yaXR5KCk7IGludCBlbGVtZW50UHJpb3JpdHkgPWVsZW1lbnQuZ2V0UHJpb3JpdHkoKTsKLQkJICogCi0JCSAqIGlmIChwcmlvcml0eSA9PSBlbGVtZW50UHJpb3JpdHkpIHJldHVybiBjb21wYXJlTG9hZE9yZGVyKGVsZW1lbnQpOyBpZiAocHJpb3JpdHkgPAotCQkgKiBlbGVtZW50UHJpb3JpdHkpIHJldHVybiBHUkVBVEVSX1RIQU47IGlmIChwcmlvcml0eSA+IGVsZW1lbnRQcmlvcml0eSkgcmV0dXJuIExFU1NfVEhBTjsKLQkJICogcmV0dXJuIEVRVUFMOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkgewotCQlyZXR1cm4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUlEKCkgewotCQlyZXR1cm4gcGFnZUdyb3VwSUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUluc2VydGlvbklEKCkgewotCQlyZXR1cm4gcGFnZUluc2VydGlvbklEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKLQkJcmV0dXJuIGxvYWRPcmRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyKCkgewotCQlyZXR1cm4gYWxsb3dzRXh0ZW5kZWRQYWdlc0FmdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIKLQkgKiAgICAgICAgICAgIFRoZSBhbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcihib29sZWFuIGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikgewotCQl0aGlzLmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlciA9IGFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVzRGF0YU9wZXJhdGlvbklkKCkgewotCQlyZXR1cm4gcmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc0RhdGFPcGVyYXRpb25JZChTdHJpbmcgZGF0YU9wZXJhdGlvbklkKSB7Ci0JCXJlcXVpcmVzRGF0YU9wZXJhdGlvbklkID0gZGF0YU9wZXJhdGlvbklkOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RGF0YU1vZGVsSURzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsSURzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbElEKFNldCBuZXdEYXRhTW9kZWxJRHMpIHsKLQkJZGF0YU1vZGVsSURzID0gbmV3RGF0YU1vZGVsSURzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkRmFjdG9yeUVsZW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRGYWN0b3J5RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdpemFyZEZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRGYWN0b3J5RWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZEZhY3RvcnlFbGVtZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmRGYWN0b3J5RWxlbWVudChTdHJpbmcgd2l6YXJkRmFjdG9yeUVsZW1lbnQpIHsKLQkJdGhpcy53aXphcmRGYWN0b3J5RWxlbWVudCA9IHdpemFyZEZhY3RvcnlFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHdpemFyZElEOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aXphcmRJRAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZElEIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaXphcmRJRChTdHJpbmcgd2l6YXJkSUQpIHsKLQkJdGhpcy53aXphcmRJRCA9IHdpemFyZElEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50LgotCSAqLwotCXB1YmxpYyBETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCBnZXRXaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoKSB7Ci0JCXJldHVybiB3aXphcmRQYWdlRmFjdG9yeUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50KERNV2l6YXJkUGFnZUZhY3RvcnlFbGVtZW50IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCkgewotCQl0aGlzLndpemFyZFBhZ2VGYWN0b3J5RWxlbWVudCA9IHdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlSUQKLQkgKiAgICAgICAgICAgIFRoZSBwYWdlSUQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VJRChTdHJpbmcgcGFnZUlEKSB7Ci0JCXRoaXMucGFnZUdyb3VwSUQgPSBwYWdlSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBnZXRQYWdlSUQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyZjc3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfVUkgPSAib3JnLmVjbGlwc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIERNV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JSGFzaE1hcCB3aXphcmRQbHVnaW5JRE1hcCA9IG51bGw7Ci0KLQlUcmVlTWFwIHdpemFyZFBhZ2VFbGVtZW50cyA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFRyZWVTZXQgd2l6YXJkRXh0UGFnZUVsZW1lbnRzID0gbnVsbDsKLQlMaXN0IG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIFdpemFyZFBhZ2VFeHRlbnNpb25SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpIHsKLQkJc2V0dXBXaXphcmRQbHVnaW5JRE1hcCgpOwotCQlyZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JCXBvc3RSZWFkRnJvbVJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwV2l6YXJkUGx1Z2luSURNYXAoKSB7Ci0JCXdpemFyZFBsdWdpbklETWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gZ2V0IGVkaXRvciBwbHVnaW4gYW5kIHNhdmUgaXQgdG8gYSBoYXNoIG1hcAotCQkvLyBOb3RlOiBlZGl0b3JzIGV4dGVuc2lvbiBpZCBpcyBkaWZmZXJlbnQgZnJvbSBlZGl0b3IgaWQKLQotCQlJRXh0ZW5zaW9uUG9pbnRbXSBwb2ludCA9IG5ldyBJRXh0ZW5zaW9uUG9pbnRbXXtQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KE9SR19FQ0xJUFNFX1VJLCAiZXhwb3J0V2l6YXJkcyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoT1JHX0VDTElQU0VfVUksICJpbXBvcnRXaXphcmRzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChPUkdfRUNMSVBTRV9VSSwgIm5ld1dpemFyZHMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiLCAiZXh0ZW5kYWJsZVdpemFyZCIpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwb2ludC5sZW5ndGg7IHgrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludFt4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgd2l6YXJkSUQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50c1tpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQl3aXphcmRQbHVnaW5JRE1hcC5wdXQod2l6YXJkSUQsIHBsdWdpbklEKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRnJvbVJlZ2lzdHJ5KCkgewotCQl3aXphcmRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZU1hcCgpOwotCQkvLyB3aXphcmRFeHRQYWdlRWxlbWVudHMgPSBuZXcgVHJlZVNldCgpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFJlYWQgYWxsIHBhZ2UgZXh0ZW5zaW9ucyBpbnRvIGVkaXRvclBhZ2VFbGVtZW50cwotCQlyZWFkZXIgPSBuZXcgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpOwotCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZUV4dGVuc2lvblJlYWRlcigpIHsKLQkJCXN1cGVyKENvbW1vblVJUGx1Z2luQ29uc3RhbnRzLlBMVUdJTl9JRCwgRE1XaXphcmRQYWdlRWxlbWVudC5FTEVNRU5UX1BBR0VfR1JPVVApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmICghRE1XaXphcmRQYWdlRWxlbWVudC5FTEVNRU5UX1BBR0VfR1JPVVAuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXcgRE1XaXphcmRQYWdlRWxlbWVudChlbGVtZW50KTsKLQotCQkJLy8gcHV0IHRoZSBlbGVtZW50IGludG8gYSBoYXNobWFwLCB3aXphcmRJRCBhcyBrZXksCi0JCQkvLyBsaXN0IG9mIHBhZ2UgZWxlbWVudHMgYXMgb2JqZWN0Ci0JCQlTdHJpbmcgd2l6YXJkSUQgPSBuZXdFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JCQlpZiAoIXdpemFyZFBhZ2VFbGVtZW50cy5jb250YWluc0tleSh3aXphcmRJRCkpIHsKLQkJCQl3aXphcmRQYWdlRWxlbWVudHMucHV0KHdpemFyZElELCBjcmVhdGVQYWdlTWFwRW50cnkobmV3RWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQlUcmVlTWFwIHBhZ2VNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldCh3aXphcmRJRCk7Ci0JCQkJaW5zZXJ0UGFnZUVsZW1lbnQocGFnZU1hcCwgbmV3RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5zZXJ0UGFnZUVsZW1lbnQoVHJlZU1hcCBwYWdlTWFwLCBETVdpemFyZFBhZ2VFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJCWlmIChuZXdFbGVtZW50LnBhZ2VJbnNlcnRpb25JRCA9PSBudWxsKSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3RWxlbWVudCwgbmV3IFRyZWVTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IG5ld0VsZW1lbnQucGFnZUluc2VydGlvbklEOwotCQkJCURNV2l6YXJkUGFnZUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldFBhZ2VFbGVtZW50KGVsZW1lbnROYW1lLCBwYWdlTWFwKTsKLQkJCQlpbnNlcnRFeHRQYWdlRWxlbWVudChwYWdlTWFwLCBwYXJlbnRFbGVtZW50LCBuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJbmV3RWxlbWVudC5nZXRQYWdlSW5zZXJ0aW9uSUQoKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluc2VydEV4dFBhZ2VFbGVtZW50KFRyZWVNYXAgcGFnZU1hcCwgRE1XaXphcmRQYWdlRWxlbWVudCBwYXJlbnRFbGVtZW50LCBETVdpemFyZFBhZ2VFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpIHsKLQkJCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QuYWRkKG5ld0VsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICghcGFyZW50RWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMCwgbmV3IE9iamVjdFtde3BhcmVudEVsZW1lbnQuZ2V0UGFnZUlEKCl9KSk7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xLCBuZXcgT2JqZWN0W117bmV3RWxlbWVudC5nZXRQYWdlSUQoKX0pKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlUcmVlU2V0IHNldCA9IChUcmVlU2V0KSBwYWdlTWFwLmdldChwYXJlbnRFbGVtZW50KTsKLQkJCXNldC5hZGQobmV3RWxlbWVudCk7Ci0KLQkJCWlmIChuZXdFbGVtZW50LmFsbG93c0V4dGVuZGVkUGFnZXNBZnRlcikKLQkJCQlwYWdlTWFwLnB1dChuZXdFbGVtZW50LCBuZXcgVHJlZVNldCgpKTsKLQotCQkJaWYgKG5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jb250YWlucyhuZXdFbGVtZW50KSkKLQkJCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QucmVtb3ZlKG5ld0VsZW1lbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBETVdpemFyZFBhZ2VFbGVtZW50IGdldFBhZ2VFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgVHJlZU1hcCBtYXApIHsKLQkJCVNldCBrZXlTZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRE1XaXphcmRQYWdlRWxlbWVudCBlbGVtZW50ID0gKERNV2l6YXJkUGFnZUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50LmdldFBhZ2VJRCgpLmVxdWFscyhlbGVtZW50TmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCi0JCXByaXZhdGUgVHJlZU1hcCBjcmVhdGVQYWdlTWFwRW50cnkoRE1XaXphcmRQYWdlRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JCQlUcmVlTWFwIHBhZ2VNYXAgPSBuZXcgVHJlZU1hcCgpOwotCQkJVHJlZVNldCBwYWdlRXh0ZW5zaW9uU2V0ID0gbmV3IFRyZWVTZXQoKTsKLQkJCXBhZ2VNYXAucHV0KG5ld0VsZW1lbnQsIHBhZ2VFeHRlbnNpb25TZXQpOwotCQkJcmV0dXJuIHBhZ2VNYXA7Ci0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uRWxlbWVudHMoU3RyaW5nIHdpemFyZElEKSB7Ci0JCVRyZWVNYXAgdHJlZU1hcCA9IChUcmVlTWFwKSB3aXphcmRQYWdlRWxlbWVudHMuZ2V0KHdpemFyZElEKTsKLQkJcmV0dXJuIHRyZWVNYXAuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBETVdpemFyZFBhZ2VFbGVtZW50W10gZ2V0UGFnZUVsZW1lbnRzKFN0cmluZyB3aXphcmRJRCkgewotCQlUcmVlTWFwIGVsZW1lbnRNYXAgPSAoVHJlZU1hcCkgd2l6YXJkUGFnZUVsZW1lbnRzLmdldCh3aXphcmRJRCk7Ci0JCWlmIChlbGVtZW50TWFwID09IG51bGwgfHwgZWxlbWVudE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgRE1XaXphcmRQYWdlRWxlbWVudFswXTsKLQkJfQotCQlBcnJheUxpc3QgYWxyZWFkeVZpc3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRNYXAuc2l6ZSgpKTsKLQkJU2V0IGFsbFBhZ2VFbGVtZW50c0xpc3QgPSBlbGVtZW50TWFwLmtleVNldCgpOwotCQlBcnJheUxpc3Qgb3JkZXJlZFBhZ2VMaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50TWFwLnNpemUoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsUGFnZUVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURNV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChhbHJlYWR5VmlzdGVkTGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGVsZW1lbnQuZ2V0SUQoKSwgbnVsbCkuaXNFbmFibGVkKCkpIHsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCVRyZWVTZXQgdHJlZVNldCA9IChUcmVlU2V0KSBlbGVtZW50TWFwLmdldChlbGVtZW50KTsKLQkJCQlpZiAodHJlZVNldCAhPSBudWxsICYmICF0cmVlU2V0LmlzRW1wdHkoKSkKLQkJCQkJZmxhdGVuVHJlZVNldCh0cmVlU2V0LCBhbGxQYWdlRWxlbWVudHNMaXN0LCBhbHJlYWR5VmlzdGVkTGlzdCwgb3JkZXJlZFBhZ2VMaXN0LCBlbGVtZW50TWFwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0UGFnZUFycmF5KG9yZGVyZWRQYWdlTGlzdCk7Ci0KLQl9Ci0KLQlwcml2YXRlIERNV2l6YXJkUGFnZUVsZW1lbnRbXSBnZXRQYWdlQXJyYXkoQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCkgewotCQlETVdpemFyZFBhZ2VFbGVtZW50W10gcGFnZUVsZW1lbnRzID0gbmV3IERNV2l6YXJkUGFnZUVsZW1lbnRbb3JkZXJlZFBhZ2VMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZFBhZ2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwYWdlRWxlbWVudHNbaV0gPSAoRE1XaXphcmRQYWdlRWxlbWVudCkgb3JkZXJlZFBhZ2VMaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gcGFnZUVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBmbGF0ZW5UcmVlU2V0KFRyZWVTZXQgdHJlZVNldCwgU2V0IGFsbFBhZ2VFbGVtZW50c0xpc3QsIEFycmF5TGlzdCBhbHJlYWR5VmlzdGVkTGlzdCwgQXJyYXlMaXN0IG9yZGVyZWRQYWdlTGlzdCwgVHJlZU1hcCBlbGVtZW50TWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRyZWVTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWxyZWFkeVZpc3RlZExpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzIsIG5ldyBPYmplY3RbXXtlbGVtZW50LmdldFBhZ2VJRCgpLCBETVdpemFyZFBhZ2VFbGVtZW50LkFUVF9QQUdFX0lOU0VSVElPTl9JRH0pKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGFsbFBhZ2VFbGVtZW50c0xpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlUcmVlU2V0IHNldCA9IChUcmVlU2V0KSBlbGVtZW50TWFwLmdldChlbGVtZW50KTsKLQkJCQlvcmRlcmVkUGFnZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWFscmVhZHlWaXN0ZWRMaXN0LmFkZChlbGVtZW50KTsKLQkJCQlmbGF0ZW5UcmVlU2V0KHNldCwgYWxsUGFnZUVsZW1lbnRzTGlzdCwgYWxyZWFkeVZpc3RlZExpc3QsIG9yZGVyZWRQYWdlTGlzdCwgZWxlbWVudE1hcCk7Ci0JCQl9IGVsc2UgewotCQkJCW9yZGVyZWRQYWdlTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJYWxyZWFkeVZpc3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8vIGlmIGNoaWxkIGVsZW1lbnRzIGFyZSByZWFkIGluIGJlZm9yZSBwYXJlbnQgZWxlbWVudC4gRG8gcG9zdCByZWFkLgotCXByb3RlY3RlZCBBcnJheUxpc3QgbGlzdFJlbW92ZU9iamVjdHM7Ci0KLQlwcml2YXRlIHZvaWQgcG9zdFJlYWRGcm9tUmVnaXN0cnkoKSB7Ci0JCWxpc3RSZW1vdmVPYmplY3RzID0gbmV3IEFycmF5TGlzdChub25TeW5jZWRQYWdlRWxlbWVudExpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25TeW5jZWRQYWdlRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURNV2l6YXJkUGFnZUVsZW1lbnQgZWxlbWVudCA9IChETVdpemFyZFBhZ2VFbGVtZW50KSBub25TeW5jZWRQYWdlRWxlbWVudExpc3QuZ2V0KGkpOwotCQkJVHJlZU1hcCBwYWdlTWFwID0gKFRyZWVNYXApIHdpemFyZFBhZ2VFbGVtZW50cy5nZXQoZWxlbWVudC53aXphcmRJRCk7Ci0JCQlpZiAoZWxlbWVudC5wYWdlSW5zZXJ0aW9uSUQgPT0gbnVsbCkgewotCQkJCWFkZFRvRmlyc3RBdmlhbGlhYmxlKHBhZ2VNYXAsIGVsZW1lbnQpOwotCQkJfSBlbHNlIGlmIChyZWFkZXIgIT0gbnVsbCAmJiBwYWdlTWFwICE9IG51bGwpCi0JCQkJcmVhZGVyLmluc2VydFBhZ2VFbGVtZW50KHBhZ2VNYXAsIGVsZW1lbnQpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5yZW1vdmVBbGwobGlzdFJlbW92ZU9iamVjdHMpOwotCQlpZiAoIW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5pc0VtcHR5KCkpCi0JCQlsb2dNaXNzaW5nQ2xhc3NFcnJvcigpOwotCQlub25TeW5jZWRQYWdlRWxlbWVudExpc3QuY2xlYXIoKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTWFwCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9GaXJzdEF2aWFsaWFibGUoVHJlZU1hcCBwYWdlTWFwLCBETVdpemFyZFBhZ2VFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJYm9vbGVhbiBpbnNlcnROb3RGb3VuZCA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIpIHsKLQkJCQlUcmVlU2V0IHNldCA9IChUcmVlU2V0KSBwYWdlTWFwLmdldChlbGVtZW50KTsKLQkJCQlzZXQuYWRkKG5ld0VsZW1lbnQpOwotCQkJCWxpc3RSZW1vdmVPYmplY3RzLmFkZChuZXdFbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKGluc2VydE5vdEZvdW5kKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQkJbG9nZ2VyLmxvZ0Vycm9yKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzMpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nTWlzc2luZ0NsYXNzRXJyb3IoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlETVdpemFyZFBhZ2VFbGVtZW50IGVsZW1lbnQgPSAoRE1XaXphcmRQYWdlRWxlbWVudCkgbm9uU3luY2VkUGFnZUVsZW1lbnRMaXN0LmdldChpKTsKLQkJCWxvZ2dlci5sb2dFcnJvcihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfNCwgbmV3IE9iamVjdFtde2VsZW1lbnQucGFnZUluc2VydGlvbklELCBlbGVtZW50LmdldFBhZ2VJRCgpLCBlbGVtZW50LnBsdWdpbklEfSkpOwotCQl9Ci0JCW5vblN5bmNlZFBhZ2VFbGVtZW50TGlzdC5jbGVhcigpOwotCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRWpiUGFnZUV4dGVuc2lvblJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBETVdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRE1XaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNzY2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9ETVdpemFyZFBhZ2VGYWN0b3J5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkNvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQgZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgRE1XaXphcmRFeHRlbnNpb25GYWN0b3J5IHdpemFyZFBhZ2VGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZUZhY3RvcnlJbml0aWFsaXplZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhZ2VHcm91cElEOwotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRE1XaXphcmRQYWdlRmFjdG9yeUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwYWdlR3JvdXBJRCkgewotCQlzdXBlcihlbGVtZW50KTsKLQkJY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTX05BTUUpOwotCQl0aGlzLnBhZ2VHcm91cElEID0gcGFnZUdyb3VwSUQ7Ci0JfQotCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGNyZWF0ZVBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICghaXNQYWdlRmFjdG9yeUluaXRpYWxpemVkKQotCQkJaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCWlmICh3aXphcmRQYWdlRmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSURNUGFnZUhhbmRsZXIgaGFuZGxlciA9IHdpemFyZFBhZ2VGYWN0b3J5LmNyZWF0ZVBhZ2VIYW5kbGVyKGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkUGFnZVtdIGNyZWF0ZVBhZ2VHcm91cChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlpZiAoIWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCkKLQkJCWluaXRQYWdlRmFjdG9yeSgpOwotCi0JCWlmICh3aXphcmRQYWdlRmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRGF0YU1vZGVsV2l6YXJkUGFnZVtdIHBhZ2VzID0gd2l6YXJkUGFnZUZhY3RvcnkuY3JlYXRlUGFnZUdyb3VwKGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQpOwotCQkKLQkJcmV0dXJuIHBhZ2VzOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoIElEYXRhTW9kZWwgZGF0YU1vZGVsICkKLQl7Ci0JICBpZiAoIWlzUGFnZUZhY3RvcnlJbml0aWFsaXplZCkgaW5pdFBhZ2VGYWN0b3J5KCk7Ci0JCQotCSAgaWYoIHdpemFyZFBhZ2VGYWN0b3J5ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLQkgIAotCSAgcmV0dXJuIHdpemFyZFBhZ2VGYWN0b3J5LmNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoIGRhdGFNb2RlbCwgcGFnZUdyb3VwSUQgKTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZUZhY3RvcnkoKSB7Ci0JCXRyeSB7Ci0JCQl3aXphcmRQYWdlRmFjdG9yeSA9IChETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1NfTkFNRSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBnZXR0aW5nIHBhZ2UgZmFjdG9yeTogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1BhZ2VGYWN0b3J5SW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0RhdGFNb2RlbFdpemFyZEV4dGVuc2lvblJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTdiNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxXaXphcmRFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OID0gIkRhdGFNb2RlbFdpemFyZEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVCA9ICJEYXRhTW9kZWxXaXphcmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwIGV4dGVuc2lvbnM7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uUmVhZGVyKCkgewotCQlzdXBlcihXVFBVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7Ci0JCWlmIChudWxsID09IGlkIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0NMQVNTKTsKLQkJaWYgKG51bGwgPT0gY2xhc3NOYW1lIHx8IGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX0NMQVNTKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYWRkRXh0ZW5zaW9uKGlkLCBlbGVtZW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEV4dGVuc2lvbihTdHJpbmcgaWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChleHRlbnNpb25zLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIEVMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfSUQgKyAiICIgKyBpZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWV4dGVuc2lvbnMucHV0KGlkLCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEV4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJZXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGV4dGVuc2lvbnMuZ2V0KGlkKTsKLQkJaWYgKG51bGwgPT0gZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBFTEVNRU5UICsgIiBub3QgZm91bmQgZm9yICIgKyBBVFRSSUJVVEVfSUQgKyAiOiAiICsgaWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFdpemFyZCBnZXRXaXphcmQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0RXh0ZW5zaW9uKGRhdGFNb2RlbC5nZXRJRCgpKTsKLQotCQl0cnkgewotCQkJd2l6YXJkID0gKERhdGFNb2RlbFdpemFyZCkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJJQlVURV9DTEFTUyk7Ci0JCQl3aXphcmQuc2V0RGF0YU1vZGVsKGRhdGFNb2RlbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiB3aXphcmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFlZTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0V4dGVuc2libGVWaWV3UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZXh0ZW5kZWRWaWV3ZXJNYXAgPSBudWxsOwotCXByaXZhdGUgTWFwIGRlc2NyaXB0b3JNYXAgPSBudWxsOwotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBFbGVtZW50cyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX1ZJRVdFUiA9ICJleHRlbmRlZFZpZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV0VSX0lEID0gInZpZXdlcklEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfVklFV0VSX0lEID0gInBhcmVudFZpZXdlcklEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTID0gImZhY3RvcnlDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fR1JPVVBfSUQgPSAiZnVuY3Rpb25Hcm91cElEIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEV4dGVuc2libGVWaWV3UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKFdUUFVJUGx1Z2luLlBMVUdJTl9JRCwgV1RQVUlQbHVnaW4uRVhURU5ERURfVklFV0VSX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIHZpZXdlcklEKSB7Ci0JCXJldHVybiAoRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldCh2aWV3ZXJJRCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5yZWdpc3RyeS5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRWxlbWVudHMuRVhURU5ERURfVklFV0VSKSkgewotCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlnZXREZXNjcmlwdG9yTWFwKCkucHV0KGRlc2NyaXB0b3IuZ2V0Vmlld2VySUQoKSwgZGVzY3JpcHRvcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbmRlZFZpZXdlck1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEV4dGVuZGVkVmlld2VyTWFwKCkgewotCQlpZiAoZXh0ZW5kZWRWaWV3ZXJNYXAgPT0gbnVsbCkKLQkJCWV4dGVuZGVkVmlld2VyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGV4dGVuZGVkVmlld2VyTWFwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRvck1hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldERlc2NyaXB0b3JNYXAoKSB7Ci0JCWlmIChkZXNjcmlwdG9yTWFwID09IG51bGwpCi0JCQlkZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JNYXA7Ci0JfQotCi0JcHVibGljIGNsYXNzIERlc2NyaXB0b3IgewotCi0JCXByaXZhdGUgU3RyaW5nIHZpZXdlcklEID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50Vmlld2VySUQgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBpY29uID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmdW5jdGlvbkdyb3VwSUQgPSBudWxsOwotCi0JCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nQ2FjaGUgPSBudWxsOwotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotCQkvKioKLQkJICogIAotCQkgKi8KLQkJcHVibGljIERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJCXRoaXMudmlld2VySUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuVklFV0VSX0lEKTsKLQkJCXRoaXMucGFyZW50Vmlld2VySUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuUEFSRU5UX1ZJRVdFUl9JRCk7Ci0JCQl0aGlzLmZhY3RvcnlDbGFzcyA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5GQUNUT1JZX0NMQVNTKTsKLQkJCXRoaXMuaWNvbiA9IHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoRXh0ZW5zaWJsZVZpZXdSZWdpc3RyeS5FbGVtZW50cy5JQ09OKTsKLQkJCXRoaXMubGFiZWwgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuTEFCRUwpOwotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSUQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEV4dGVuc2libGVWaWV3UmVnaXN0cnkuRWxlbWVudHMuRlVOQ1RJT05fR1JPVVBfSUQpOwotCQl9Ci0KLQkJcHVibGljIElFeHRlbnNpYmxlVmlld0ZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlKCkgewotCQkJSUV4dGVuc2libGVWaWV3RmFjdG9yeSBmYWN0b3J5SW5zdGFuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmYWN0b3J5SW5zdGFuY2UgPSAoSUV4dGVuc2libGVWaWV3RmFjdG9yeSkgdGhpcy5lbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJV1RQVUlQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFjdG9yeUluc3RhbmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFjdG9yeUNsYXNzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3MoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeUNsYXNzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVuY3Rpb25Hcm91cElELgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbkdyb3VwSUQoKSB7Ci0JCQlyZXR1cm4gZnVuY3Rpb25Hcm91cElEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWNvbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKLQkJCXJldHVybiBpY29uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFiZWwuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50Vmlld2VySUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudFZpZXdlcklEKCkgewotCQkJcmV0dXJuIHBhcmVudFZpZXdlcklEOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlld2VySUQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFZpZXdlcklEKCkgewotCQkJcmV0dXJuIHZpZXdlcklEOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmICh0b1N0cmluZ0NhY2hlID09IG51bGwpCi0JCQkJdG9TdHJpbmdDYWNoZSA9ICJFeHRlbnNpYmxlVmlld1JlZ2lzdHJ5LkluZm8gW3ZpZXdlcklEPVwiIiArIGdldFZpZXdlcklEKCkgKyAiXCIscGFyZW50Vmlld2VySUQ9XCIiICsgZ2V0UGFyZW50Vmlld2VySUQoKSArICJcIixmYWN0b3J5Q2xhc3M9IiArIGdldEZhY3RvcnlDbGFzcygpICsgIlwiLGZ1bmN0aW9uR3JvdXBJRD1cIiIgKyBnZXRGdW5jdGlvbkdyb3VwSUQoKSArICJcIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCXJldHVybiB0b1N0cmluZ0NhY2hlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JRXh0ZW5zaWJsZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTkzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb24vZXh0ZW5zaW9udWkvSUV4dGVuc2libGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbnNpYmxlVmlld0ZhY3RvcnkgewotCi0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbi9leHRlbnNpb251aS9JT3BlcmF0aW9uTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDdiNWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9uL2V4dGVuc2lvbnVpL0lPcGVyYXRpb25Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA1LCAyMDA0Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uTm9kZSB7Ci0KLQlwdWJsaWMgSU9wZXJhdGlvbk5vZGVbXSBnZXRDaGlsZHJlbigpOwotCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCk7Ci0KLQkvKioKLQkgKiBTYW1lIGFzIGNhbGxpbmcgc2V0Q2hlY2tlZChjaGVja2VkLCB0cnVlKQotCSAqIAotCSAqIEBwYXJhbSBjaGVja2VkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlwdWJsaWMgSU9wZXJhdGlvbk5vZGUgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNFeGVjdXRlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9BYnN0cmFjdFdUUFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Fic3RyYWN0V1RQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDEwLCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLklNc2dMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdUUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiBpbXBsZW1lbnRzIElNc2dMb2dnZXIgewotCXByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0JcHVibGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByb3RlY3RlZCBzdGF0aWMgQWJzdHJhY3RXVFBVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7IAotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RXVFBVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0UGx1Z2luSUQoKSk7Ci0JCQlzZXRSZW5kZXJlcihsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQbHVnaW5JRCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGFMb2dnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZW5kZXJlcihMb2dnZXIgYUxvZ2dlcikgewotCQluZXcgRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXIoYUxvZ2dlcik7Ci0JfQotCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Nsb3NhYmxlV2l6YXJkRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Nsb3NhYmxlV2l6YXJkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTZjOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9DbG9zYWJsZVdpemFyZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDbG9zYWJsZVdpemFyZERpYWxvZyBleHRlbmRzIFdpemFyZERpYWxvZyB7Ci0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIG5ld1dpemFyZAotCSAqLwotCXB1YmxpYyBDbG9zYWJsZVdpemFyZERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVdpemFyZCBuZXdXaXphcmQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIG5ld1dpemFyZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmluaXNoQW5kQ2xvc2UoKSB7Ci0JCXN1cGVyLmZpbmlzaFByZXNzZWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9ETVBhZ2VHcm91cEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0RNUGFnZUdyb3VwRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYWE2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0RNUGFnZUdyb3VwRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VHcm91cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLmV4dGVuc2lvbnVpLkRNV2l6YXJkUGFnZUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBETVBhZ2VHcm91cEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURNUGFnZUdyb3VwIHsKLQlwcml2YXRlIERNV2l6YXJkUGFnZUVsZW1lbnQgcGFnZUVsZW1lbnQ7Ci0KLQlwdWJsaWMgRE1QYWdlR3JvdXBFbGVtZW50SW1wbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlwYWdlRWxlbWVudCA9IG5ldyBETVdpemFyZFBhZ2VFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSB7Ci0JCXJldHVybiBwYWdlRWxlbWVudC5hbGxvd3NFeHRlbmRlZFBhZ2VzQWZ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkRGF0YU9wZXJhdGlvblRvUnVuKCkgewotCQlyZXR1cm4gcGFnZUVsZW1lbnQuZ2V0UmVxdWlyZXNEYXRhT3BlcmF0aW9uSWQoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldERhdGFNb2RlbElEcygpIHsKLQkJcmV0dXJuIHBhZ2VFbGVtZW50LmdldERhdGFNb2RlbElEcygpOwotCX0KLQotCXB1YmxpYyBJRE1QYWdlR3JvdXBIYW5kbGVyIGdldFBhZ2VHcm91cEhhbmRsZXIoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJcmV0dXJuIHBhZ2VFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cEhhbmRsZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYWdlcyhJRGF0YU1vZGVsIGRhdGFNb2RlbCl7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHBhZ2VFbGVtZW50LmNyZWF0ZVBhZ2VHcm91cChkYXRhTW9kZWwpKTsKLQl9Ci0JCi0JcHVibGljIElETVBhZ2VIYW5kbGVyIGdldFBhZ2VIYW5kbGVyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXJldHVybiBwYWdlRWxlbWVudC5jcmVhdGVQYWdlSGFuZGxlcihkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUdyb3VwSUQoKSB7Ci0JCXJldHVybiBwYWdlRWxlbWVudC5nZXRQYWdlSUQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VHcm91cEluc2VydGlvbklEKCkgewotCQlyZXR1cm4gcGFnZUVsZW1lbnQuZ2V0UGFnZUluc2VydGlvbklEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRJRCgpIHsKLQkJcmV0dXJuIHBhZ2VFbGVtZW50LmdldFdpemFyZElEKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0Rpc3BsYXlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2Y1OGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9EaXNwbGF5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMTksIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlVdGlsaXR5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCWVsc2UKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI0NDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBZGRlZCBhIERldGFpbHMgYnV0dG9uIHRvIHRoZSBNZXNzYWdlRGlhbG9nIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZS4KLSAqIAotICogQm9ycm93ZWQgZnJvbSBhbiBlY2xpcHNlIEludGVybmFsRXJyb3JEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIEVycm9yRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0sgPSB7SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMQUJFTFNfT0tfQ0FOQ0VMID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19ERVRBSUxTID0ge0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA9IHtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUx9OwotCXByaXZhdGUgVGhyb3dhYmxlIGRldGFpbDsKLQlwcml2YXRlIGludCBkZXRhaWxCdXR0b25JRCA9IC0xOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JLy9Xb3JrYXJvdW5kLiBTV1QgZG9lcyBub3Qgc2VlbSB0byBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uIGlmCi0JLy90aGVyZSBpcyBub3QgY29udHJvbCB3aXRoIGZvY3VzLiBCdWc6IDE0NjY4Ci0JcHJpdmF0ZSBpbnQgZGVmYXVsdEJ1dHRvbkluZGV4ID0gMDsKLQkvKioKLQkgKiBTaXplIG9mIHRoZSB0ZXh0IGluIGxpbmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX0xJTkVfQ09VTlQgPSAxNTsKLQotCXB1YmxpYyBFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgVGhyb3dhYmxlIGRldGFpbCwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JCWRlZmF1bHRCdXR0b25JbmRleCA9IGRlZmF1bHRJbmRleDsKLQkJdGhpcy5kZXRhaWwgPSBkZXRhaWw7Ci0JCW1lc3NhZ2UgPSBkaWFsb2dNZXNzYWdlOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCX0KLQotCS8vV29ya2Fyb3VuZC4gU1dUIGRvZXMgbm90IHNlZW0gdG8gc2V0IHJpZ3RoIHRoZSBkZWZhdWx0IGJ1dHRvbiBpZgotCS8vdGhlcmUgaXMgbm90IGNvbnRyb2wgd2l0aCBmb2N1cy4gQnVnOiAxNDY2OAotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCUJ1dHRvbiBiID0gZ2V0QnV0dG9uKGRlZmF1bHRCdXR0b25JbmRleCk7Ci0JCWIuc2V0Rm9jdXMoKTsKLQkJYi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24oYik7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZXRhaWwgYnV0dG9uOwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERldGFpbEJ1dHRvbihpbnQgaW5kZXgpIHsKLQkJZGV0YWlsQnV0dG9uSUQgPSBpbmRleDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gZGV0YWlsQnV0dG9uSUQpIHsKLQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRSZXR1cm5Db2RlKGJ1dHRvbklkKTsKLQkJCWNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQuZGlzcG9zZSgpOwotCQkJdGV4dCA9IG51bGw7Ci0JCQlnZXRCdXR0b24oZGV0YWlsQnV0dG9uSUQpLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25UZXh0KChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotCQkJZ2V0QnV0dG9uKGRldGFpbEJ1dHRvbklEKS5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCQlQb2ludCBuZXdTaXplID0gZ2V0Q29udGVudHMoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZXRTaGVsbCgpLnNldFNpemUobmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55ICsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhpcyBkaWFsb2cncyBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBkcm9wLWRvd24gbGlzdCBjb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCS8vIHByaW50IHRoZSBzdGFja3RyYWNlIGluIHRoZSB0ZXh0IGZpZWxkCi0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCVByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOwotCQkJZGV0YWlsLnByaW50U3RhY2tUcmFjZShwcyk7Ci0JCQlpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEVycm9yKSAmJiAoKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUgIT0gbnVsbCkpIHsKLQkJCQlwcy5wcmludGxuKCJcbioqKiBTdGFjayB0cmFjZSBvZiBjb250YWluZWQgZXhjZXB0aW9uICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJKChTV1RFcnJvcikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0gZWxzZSBpZiAoKGRldGFpbCBpbnN0YW5jZW9mIFNXVEV4Y2VwdGlvbikgJiYgKCgoU1dURXhjZXB0aW9uKSBkZXRhaWwpLnRocm93YWJsZSAhPSBudWxsKSkgewotCQkJCXBzLnByaW50bG4oIlxuKioqIFN0YWNrIHRyYWNlIG9mIGNvbnRhaW5lZCBleGNlcHRpb24gKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkoKFNXVEV4Y2VwdGlvbikgZGV0YWlsKS50aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHBzKTsKLQkJCX0KLQkJCXBzLmZsdXNoKCk7Ci0JCQliYW9zLmZsdXNoKCk7Ci0JCQl0ZXh0LnNldFRleHQoYmFvcy50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIFRFWFRfTElORV9DT1VOVDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZGV0YWlsLCBpbnQgZGVmYXVsdEluZGV4LCBib29sZWFuIHNob3dDYW5jZWwpIHsKLQkJU3RyaW5nW10gbGFiZWxzOwotCQlpZiAoZGV0YWlsID09IG51bGwpCi0JCQlsYWJlbHMgPSBzaG93Q2FuY2VsID8gTEFCRUxTX09LX0NBTkNFTCA6IExBQkVMU19PSzsKLQkJZWxzZQotCQkJbGFiZWxzID0gc2hvd0NhbmNlbCA/IExBQkVMU19PS19DQU5DRUxfREVUQUlMUyA6IExBQkVMU19PS19ERVRBSUxTOwotCQlFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgRXJyb3JEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIGRldGFpbCwgRVJST1IsIGxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJaWYgKGRldGFpbCAhPSBudWxsKQotCQkJZGlhbG9nLnNldERldGFpbEJ1dHRvbihsYWJlbHMubGVuZ3RoIC0gMSk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCS8vIGNyZWF0ZSBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCAwKTsKLQkJCWltYWdlLnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCX0KLQkJLy8gY3JlYXRlIG1lc3NhZ2UKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJfQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvRXhlY3V0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNzc4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0V4ZWN1dGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4ZWN1dGlvbkxpc3RlbmVyCi17Ci0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG9FeGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0dlbmVyaWNXaXphcmROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzY5YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9HZW5lcmljV2l6YXJkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1dpemFyZE5vZGUgaW1wbGVtZW50cyBJV2l6YXJkTm9kZSB7Ci0KLQlwcm90ZWN0ZWQgSVdpemFyZCB3aXphcmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgR2VuZXJpY1dpemFyZE5vZGUuCi0JICovCi0JcHVibGljIEdlbmVyaWNXaXphcmROb2RlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAod2l6YXJkICE9IG51bGwpCi0JCQl3aXphcmQuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV2l6YXJkTm9kZSNnZXRDb250ZW50cygpCi0JICovCi0JcHVibGljIFBvaW50IGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSVdpemFyZCBnZXRXaXphcmQoKSB7Ci0JCWlmICh3aXphcmQgPT0gbnVsbCkKLQkJCXdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0byBjcmVhdGUgdGhlIHdpemFyZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpOwotCi0JLyoKLQkgKiBAc2VlIElXaXphcmROb2RlI2lzQ29udGVudENyZWF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGVudENyZWF0ZWQoKSB7Ci0JCXJldHVybiB3aXphcmQgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkTm9kZSNnZXRFeHRlbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRFeHRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmI2ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9JbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfcHJvamVjdENvbnRlbnRzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV91c2VEZWZhdWx0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9sb2NhdGlvbkxhYmVsOwotCi0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDM4YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXVnIDUsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQGF1dGhvciBkZmhvbHQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBsaXN0SXRlbXM7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEVKQlNlbGVjdGl2ZUltcG9ydERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZGlhbG9nQnV0dG9uTGFiZWxzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTGlzdE1lc3NhZ2VEaWFsb2cob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGRpYWxvZ1RpdGxlSW1hZ2UsIFN0cmluZyBkaWFsb2dNZXNzYWdlLCBpbnQgZGlhbG9nSW1hZ2VUeXBlLCBqYXZhLmxhbmcuU3RyaW5nW10gZGlhbG9nQnV0dG9uTGFiZWxzLCBpbnQgZGVmYXVsdEluZGV4KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwgZGlhbG9nSW1hZ2VUeXBlLCBkaWFsb2dCdXR0b25MYWJlbHMsIGRlZmF1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogTGlzdE1lc3NhZ2VEaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIGRlZmF1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIExpc3RNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBkaWFsb2dUaXRsZUltYWdlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ0ltYWdlVHlwZSwgamF2YS5sYW5nLlN0cmluZ1tdIGRpYWxvZ0J1dHRvbkxhYmVscywgaW50IGRlZmF1bHRJbmRleCwgU3RyaW5nW10gbmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKLQkJbGlzdEl0ZW1zID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgYW4gYXJlYSBvZiB0aGUgZGlhbG9nIHdoaWNoIGFwcGVhcnMgYmVsb3cgdGhlIG1lc3NhZ2UgYW5kCi0JICogYWJvdmUgdGhlIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIFN1YmNsYXNzZXMKLQkgKiBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgY3VzdG9tIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBjdXN0b20gYXJlYSBjb250cm9sLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgMCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGxpc3RJdGVtcyAhPSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCQlsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsaXN0LnNldEl0ZW1zKGxpc3RJdGVtcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgY29uZmlybSAoT0svQ2FuY2VsKSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgZGlhbG9nJ3MgdGl0bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgdGhlIE9LIGJ1dHRvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gT0sKLQkJLy8gaXMKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQKLQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiBhIHN0YW5kYXJkIGVycm9yIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBpdGVtcykgewotCQlMaXN0TWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0IHRoZSBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdyBpY29uCi0JCQkJCW1lc3NhZ2UsIEVSUk9SLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8gb2sgaXMgdGhlCi0JCS8vIGRlZmF1bHQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBvcGVuIGEgc3RhbmRhcmQgaW5mb3JtYXRpb24gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIGRpYWxvZydzIHRpdGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmZvcm1hdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgaXRlbXMpOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzaW1wbGUgWWVzL05vIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgT0sgYnV0dG9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTH0sIDAsIGl0ZW1zKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gYSBzdGFuZGFyZCB3YXJuaW5nIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBkaWFsb2cncyB0aXRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuV2FybmluZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCUxpc3RNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0TWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLCBudWxsLCAvLyBhY2NlcHQgdGhlIGRlZmF1bHQKLQkJCQkJLy8gd2luZG93IGljb24KLQkJCQkJbWVzc2FnZSwgV0FSTklORywgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBpdGVtcyk7IC8vIG9rIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzJlYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9MaXN0ZW5lckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3QgewotCXByaXZhdGUgZmluYWwgc3RhdGljIEFjdGlvbkxpc3RlbmVyW10gTlVMTF9BUlJBWSA9IG5ldyBBY3Rpb25MaXN0ZW5lclswXTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IEFjdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJMaXN0ID0gTlVMTF9BUlJBWTsKLQotCS8qKgotCSAqIEFkZCB0aGUgbGlzdGVuZXIgYXMgYSBsaXN0ZW5lciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHQKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciB0byBiZSBhZGRlZAotCSAqIEBwYXJhbSBsCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEFjdGlvbkxpc3RlbmVyIGwpIHsKLQkJaWYgKGwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBOVUxMX0FSUkFZKSB7Ci0JCQkvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBsaXN0ZW5lciBhZGRlZCwKLQkJCS8vIGluaXRpYWxpemUgdGhlIGxpc3RzCi0JCQlsaXN0ZW5lckxpc3QgPSBuZXcgQWN0aW9uTGlzdGVuZXJbXXtsfTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSBjb3B5IHRoZSBhcnJheSBhbmQgYWRkIHRoZSBuZXcgbGlzdGVuZXIKLQkJCWludCBpID0gbGlzdGVuZXJMaXN0Lmxlbmd0aDsKLQkJCUFjdGlvbkxpc3RlbmVyW10gdG1wID0gbmV3IEFjdGlvbkxpc3RlbmVyW2kgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJMaXN0LCAwLCB0bXAsIDAsIGkpOwotCi0JCQl0bXBbaSArIDFdID0gbDsKLQotCQkJbGlzdGVuZXJMaXN0ID0gdG1wOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGlzIGxpc3RlbmVybGlzdAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuZXJDb3VudCgpIHsKLQkJcmV0dXJuIGxpc3RlbmVyTGlzdC5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEFjdGlvbkxpc3RlbmVyW10gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbGlzdGVuZXJMaXN0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAobCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVyTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgewotCQkJaWYgKGxpc3RlbmVyTGlzdFtpXS5lcXVhbHMobCkpIHsKLQkJCQlpbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlBY3Rpb25MaXN0ZW5lcltdIHRtcCA9IG5ldyBBY3Rpb25MaXN0ZW5lcltsaXN0ZW5lckxpc3QubGVuZ3RoIC0gMV07Ci0JCQkvLyBDb3B5IHRoZSBsaXN0IHVwIHRvIGluZGV4Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVyTGlzdCwgMCwgdG1wLCAwLCBpbmRleCk7Ci0JCQkvLyBDb3B5IGZyb20gdHdvIHBhc3QgdGhlIGluZGV4LCB1cCB0bwotCQkJLy8gdGhlIGVuZCBvZiB0bXAgKHdoaWNoIGlzIHR3byBlbGVtZW50cwotCQkJLy8gc2hvcnRlciB0aGFuIHRoZSBvbGQgbGlzdCkKLQkJCWlmIChpbmRleCA8IHRtcC5sZW5ndGgpCi0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lckxpc3QsIGluZGV4ICsgMSwgdG1wLCBpbmRleCwgdG1wLmxlbmd0aCAtIGluZGV4KTsKLQkJCS8vIHNldCB0aGUgbGlzdGVuZXIgYXJyYXkgdG8gdGhlIG5ldyBhcnJheSBvciBudWxsCi0JCQlsaXN0ZW5lckxpc3QgPSAodG1wLmxlbmd0aCA9PSAwKSA/IE5VTExfQVJSQVkgOiB0bXA7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvTmV3UHJvamVjdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjMzZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9OZXdQcm9qZWN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLQotcHVibGljIGNsYXNzIE5ld1Byb2plY3RHcm91cCBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQlwcml2YXRlIElEYXRhTW9kZWwgbW9kZWw7Ci0JcHVibGljIFRleHQgcHJvamVjdE5hbWVGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIFRleHQgbG9jYXRpb25QYXRoRmllbGQgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uID0gbnVsbDsKLQkvLyBjb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7Ci0JLy8gZGVmYXVsdCB2YWx1ZXMKLQlwcml2YXRlIFN0cmluZyBkZWZQcm9qZWN0TmFtZUxhYmVsID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuTmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmQnJvd3NlQnV0dG9uTGFiZWwgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5Ccm93c2VfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZEaXJEaWFsb2dMYWJlbCA9ICJEaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIHN5bmNoSGVscGVyOwotCi0JcHVibGljIE5ld1Byb2plY3RHcm91cChDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJc3luY2hIZWxwZXIgPSBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIobW9kZWwpOwotCQlidWlsZENvbXBvc2l0ZXMocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGNvbnRyb2xzIHdpdGhpbiB0aGlzIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZVByb2plY3ROYW1lR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAocGFyZW50KTsKLQkJcHJvamVjdE5hbWVGaWVsZC5zZXRGb2N1cygpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVQcm9qZWN0TmFtZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJLy8gcHJvamVjdCBzcGVjaWZpY2F0aW9uIGdyb3VwCi0JCUNvbXBvc2l0ZSBwcm9qZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcHJvamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbGFiZWwKLQkJTGFiZWwgcHJvamVjdExhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlwcm9qZWN0TGFiZWwuc2V0Rm9udChmb250KTsKLQkJcHJvamVjdExhYmVsLnNldFRleHQoZGVmUHJvamVjdE5hbWVMYWJlbCk7Ci0KLQkJLy8gbmV3IHByb2plY3QgbmFtZSBlbnRyeSBmaWVsZAotCQlwcm9qZWN0TmFtZUZpZWxkID0gbmV3IFRleHQocHJvamVjdEdyb3VwLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19URVhUX0ZJRUxEX1dJRFRIOwotCQlwcm9qZWN0TmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb2plY3ROYW1lRmllbGQuc2V0Rm9udChmb250KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHByb2plY3ROYW1lRmllbGQsIFBST0pFQ1RfTkFNRSwgbmV3IENvbnRyb2xbXXtwcm9qZWN0TGFiZWx9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm9qZWN0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gY29udHJvbHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCS8vIHByb2plY3Qgc3BlY2lmaWNhdGlvbiBncm91cAotCQlHcm91cCBwcm9qZWN0R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9qZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXByb2plY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvamVjdEdyb3VwLnNldEZvbnQoZm9udCk7Ci0JCXByb2plY3RHcm91cC5zZXRUZXh0KEludGVybmFsQ29tbW9uV29ya2JlbmNoTWVzc2FnZXMuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZV9wcm9qZWN0Q29udGVudHNMYWJlbCk7Ci0KLQkJZmluYWwgQnV0dG9uIHVzZURlZmF1bHRzQnV0dG9uID0gbmV3IEJ1dHRvbihwcm9qZWN0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5SSUdIVCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldFRleHQoSW50ZXJuYWxDb21tb25Xb3JrYmVuY2hNZXNzYWdlcy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlX3VzZURlZmF1bHRMYWJlbCk7Ci0JCXVzZURlZmF1bHRzQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godXNlRGVmYXVsdHNCdXR0b24sIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBudWxsKTsKLQotCQlHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VEZWZhdWx0c0J1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0JCWNyZWF0ZVVzZXJTcGVjaWZpZWRQcm9qZWN0TG9jYXRpb25Hcm91cChwcm9qZWN0R3JvdXApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVVc2VyU3BlY2lmaWVkUHJvamVjdExvY2F0aW9uR3JvdXAoQ29tcG9zaXRlIHByb2plY3RHcm91cCkgewotCQlGb250IGZvbnQgPSBwcm9qZWN0R3JvdXAuZ2V0Rm9udCgpOwotCQkvLyBsb2NhdGlvbiBsYWJlbAotCQlmaW5hbCBMYWJlbCBsb2NhdGlvbkxhYmVsID0gbmV3IExhYmVsKHByb2plY3RHcm91cCwgU1dULk5PTkUpOwotCQlsb2NhdGlvbkxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChJbnRlcm5hbENvbW1vbldvcmtiZW5jaE1lc3NhZ2VzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2VfbG9jYXRpb25MYWJlbCk7Ci0KLQkJLy8gcHJvamVjdCBsb2NhdGlvbiBlbnRyeSBmaWVsZAotCQlsb2NhdGlvblBhdGhGaWVsZCA9IG5ldyBUZXh0KHByb2plY3RHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbG9jYXRpb25QYXRoRmllbGQuc2V0Rm9udChmb250KTsKLQotCQkvLyBicm93c2UgYnV0dG9uCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocHJvamVjdEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRGb250KGZvbnQpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChkZWZCcm93c2VCdXR0b25MYWJlbCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlTG9jYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIElEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IG1vZGVsOwotCi0JCWNsYXNzIExvY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyIHsKLQkJCXByaXZhdGUgYm9vbGVhbiB0eXBpbmcgPSBmYWxzZTsKLQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXR5cGluZyA9IHRydWU7Ci0JCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTiwgbG9jYXRpb25QYXRoRmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXR5cGluZyA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlib29sZWFuIHVzZURlZmF1bHQgPSBsb2NhbE1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTik7Ci0JCQkJaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbG9jYXRpb25MYWJlbC5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0RW5hYmxlZCghdXNlRGVmYXVsdCk7Ci0JCQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKCF1c2VEZWZhdWx0KTsKLQkJCQkJaWYgKHVzZURlZmF1bHQpIHsKLQkJCQkJCWxvY2F0aW9uUGF0aEZpZWxkLnNldFRleHQobG9jYWxNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2NhdGlvblBhdGhGaWVsZC5zZXRUZXh0KGxvY2FsTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCF0eXBpbmcpIHsKLQkJCQkJaWYgKCh1c2VEZWZhdWx0ICYmIERFRkFVTFRfTE9DQVRJT04uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgfHwgKCF1c2VEZWZhdWx0ICYmIFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSkgewotCQkJCQkJbG9jYXRpb25QYXRoRmllbGQuc2V0VGV4dCgoU3RyaW5nKSBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lcigpOwotCi0JCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChuZXcgRGF0YU1vZGVsRXZlbnQobW9kZWwsIFVTRV9ERUZBVUxUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRykpOwotCi0JCWxvY2F0aW9uUGF0aEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbW9kZWwuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYW4gYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGJyb3dzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMb2NhdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGxvY2F0aW9uUGF0aEZpZWxkLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShkZWZEaXJEaWFsb2dMYWJlbCk7Ci0JCVN0cmluZyBkaXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJaWYgKGRpck5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWRpck5hbWUgPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERUZBVUxUX0xPQ0FUSU9OKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCWlmICgoZGlyTmFtZSAhPSBudWxsKSAmJiAoZGlyTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCQlpZiAocGF0aC5leGlzdHMoKSkgewotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpck5hbWUpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShVU0VSX0RFRklORURfTE9DQVRJT04sIHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHN5bmNoSGVscGVyKTsKLQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQltb2RlbCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9PdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3YjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCS8vIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZSA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmQmFzZSA9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2UgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJZlNpemUgPSBzaXplOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0KLQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDApCi0JCQkJZHJhd1RvcFJpZ2h0KGZPdmVybGF5c1swXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkKLQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykKLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9QYWdlR3JvdXBNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkZGU3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1BhZ2VHcm91cE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC5JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLklETVBhZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuQ29tbW9uVUlQbHVnaW5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBQYWdlR3JvdXBNYW5hZ2VyIHsKLQlwcml2YXRlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiByb290T3BlcmF0aW9uOwotCXByaXZhdGUgSURNUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXA7Ci0JcHJpdmF0ZSBIYXNoTWFwIGdyb3VwVGFibGU7Ci0JcHJpdmF0ZSBIYXNoU2V0IG9wZXJhdGlvbnNSdW47Ci0JcHJpdmF0ZSBTdGFjayBwYWdlR3JvdXBTdGFjazsKLQlwcml2YXRlIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCXByaXZhdGUgU3RhY2tFbnRyeSBzYXZlZFRvcEVudHJ5OwotCXByaXZhdGUgaW50IHNhdmVkU3RhY2tTaXplOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50czsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFHRV9HUk9VUCA9ICJ3aXphcmRQYWdlR3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBwYXVzZUFmdGVyRXhlY3V0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBQYWdlR3JvdXBNYW5hZ2VyKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBJRE1QYWdlR3JvdXAgcm9vdFBhZ2VHcm91cCkgewotCi0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQl0aGlzLmdyb3VwVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCQl0aGlzLnBhZ2VHcm91cFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCXRoaXMucm9vdFBhZ2VHcm91cCA9IHJvb3RQYWdlR3JvdXA7Ci0KLQotCQlQYWdlR3JvdXBFbnRyeSByb290UGFnZUdyb3VwRW50cnkgPSBuZXcgUGFnZUdyb3VwRW50cnkocm9vdFBhZ2VHcm91cCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoQ29tbW9uVUlQbHVnaW5Db25zdGFudHMuUExVR0lOX0lELCBFTEVNRU5UX1BBR0VfR1JPVVApOwotCQllbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlncm91cFRhYmxlLnB1dCh0aGlzLnJvb3RQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSwgcm9vdFBhZ2VHcm91cEVudHJ5KTsKLQotCQlpZiAodGhpcy5yb290UGFnZUdyb3VwLmdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSkgewotCQkJLy8gRmluZCBhbGwgdGhlIHBhZ2UgZ3JvdXBzIHRoYXQgZm9sbG93IHRoaXMgcm9vdCBwYWdlIGdyb3VwLgotCQkJbG9hZEV4dGVuZGVkUGFnZXMocm9vdFBhZ2VHcm91cCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUGFnZUdyb3VwTWFuYWdlcihJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbiwgSURNUGFnZUdyb3VwIHJvb3RQYWdlR3JvdXApIHsKLQkJdGhpcyhyb290T3BlcmF0aW9uLmdldERhdGFNb2RlbCgpLCByb290UGFnZUdyb3VwKTsKLQkJdGhpcy5vcGVyYXRpb25zUnVuID0gbmV3IEhhc2hTZXQoKTsKLQotCQlyb290T3BlcmF0aW9uLmFkZE9wZXJhdGlvbkxpc3RlbmVyKG5ldyBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyBpbnQgbm90aWZ5KElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRFeGVjdXRpb25UeXBlKCkpIHsKLQkJCQkJY2FzZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5ST0xMQkFDSyA6Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0T3BlcmF0aW9uVHlwZSgpID09IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQpIHsKLQkJCQkJCQlvcGVyYXRpb25zUnVuLnJlbW92ZShldmVudC5nZXRPcGVyYXRpb24oKS5nZXRJRCgpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUgOgotCQkJCQkJaWYgKGV2ZW50LmdldE9wZXJhdGlvblR5cGUoKSA9PSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVEKSB7Ci0JCQkJCQkJb3BlcmF0aW9uc1J1bi5hZGQoZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKSk7Ci0JCQkJCQkJaWYgKG51bGwgIT0gcGF1c2VBZnRlckV4ZWN1dGlvbiAmJiBldmVudC5nZXRPcGVyYXRpb24oKS5nZXRJRCgpLmVxdWFscyhwYXVzZUFmdGVyRXhlY3V0aW9uKSkgewotCQkJCQkJCQlyZXR1cm4gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybiBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXBBZnRlcihTdHJpbmcgcGFnZUdyb3VwSUQsIElETVBhZ2VHcm91cCBwYWdlSW5zZXJ0R3JvdXApIHsKLQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwRW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIGdyb3VwVGFibGUuZ2V0KHBhZ2VHcm91cElEKTsKLQotCQlpZiAocGFnZUdyb3VwRW50cnkucGFnZUdyb3VwLmdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSkgewotCQkJYWRkUGFnZUdyb3VwKHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cCwgcGFnZUluc2VydEdyb3VwKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVGb3J3YXJkT25lUGFnZSgpIHsKLQkJYm9vbGVhbiBwYWdlRm91bmQgPSBmYWxzZTsKLQotCQlpZiAocGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJUGFnZUdyb3VwRW50cnkgcm9vdEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChyb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCQkJcGFnZUdyb3VwU3RhY2sucHVzaChuZXcgU3RhY2tFbnRyeShyb290RW50cnksIC0xKSk7Ci0JCX0KLQotCQlzYXZlU3RhY2tJbmZvKCk7Ci0KLQkJdHJ5IHsKLQkJCXBhZ2VGb3VuZCA9IGZpbmROZXh0UGFnZSh0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Yyk7Ci0JCQlpZiAocm9vdE9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcm9vdE9wZXJhdGlvbi5yb2xsQmFjayhudWxsLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQkJcGFnZUZvdW5kID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAocGFnZUZvdW5kID09IGZhbHNlKSB7Ci0JCQkvLyBJZiB3ZSBtb3ZlZCBmb3J3YXJkIGFuZCB0aGVyZSB3YXNuJ3QgYSBwYWdlIHRoZW4gd2Ugd2lsbCByZXN0b3JlIHRoZSBzdGFjay4KLQkJCS8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkbid0IGhhcHBlbiBzaW5jZSBhIGNhbGwgdG8gaGFzTmV4dFBhZ2Ugd291bGQgaGF2ZSBpbmRpY2F0ZWQKLQkJCS8vIHRoYXQgdGhlcmUgd2Fzbid0IGEgcGFnZS4KLQkJCXJlc3RvcmVTdGFja0luZm8oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVCYWNrT25lUGFnZSgpIHsKLQkJaWYgKHBhZ2VHcm91cFN0YWNrLmVtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RhY2tFbnRyeSB0b3BFbnRyeSA9IChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCk7Ci0KLQkJLy8gUG9wIHRoZSBsYXN0IHBhZ2UuCi0JCWlmICghdG9wRW50cnkucGFnZXNSZXR1cm5lZC5lbXB0eSgpKQotCQkJdG9wRW50cnkucGFnZXNSZXR1cm5lZC5wb3AoKTsKLQotCQkvLyBOb3cgZmluZCB0aGUgcHJldmlvdXMgcGFnZS4KLQkJYm9vbGVhbiBmb3VuZFByZXZpb3VzUGFnZSA9IGZpbmRQcmV2aW91c1BhZ2VJbkdyb3VwKCk7Ci0KLQkJd2hpbGUgKCFmb3VuZFByZXZpb3VzUGFnZSAmJiAhcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJaWYgKHJvb3RPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCWlmICh0b3BFbnRyeS5yYW5PcGVyYXRpb25zKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyb290T3BlcmF0aW9uLnJvbGxCYWNrKG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwYWdlR3JvdXBTdGFjay5wb3AoKTsKLQotCQkJaWYgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQkJZm91bmRQcmV2aW91c1BhZ2UgPSBmaW5kUHJldmlvdXNQYWdlSW5Hcm91cCgpOwotCQkJCXRvcEVudHJ5ID0gKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlwYWdlR3JvdXBTdGFjay5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsKLQkJSVdpemFyZFBhZ2UgcGFnZSA9IG51bGw7Ci0KLQkJaWYgKCFwYWdlR3JvdXBTdGFjay5lbXB0eSgpKSB7Ci0JCQlTdGFja0VudHJ5IHRvcEVudHJ5ID0gKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKTsKLQkJCWludCBwYWdlSW5kZXggPSB0b3BFbnRyeS5nZXRUb3BQYWdlSW5kZXgoKTsKLQotCQkJcGFnZSA9IHBhZ2VJbmRleCA9PSAtMSA/IG51bGwgOiAoSVdpemFyZFBhZ2UpIHRvcEVudHJ5LnBhZ2VHcm91cEVudHJ5LmdldFBhZ2VzKCkuZ2V0KHBhZ2VJbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gaGFzTXVsaXRwbGVQYWdlczsKLQotCXB1YmxpYyBib29sZWFuIGhhc011bHRpcGxlUGFnZXMoKSB7Ci0JCWlmIChudWxsID09IGhhc011bGl0cGxlUGFnZXMpIHsKLQkJCWludCBwYWdlQ291bnQgPSAwOwotCQkJUGFnZUdyb3VwRW50cnkgcm9vdEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChyb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCQkJcGFnZUNvdW50ICs9IHJvb3RFbnRyeS5nZXRQYWdlcygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBwYWdlQ291bnQgPCAyICYmIGkgPCByb290RW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5zaXplKCk7IGkrKykgewotCQkJCXBhZ2VDb3VudCArPSAoKFBhZ2VHcm91cEVudHJ5KSByb290RW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5nZXQoaSkpLmdldFBhZ2VzKCkuc2l6ZSgpOwotCQkJfQotCQkJaGFzTXVsaXRwbGVQYWdlcyA9IHBhZ2VDb3VudCA+IDEgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBoYXNNdWxpdHBsZVBhZ2VzLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHRQYWdlKCkgewotCQlib29sZWFuIHBhZ2VGb3VuZCA9IGZhbHNlOwotCi0JCXNhdmVTdGFja0luZm8oKTsKLQotCQlpZiAocGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJUGFnZUdyb3VwRW50cnkgcm9vdEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChyb290UGFnZUdyb3VwLmdldFBhZ2VHcm91cElEKCkpOwotCQkJcGFnZUdyb3VwU3RhY2sucHVzaChuZXcgU3RhY2tFbnRyeShyb290RW50cnksIC0xKSk7Ci0JCX0KLQotCQlwYWdlRm91bmQgPSBmaW5kTmV4dFBhZ2UoZmFsc2UpOwotCQlyZXN0b3JlU3RhY2tJbmZvKCk7Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvQWxsQ3VycmVudE9wZXJhdGlvbnMoKSB7Ci0JCXdoaWxlICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJbW92ZUJhY2tPbmVQYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZFByZXZpb3VzUGFnZUluR3JvdXAoKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgcGFnZUdyb3VwU3RhY2sucGVlaygpOwotCQlib29sZWFuIHBhZ2VGb3VuZCA9IGZhbHNlOwotCi0JCWlmICghdG9wRW50cnkucGFnZXNSZXR1cm5lZC5lbXB0eSgpKSB7Ci0JCQl0b3BFbnRyeS5wYWdlc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQlwYWdlRm91bmQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHBhZ2VGb3VuZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZmluZE5leHRQYWdlKGJvb2xlYW4gcnVuT3BlcmF0aW9ucykgewotCQlTdGFja0VudHJ5IHRvcEVudHJ5ID0gKFN0YWNrRW50cnkpIHBhZ2VHcm91cFN0YWNrLnBlZWsoKTsKLQkJaW50IG5ld1BhZ2VJbmRleCA9IHRvcEVudHJ5LmZpbmROZXh0UGFnZUluZGV4KCk7Ci0JCWJvb2xlYW4gcGFnZUZvdW5kID0gZmFsc2U7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSAtMSkgewotCQkJLy8gT3VyIHBhZ2UgaGFuZGxlciBkaWRuJ3QgZmluZCBhIHBhZ2Ugc28gd2Ugd2lsbCBzZWUgaWYgdGhlcmUgaXMgYSBwYWdlIGdyb3VwIHRoYXQKLQkJCS8vIGZvbGxvd3MgdGhpcyBwYWdlIGdyb3VwIHRoYXQgY2FuIGZpbmQgYSBwYWdlLgotCQkJdG9wRW50cnkucGFnZXNDb21wbGV0ZSA9IHRydWU7Ci0KLQkJCVN0YWNrRW50cnkgbmV4dFN0YWNrRW50cnkgPSBmaW5kTmV4dFBhZ2VHcm91cChwYWdlR3JvdXBTdGFjayk7Ci0KLQkJCWlmIChuZXh0U3RhY2tFbnRyeSAhPSBudWxsKSB7Ci0JCQkJSURNUGFnZUdyb3VwIHBhZ2VHcm91cCA9IG5leHRTdGFja0VudHJ5LnBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cDsKLQkJCQlTdHJpbmcgcmVxdWlyZXNPcGVyYXRpb25zSWQgPSBwYWdlR3JvdXAuZ2V0UmVxdWlyZWREYXRhT3BlcmF0aW9uVG9SdW4oKTsKLQotCQkJCS8vIElmIHRoaXMgZ3JvdXAgcmVxdWlyZXMgYW4gb3BlcmF0aW9uIGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBydW4KLQkJCQkvLyB0aGVuIHdlIG5lZWQgdG8gcnVuIGl0LgotCQkJCWlmIChyb290T3BlcmF0aW9uICE9IG51bGwgJiYgcnVuT3BlcmF0aW9ucyAmJiByZXF1aXJlc09wZXJhdGlvbnNJZCAhPSBudWxsICYmICFvcGVyYXRpb25zUnVuLmNvbnRhaW5zKHJlcXVpcmVzT3BlcmF0aW9uc0lkKSkgewotCQkJCQlwYXVzZUFmdGVyRXhlY3V0aW9uID0gcmVxdWlyZXNPcGVyYXRpb25zSWQ7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0YXR1cyA9IHJvb3RPcGVyYXRpb24ucmVzdW1lKG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCW5leHRTdGFja0VudHJ5LnJhbk9wZXJhdGlvbnMgPSB0cnVlOwotCi0JCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCQkvLyBUT0RPIG5lZWQgYSBiZXR0ZXIgZXJyb3IgZmVlZGJhY2sgbWVjaGFuaXNtIGhlcmUuCi0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcGFnZUdyb3VwU3RhY2sucHVzaChuZXh0U3RhY2tFbnRyeSk7Ci0JCQkJcGFnZUZvdW5kID0gZmluZE5leHRQYWdlKHJ1bk9wZXJhdGlvbnMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gV2UgZm91bmQgYSBuZXcgcGFnZSBpbiB0aGUgcGFnZSBoYW5kbGVyLgotCQkJcGFnZUZvdW5kID0gdHJ1ZTsKLQkJCXRvcEVudHJ5LnBhZ2VzUmV0dXJuZWQucHVzaChuZXcgSW50ZWdlcihuZXdQYWdlSW5kZXgpKTsKLQkJfQotCi0JCXJldHVybiBwYWdlRm91bmQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVTdGFja0luZm8oKSB7Ci0JCWlmICghcGFnZUdyb3VwU3RhY2suZW1wdHkoKSkgewotCQkJc2F2ZWRUb3BFbnRyeSA9IG5ldyBTdGFja0VudHJ5KChTdGFja0VudHJ5KSBwYWdlR3JvdXBTdGFjay5wZWVrKCkpOwotCQl9Ci0JCXNhdmVkU3RhY2tTaXplID0gcGFnZUdyb3VwU3RhY2suc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlU3RhY2tJbmZvKCkgewotCQlpZiAoc2F2ZWRTdGFja1NpemUgPT0gMCkgewotCQkJcGFnZUdyb3VwU3RhY2sucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJfSBlbHNlIHsKLQkJCXBhZ2VHcm91cFN0YWNrLnNldFNpemUoc2F2ZWRTdGFja1NpemUgLSAxKTsKLQkJCXBhZ2VHcm91cFN0YWNrLnB1c2goc2F2ZWRUb3BFbnRyeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4dGVuZGVkUGFnZXMoSURNUGFnZUdyb3VwIHBhZ2VHcm91cCkgewotCQlTdHJpbmcgd2l6YXJkSWQgPSByb290UGFnZUdyb3VwLmdldFdpemFyZElEKCk7Ci0JCVN0cmluZyBwYWdlR3JvdXBJZCA9IHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQlpbnQgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKLQkJCURNUGFnZUdyb3VwRWxlbWVudEltcGwgcGFnZUluc2VydEdyb3VwID0gbmV3IERNUGFnZUdyb3VwRWxlbWVudEltcGwoZWxlbWVudHNbaW5kZXhdKTsKLQkJCVN0cmluZyBwYWdlSW5zZXJ0R3JvdXBJZCA9IHBhZ2VJbnNlcnRHcm91cC5nZXRQYWdlR3JvdXBJbnNlcnRpb25JRCgpOwotCQkJaWYgKHBhZ2VJbnNlcnRHcm91cC5nZXRXaXphcmRJRCgpLmVxdWFscyh3aXphcmRJZCkgJiYgKG51bGwgPT0gcGFnZUluc2VydEdyb3VwSWQgfHwgcGFnZUluc2VydEdyb3VwSWQuZXF1YWxzKHBhZ2VHcm91cElkKSkpIHsKLQkJCQlhZGRQYWdlR3JvdXAocGFnZUdyb3VwLCBwYWdlSW5zZXJ0R3JvdXApOwotCi0JCQkJLy8gSWYgdGhpcyBwYWdlIGdyb3VwIGhhcyBwYWdlIHRoZW4gYWRkIHRoZW0KLQkJCQlpZiAocGFnZUluc2VydEdyb3VwLmdldEFsbG93c0V4dGVuZGVkUGFnZXMoKSkgewotCQkJCQlsb2FkRXh0ZW5kZWRQYWdlcyhwYWdlSW5zZXJ0R3JvdXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQYWdlR3JvdXAoSURNUGFnZUdyb3VwIHBhZ2VHcm91cCwgSURNUGFnZUdyb3VwIGluc2VydGVkUGFnZUdyb3VwKSB7Ci0JCVBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChwYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSk7Ci0JCVBhZ2VHcm91cEVudHJ5IG5leHRHcm91cEVudHJ5ID0gKFBhZ2VHcm91cEVudHJ5KSBncm91cFRhYmxlLmdldChpbnNlcnRlZFBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpKTsKLQotCQlpZiAocGFnZUdyb3VwRW50cnkgPT0gbnVsbCkgewotCQkJcGFnZUdyb3VwRW50cnkgPSBuZXcgUGFnZUdyb3VwRW50cnkocGFnZUdyb3VwKTsKLQkJCWdyb3VwVGFibGUucHV0KHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpLCBwYWdlR3JvdXBFbnRyeSk7Ci0JCX0KLQotCQlpZiAobmV4dEdyb3VwRW50cnkgPT0gbnVsbCkgewotCQkJbmV4dEdyb3VwRW50cnkgPSBuZXcgUGFnZUdyb3VwRW50cnkoaW5zZXJ0ZWRQYWdlR3JvdXApOwotCQkJZ3JvdXBUYWJsZS5wdXQoaW5zZXJ0ZWRQYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKSwgbmV4dEdyb3VwRW50cnkpOwotCQl9Ci0KLQkJcGFnZUdyb3VwRW50cnkuZ3JvdXBzVGhhdEZvbGxvdy5hZGQobmV4dEdyb3VwRW50cnkpOwotCX0KLQotCXB1YmxpYyBTdGFja0VudHJ5IGZpbmROZXh0UGFnZUdyb3VwKFN0YWNrIHN0YWNrKSB7Ci0JCVN0YWNrRW50cnkgdG9wRW50cnkgPSAoU3RhY2tFbnRyeSkgc3RhY2sucGVlaygpOwotCQlQYWdlR3JvdXBFbnRyeSBuZXh0UGFnZUdyb3VwID0gdG9wRW50cnkuZ2V0TmV4dFBhZ2VHcm91cChudWxsKTsKLQkJaW50IHBhcmVudEluZGV4ID0gdG9wRW50cnkucGFyZW50R3JvdXBJbmRleDsKLQkJaW50IHByZXZQYXJlbnRJbmRleCA9IHN0YWNrLnNpemUoKSAtIDE7Ci0KLQkJLy8gUmVjdXJzZSB1cCB0aHJvdWdoIHRoZSBwYXJlbnRzIHRvIGZpbmQgdGhlIG5leHQgZ3JvdXAgaWYgbmVlZGVkLgotCQl3aGlsZSAocGFyZW50SW5kZXggIT0gLTEgJiYgbmV4dFBhZ2VHcm91cCA9PSBudWxsKSB7Ci0JCQlTdGFja0VudHJ5IHBhcmVudFN0YWNrRW50cnkgPSAoU3RhY2tFbnRyeSkgc3RhY2suZWxlbWVudEF0KHBhcmVudEluZGV4KTsKLQotCQkJbmV4dFBhZ2VHcm91cCA9IHBhcmVudFN0YWNrRW50cnkuZ2V0TmV4dFBhZ2VHcm91cCh0b3BFbnRyeS5nZXRJZCgpKTsKLQkJCXByZXZQYXJlbnRJbmRleCA9IHBhcmVudEluZGV4OwotCQkJcGFyZW50SW5kZXggPSBwYXJlbnRTdGFja0VudHJ5LnBhcmVudEdyb3VwSW5kZXg7Ci0JCQl0b3BFbnRyeSA9IHBhcmVudFN0YWNrRW50cnk7Ci0JCX0KLQotCQlyZXR1cm4gbmV4dFBhZ2VHcm91cCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdGFja0VudHJ5KG5leHRQYWdlR3JvdXAsIHByZXZQYXJlbnRJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTdGFja0VudHJ5IHsKLQkJcHVibGljIFBhZ2VHcm91cEVudHJ5IHBhZ2VHcm91cEVudHJ5OwotCQlwdWJsaWMgU3RhY2sgcGFnZXNSZXR1cm5lZDsgLy8gRWxlbWVudCA9IEludGVyZ2VyIG9mIHBhZ2UgaW5kZXhlcy4KLQkJcHVibGljIGJvb2xlYW4gcGFnZXNDb21wbGV0ZTsKLQkJcHVibGljIGludCBwYXJlbnRHcm91cEluZGV4OwotCQlwdWJsaWMgYm9vbGVhbiByYW5PcGVyYXRpb25zOwotCi0JCXB1YmxpYyBTdGFja0VudHJ5KFBhZ2VHcm91cEVudHJ5IG5ld1BhZ2VHcm91cEVudHJ5LCBpbnQgcGFyZW50SW5kZXgpIHsKLQkJCXBhZ2VHcm91cEVudHJ5ID0gbmV3UGFnZUdyb3VwRW50cnk7Ci0JCQlwYWdlc1JldHVybmVkID0gbmV3IFN0YWNrKCk7Ci0JCQlwYWdlc0NvbXBsZXRlID0gZmFsc2U7Ci0JCQlwYXJlbnRHcm91cEluZGV4ID0gcGFyZW50SW5kZXg7Ci0JCQlyYW5PcGVyYXRpb25zID0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RhY2tFbnRyeShTdGFja0VudHJ5IHN0YWNrRW50cnkpIHsKLQkJCXBhZ2VHcm91cEVudHJ5ID0gc3RhY2tFbnRyeS5wYWdlR3JvdXBFbnRyeTsKLQkJCXBhZ2VzUmV0dXJuZWQgPSBuZXcgU3RhY2soKTsKLQkJCXBhZ2VzQ29tcGxldGUgPSBzdGFja0VudHJ5LnBhZ2VzQ29tcGxldGU7Ci0JCQlwYXJlbnRHcm91cEluZGV4ID0gc3RhY2tFbnRyeS5wYXJlbnRHcm91cEluZGV4OwotCQkJcmFuT3BlcmF0aW9ucyA9IHN0YWNrRW50cnkucmFuT3BlcmF0aW9uczsKLQkJCXBhZ2VzUmV0dXJuZWQuYWRkQWxsKHN0YWNrRW50cnkucGFnZXNSZXR1cm5lZCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIHBhZ2VHcm91cEVudHJ5LnBhZ2VHcm91cC5nZXRQYWdlR3JvdXBJRCgpOwotCQl9Ci0KLQkJcHVibGljIGludCBmaW5kTmV4dFBhZ2VJbmRleCgpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQotCQkJaWYgKCFwYWdlc0NvbXBsZXRlKSB7Ci0JCQkJTGlzdCBwYWdlcyA9IHBhZ2VHcm91cEVudHJ5LmdldFBhZ2VzKCk7Ci0KLQkJCQlpbnQgcGFnZUluZGV4ID0gZ2V0VG9wUGFnZUluZGV4KCk7Ci0JCQkJU3RyaW5nIHBhZ2VJZCA9IHBhZ2VJbmRleCA9PSAtMSA/IG51bGwgOiAoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQocGFnZUluZGV4KSkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBleHBlY3RlZElkID0gcGFnZUluZGV4ICsgMSA+PSBwYWdlcy5zaXplKCkgPyBudWxsIDogKChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KHBhZ2VJbmRleCArIDEpKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIG5ld1BhZ2VJZCA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQluZXdQYWdlSWQgPSBwYWdlR3JvdXBFbnRyeS5nZXRQYWdlSGFuZGxlcigpLmdldE5leHRQYWdlKHBhZ2VJZCwgZXhwZWN0ZWRJZCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjKTsKLQkJCQl9Ci0KLQkJCQlpZiAobmV3UGFnZUlkICE9IG51bGwgJiYgbmV3UGFnZUlkLmVxdWFscyhJRE1QYWdlSGFuZGxlci5TS0lQX1BBR0UpICYmIHBhZ2VJbmRleCA+PSAwICYmIHBhZ2VJbmRleCA8IHBhZ2VzLnNpemUoKSAtIDIpIHsKLQkJCQkJcmVzdWx0ID0gcGFnZUluZGV4ICsgMjsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBwYWdlR3JvdXBFbnRyeS5jaGVja0ZvclNwZWNpYWxJZHMobmV3UGFnZUlkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkgZ2V0TmV4dFBhZ2VHcm91cChTdHJpbmcgYWZ0ZXJJZCkgewotCQkJUGFnZUdyb3VwRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJCVN0cmluZyBuZXh0R3JvdXBJRCA9IG51bGw7Ci0JCQlTdHJpbmdbXSBncm91cElETGlzdCA9IGdldEdyb3VwSURMaXN0KCk7Ci0KLQkJCXRyeSB7Ci0JCQkJbmV4dEdyb3VwSUQgPSBwYWdlR3JvdXBFbnRyeS5nZXRQYWdlR3JvdXBIYW5kbGVyKCkuZ2V0TmV4dFBhZ2VHcm91cChhZnRlcklkLCBncm91cElETGlzdCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Yyk7Ci0JCQl9Ci0KLQkJCWlmIChuZXh0R3JvdXBJRCAhPSBudWxsKSB7Ci0JCQkJLy8gRmluZCB0aGlzIHN0cmluZyBpbiB0aGUgbGlzdC4KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZ3JvdXBJRExpc3QubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCWlmIChncm91cElETGlzdFtpbmRleF0uZXF1YWxzKG5leHRHcm91cElEKSkgewotCQkJCQkJcmVzdWx0ID0gKFBhZ2VHcm91cEVudHJ5KSBwYWdlR3JvdXBFbnRyeS5ncm91cHNUaGF0Rm9sbG93LmVsZW1lbnRBdChpbmRleCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gZ2V0R3JvdXBJRExpc3QoKSB7Ci0JCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW3BhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpXTsKLQotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQkJUGFnZUdyb3VwRW50cnkgZW50cnkgPSAoUGFnZUdyb3VwRW50cnkpIHBhZ2VHcm91cEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3cuZWxlbWVudEF0KGluZGV4KTsKLQotCQkJCXJlc3VsdFtpbmRleF0gPSBlbnRyeS5wYWdlR3JvdXAuZ2V0UGFnZUdyb3VwSUQoKTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFRvcFBhZ2VJbmRleCgpIHsKLQkJCXJldHVybiBwYWdlc1JldHVybmVkLmVtcHR5KCkgPyAtMSA6ICgoSW50ZWdlcikgcGFnZXNSZXR1cm5lZC5wZWVrKCkpLmludFZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFBhZ2VHcm91cEVudHJ5IHsKLQkJcHVibGljIElETVBhZ2VHcm91cCBwYWdlR3JvdXA7Ci0JCXB1YmxpYyBWZWN0b3IgZ3JvdXBzVGhhdEZvbGxvdzsKLQkJcHJpdmF0ZSBJRE1QYWdlSGFuZGxlciBwYWdlSGFuZGxlcjsKLQkJcHJpdmF0ZSBJRE1QYWdlR3JvdXBIYW5kbGVyIHBhZ2VHcm91cEhhbmRsZXI7Ci0JCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQotCQlwdWJsaWMgUGFnZUdyb3VwRW50cnkoSURNUGFnZUdyb3VwIG5ld1BhZ2VHcm91cCkgewotCQkJcGFnZUdyb3VwID0gbmV3UGFnZUdyb3VwOwotCQkJZ3JvdXBzVGhhdEZvbGxvdyA9IG5ldyBWZWN0b3IoKTsKLQkJCWluaXRpYWxpemVkID0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgSURNUGFnZUhhbmRsZXIgZ2V0UGFnZUhhbmRsZXIoKSB7Ci0JCQlpZiAoIWluaXRpYWxpemVkKQotCQkJCWluaXQoKTsKLQotCQkJcmV0dXJuIHBhZ2VIYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIElETVBhZ2VHcm91cEhhbmRsZXIgZ2V0UGFnZUdyb3VwSGFuZGxlcigpIHsKLQkJCWlmICghaW5pdGlhbGl6ZWQpCi0JCQkJaW5pdCgpOwotCi0JCQlyZXR1cm4gcGFnZUdyb3VwSGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldFBhZ2VzKCkgewotCQkJaWYgKCFpbml0aWFsaXplZCkKLQkJCQlpbml0KCk7Ci0KLQkJCXJldHVybiBwYWdlR3JvdXAuZ2V0UGFnZXMoZGF0YU1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBQYWdlR3JvdXBFbnRyeShQYWdlR3JvdXBFbnRyeSBvcmlnaW5hbEVudHJ5KSB7Ci0JCQlwYWdlR3JvdXAgPSBvcmlnaW5hbEVudHJ5LnBhZ2VHcm91cDsKLQkJCWdyb3Vwc1RoYXRGb2xsb3cgPSBvcmlnaW5hbEVudHJ5Lmdyb3Vwc1RoYXRGb2xsb3c7Ci0JCQlwYWdlSGFuZGxlciA9IG9yaWdpbmFsRW50cnkucGFnZUhhbmRsZXI7Ci0JCQlwYWdlR3JvdXBIYW5kbGVyID0gb3JpZ2luYWxFbnRyeS5wYWdlR3JvdXBIYW5kbGVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCQl0cnkgewotCQkJCXBhZ2VIYW5kbGVyID0gcGFnZUdyb3VwLmdldFBhZ2VIYW5kbGVyKGRhdGFNb2RlbCk7Ci0JCQkJcGFnZUdyb3VwSGFuZGxlciA9IHBhZ2VHcm91cC5nZXRQYWdlR3JvdXBIYW5kbGVyKGRhdGFNb2RlbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4Yyk7Ci0JCQl9Ci0KLQkJCWlmIChwYWdlSGFuZGxlciA9PSBudWxsKQotCQkJCXBhZ2VIYW5kbGVyID0gbmV3IFNpbXBsZVBhZ2VIYW5kbGVyKCk7Ci0KLQkJCWlmIChwYWdlR3JvdXBIYW5kbGVyID09IG51bGwpCi0JCQkJcGFnZUdyb3VwSGFuZGxlciA9IG5ldyBTaW1wbGVQYWdlR3JvdXBIYW5kbGVyKCk7Ci0KLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgaW50IGNoZWNrRm9yU3BlY2lhbElkcyhTdHJpbmcgcGFnZUlkKSB7Ci0JCQlpbnQgcmVzdWx0ID0gLTE7Ci0KLQkJCUxpc3QgcGFnZXMgPSBnZXRQYWdlcygpOwotCi0JCQlpZiAocGFnZXMuaXNFbXB0eSgpIHx8IHBhZ2VJZCA9PSBudWxsKQotCQkJCXJldHVybiAtMTsKLQotCQkJaWYgKHBhZ2VJZC5zdGFydHNXaXRoKElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIpKSB7Ci0JCQkJU3RyaW5nIGFmdGVySUQgPSBwYWdlSWQuc3Vic3RyaW5nKElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIubGVuZ3RoKCksIHBhZ2VJZC5sZW5ndGgoKSk7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihhZnRlcklEKTsKLQkJCQlyZXN1bHQgPSByZXN1bHQgPj0gMCAmJiByZXN1bHQgPCBwYWdlcy5zaXplKCkgLSAxID8gcmVzdWx0ICsgMSA6IC0xOwotCQkJfSBlbHNlIGlmIChwYWdlSWQuc3RhcnRzV2l0aChJRE1QYWdlSGFuZGxlci5QQUdFX0JFRk9SRSkpIHsKLQkJCQlTdHJpbmcgYmVmb3JlSUQgPSBwYWdlSWQuc3Vic3RyaW5nKElETVBhZ2VIYW5kbGVyLlBBR0VfQkVGT1JFLmxlbmd0aCgpLCBwYWdlSWQubGVuZ3RoKCkpOwotCQkJCXJlc3VsdCA9IGdldEluZGV4T2YoYmVmb3JlSUQpOwotCQkJCXJlc3VsdCA9IHJlc3VsdCA+PSAxICYmIHJlc3VsdCA8IHBhZ2VzLnNpemUoKSA/IHJlc3VsdCAtIDEgOiAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0SW5kZXhPZihwYWdlSWQpOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0SW5kZXhPZihTdHJpbmcgcGFnZUlkKSB7Ci0JCQlpbnQgcmVzdWx0ID0gLTE7Ci0KLQkJCUxpc3QgcGFnZXMgPSBnZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhZ2VzLnNpemUoKTsgaW5kZXgrKykgewotCQkJCWlmICgoKElXaXphcmRQYWdlKSBwYWdlcy5nZXQoaW5kZXgpKS5nZXROYW1lKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJcmVzdWx0ID0gaW5kZXg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCQlyZXR1cm4gaW5pdGlhbGl6ZWQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncyhEYXRhTW9kZWxXaXphcmQgd2l6YXJkKSB7Ci0JCUl0ZXJhdG9yIHBhZ2VHcm91cHMgPSBncm91cFRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChwYWdlR3JvdXBzLmhhc05leHQoKSkgewotCQkJUGFnZUdyb3VwRW50cnkgcGFnZUdyb3VwID0gKFBhZ2VHcm91cEVudHJ5KSBwYWdlR3JvdXBzLm5leHQoKTsKLQkJCWlmIChwYWdlR3JvdXAuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJSXRlcmF0b3IgcGFnZXMgPSBwYWdlR3JvdXAuZ2V0UGFnZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwYWdlcy5oYXNOZXh0KCkpIHsKLQkJCQkJSVdpemFyZFBhZ2UgcGFnZSA9IChJV2l6YXJkUGFnZSkgcGFnZXMubmV4dCgpOwotCQkJCQl3aXphcmQuc3RvcmVEZWZhdWx0U2V0dGluZ3MocGFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvUnVubmFibGVPcGVyYXRpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMjYwMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi1wdWJsaWMgY2xhc3MgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgSVVuZG9hYmxlT3BlcmF0aW9uIHVuZG9hYmxlT3BlcmF0aW9uOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0KLQlwdWJsaWMgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyKElVbmRvYWJsZU9wZXJhdGlvbiB1bmRvYWJsZU9wZXJhdGlvbikgewotCQl0aGlzLnVuZG9hYmxlT3BlcmF0aW9uID0gdW5kb2FibGVPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXN0YXR1cyA9IHVuZG9hYmxlT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKXsKLQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmMzkwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBUaGlzIGlzIGEgd3JhcHBlciBmb3Igb3VyIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIHRvIHRoZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgY2xhc3MKLSAqIG5lZWRzIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBvcGVyYXRpb24gZnJvbSBhIElSdW5uYWJsZUNvbnRleHQuCi0gKiAKLSAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dAotICogQHNlZSBKYXZhVUlQbHVnaW4jZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MgQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjg6NDUgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkvLyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBoZWFkbGVzc1J1bm5hYmxlOwotCi0JLyoqCi0JICogUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgewotCQlzZXRIZWFkbGVzc1J1bm5hYmxlKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzgvMjAwMSAxOjI5OjUyIFBNKQotCSAqIAotCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuajJlZS5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGdldEhlYWRsZXNzUnVubmFibGUoKSB7Ci0JCXJldHVybiBoZWFkbGVzc1J1bm5hYmxlOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24uIFByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4gVGhpcyBtZXRob2QKLQkgKiBpcyB1c3VhbGx5IGludm9rZWQgYnkgYW4gPGNvZGU+SVJ1bm5hYmxlQ29udGV4dDwvY29kZT4nczxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLCB3aGljaAotCSAqIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBBIHJlcXVlc3QgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGhvbm9yZWQgYW5kCi0JICogYWNrbm93bGVkZ2VkIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUgcmVxdWVzdHMgZm9yCi0JICogICAgICAgICAgICBjYW5jZWxhdGlvbgotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sIGl0IHNob3VsZCB3cmFwIGl0IGluc2lkZQotCSAqICAgICAgICAgICAgICAgIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlCi0JICogICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZQotCSAqICAgICAgICAgICAgICAgIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICogCi0JICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZ2V0SGVhZGxlc3NSdW5uYWJsZSgpLnJ1bihtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzgvMjAwMSAxOjI5OjUyIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdIZWFkbGVzc1J1bm5hYmxlCi0JICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRIZWFkbGVzc1J1bm5hYmxlKG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG5ld0hlYWRsZXNzUnVubmFibGUpIHsKLQkJaGVhZGxlc3NSdW5uYWJsZSA9IG5ld0hlYWRsZXNzUnVubmFibGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TYXZlSGFuZGxlclVJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNjIxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NhdmVIYW5kbGVyVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFNhdmVIYW5kbGVyVUkgaW1wbGVtZW50cyBJU2F2ZUhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRkFJTEVEID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIxNiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5OSU5HX01FU1NBR0UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjE3Iik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1llc1RvQWxsID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGludCByZWZlcmVuY2VDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBTYXZlSGFuZGxlclVJIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNhdmVIYW5kbGVyVUkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWNjZXNzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VzcygpIHsKLQkJcmVmZXJlbmNlQ291bnQrKzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0UGFyZW50U2hlbGxGb3JEaWFsb2coKSB7Ci0JCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSByZXN1bHQgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlZmVyZW5jZUNvdW50ID4gMSkKLQkJCS8vTGV0IHRoZSBvdXRlcm1vc3QgcmVmZXJlbmNlIGhhbmRsZSBpdAotCQkJdGhyb3cgZXg7Ci0JCVN0cmluZyBleE1zZyA9IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpID09IG51bGwgPyBleC5nZXRNZXNzYWdlKCkgOiBleC5nZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7Ci0JCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gQkVHSU5OSU5HX01FU1NBR0UgKyAiOlxuIiArIGV4TXNnOy8vJE5PTi1OTFMtMSQKLQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpLCBTQVZFX0ZBSUxFRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJZWxzZQotCQkJdGhyb3cgZXg7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0VXNlclRvU2F2ZVJlYWRPbmx5KElGaWxlIGFGaWxlKSB7Ci0KLQkJU3RyaW5nW10gYnV0dG9uU3RyaW5ncyA9IHtXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlllc19VSV8iKSwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJZZXNfVG9fQWxsX1VJXyIpLCBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIk5vX1VJXyIpfTsgLy8kTk9OLU5MUy0zJCA9ICJObyIgLy8kTk9OLU5MUy0yJCA9ICJZZXMgVG8gQWxsIiAvLyROT04tTkxTLTEkID0gIlllcyIKLQkJU3RyaW5nIHRpdGxlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJTYXZpbmdfUmVhZC1Pbmx5X0ZpbGVfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiU2F2aW5nIFJlYWQtT25seSBGaWxlIgotCQlTdHJpbmcgbWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMmNvbmNhdF9JTkZPXyIsIChuZXcgT2JqZWN0W117YUZpbGUuZ2V0RnVsbFBhdGgoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZmlsZSB7MH0gaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2F2ZWQuICBXb3VsZCB5b3UgbGlrZSB0byBtYWtlIGl0IGVkaXRhYmxlIGFuZCBzYXZlIGFueXdheT8iCi0KLQkJZmluYWwgTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbEZvckRpYWxvZygpLCB0aXRsZSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIGJ1dHRvblN0cmluZ3MsIDApOyAvLyBZZXMgaXMgdGhlIGRlZmF1bHQKLQotCQlmaW5hbCBpbnRbXSByZXQgPSBuZXcgaW50WzFdOwotCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlyZXRbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQotCQlzd2l0Y2ggKHJldFswXSkgewotCQkJY2FzZSAwIDogewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJY2FzZSAxIDogewotCQkJCWlzWWVzVG9BbGwgPSB0cnVlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJY2FzZSAyIDogewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcmVsZWFzZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlyZWZlcmVuY2VDb3VudC0tOwotCQlpZiAocmVmZXJlbmNlQ291bnQgPT0gMCkKLQkJCWlzWWVzVG9BbGwgPSBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDb250aW51ZUFuZE1ha2VGaWxlRWRpdGFibGUoSUZpbGUgYUZpbGUpIHsKLQkJYm9vbGVhbiB5ZXMgPSBpc1llc1RvQWxsIHx8IHByb21wdFVzZXJUb1NhdmVSZWFkT25seShhRmlsZSk7Ci0JCWlmICh5ZXMpCi0JCQlhRmlsZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5zZXRSZWFkT25seShmYWxzZSk7Ci0JCXJldHVybiB5ZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUdyb3VwSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OGVlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlR3JvdXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUdyb3VwSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VHcm91cEhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXBIYW5kbGVyIHsKLQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlR3JvdXAoU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzKSB7Ci0JCWlmIChwYWdlR3JvdXBJRHMgPT0gbnVsbCB8fCBwYWdlR3JvdXBJRHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpCi0JCQlyZXR1cm4gcGFnZUdyb3VwSURzWzBdOwotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYWdlR3JvdXBJRHMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAocGFnZUdyb3VwSURzW2luZGV4XS5lcXVhbHMoY3VycmVudFBhZ2VHcm91cElEKSkgewotCQkJCS8vIFdlIGZvdW5kIHRoZSBjdXJyZW50UGFnZUdyb3VwSUQsIHNvIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBuZXh0IG9uZSBpbiB0aGUKLQkJCQkvLyBhcnJheSBpZiB0aGVyZSBpcyBvbmUuCi0JCQkJaWYgKGluZGV4ICsgMSA8IHBhZ2VHcm91cElEcy5sZW5ndGgpIHsKLQkJCQkJcmVzdWx0ID0gcGFnZUdyb3VwSURzW2luZGV4ICsgMV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVQYWdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGRiMzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvU2ltcGxlUGFnZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VIYW5kbGVyIGltcGxlbWVudHMgSURNUGFnZUhhbmRsZXIKLXsKLSAgcHVibGljIFN0cmluZyBnZXROZXh0UGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWROZXh0UGFnZU5hbWUpIAotICB7Ci0gICAgcmV0dXJuIGV4cGVjdGVkTmV4dFBhZ2VOYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmV2aW91c1BhZ2UoU3RyaW5nIGN1cnJlbnRQYWdlTmFtZSwgU3RyaW5nIGV4cGVjdGVkUHJldmlvdXNQYWdlTmFtZSkgCi0gIHsKLQlyZXR1cm4gZXhwZWN0ZWRQcmV2aW91c1BhZ2VOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0VUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYjU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dFVJIGV4dGVuZHMgU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzIGltcGxlbWVudHMgSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQgewotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0SW1wbChmaW5hbCBJRmlsZVtdIGZpbGVzVG9WYWxpZGF0ZSkgewotCQlmaW5hbCBJU3RhdHVzIFtdIHN0YXR1cyA9IG5ldyBJU3RhdHVzWzFdOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3RhdHVzWzBdID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlc1RvVmFsaWRhdGUsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0YXR1c1swXTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZWRLZXlMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2M3YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZEtleUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzMwLzIwMDEgNDowMDoyOCBQTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGltZWRLZXlMaXN0ZW5lciBleHRlbmRzIFRpbWVyIGltcGxlbWVudHMgS2V5TGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIsIE1vdXNlVHJhY2tMaXN0ZW5lciwgTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFdpZGdldCBtb25pdG9yaW5nVGFyZ2V0OwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFRJTUVfTElNSVQgPSAyMDA7Ci0KLQkvKioKLQkgKiBKMkVFVGltZWRLZXlMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZEtleUxpc3RlbmVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoZGVsYXksIGxpc3RlbmVyKTsKLQkJc2V0UmVwZWF0cyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8zMC8yMDAxIDQ6NDM6MzMgUE0pCi0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyCi0JICovCi0JcHVibGljIFRpbWVkS2V5TGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcyhUSU1FX0xJTUlULCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU2VudCB3aGVuIGEga2V5IGlzIHByZXNzZWQgb24gdGhlIHN5c3RlbSBrZXlib2FyZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2V5IHByZXNzCi0JICovCi0JcHVibGljIHZvaWQga2V5UHJlc3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBTZW50IHdoZW4gYSBrZXkgaXMgcmVsZWFzZWQgb24gdGhlIHN5c3RlbSBrZXlib2FyZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2V5IHJlbGVhc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50IGUpIHsKLQkJLy8gUmVwbGFjZWQgd2l0aCBTV1QuTW9kaWZ5IC0tIHNlZSBtb2RpZnlUZXh0KCkgaW4gdGhpcyBjbGFzcwotCQkvLyAgICAgICAgbW9uaXRvcmluZ1RhcmdldCA9IChXaWRnZXQpIGUuZ2V0U291cmNlKCk7Ci0JCS8vICAgICAgICByZXN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3duKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlVXAoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQltb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJcmVzdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXIjbW91c2VFbnRlcihNb3VzZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUV4aXQoTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lciNtb3VzZUhvdmVyKE1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS51dGlsLlRpbWVyI2dldFNvdXJjZSgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBtb25pdG9yaW5nVGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCW1vbml0b3JpbmdUYXJnZXQgPSAoV2lkZ2V0KSBlLmdldFNvdXJjZSgpOwotCQlyZXN0YXJ0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVGltZWRNb2RpZnlMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDQ1ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lZE1vZGlmeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIEoyRUVUaW1lZEtleUxpc3RlbmVyIGJ1dCB1c2luZyB0aGUgTW9kaWZ5IFNXVCBldmVudAotICogaW5zdGVhZCBvZiB0aGUgS2V5VXAuIENyZWF0aW9uIGRhdGU6ICg5LzEwLzIwMDEgMTE6NDY6NTEgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBUaW1lZE1vZGlmeUxpc3RlbmVyIGV4dGVuZHMgVGltZWRLZXlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkvKioKLQkgKiBKMkVFVGltZWRNb2RlZnlMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZWxheQotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBUaW1lZE1vZGlmeUxpc3RlbmVyKGludCBkZWxheSwgQWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoZGVsYXksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBKMkVFVGltZWRNb2RlZnlMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgVGltZWRNb2RpZnlMaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBSZS9TdGFydCB0aGUgdGltZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQgZSkgewotCQltb25pdG9yaW5nVGFyZ2V0ID0gKFdpZGdldCkgZS5nZXRTb3VyY2UoKTsKLQkJcmVzdGFydCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjExYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi0KLXB1YmxpYyBjbGFzcyBUaW1lciB7Ci0JLyoqCi0JICogRG9Qb3N0RXZlbnQgaXMgYSBydW5uYWJsZSBjbGFzcyB0aGF0IGZpcmVzIGFjdGlvbkV2ZW50cyB0byB0aGUgbGlzdGVuZXJzIG9uIHRoZQotCSAqIEV2ZW50RGlzcGF0Y2hUaHJlYWQsIHZpYSBpbnZva2VMYXRlci4KLQkgKiAKLQkgKiBAc2VlICNwb3N0Ci0JICovCi0JY2xhc3MgRG9Qb3N0RXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChldmVudFF1ZXVlZCkgewotCQkJCWZpcmVBY3Rpb25QZXJmb3JtZWQobmV3IEFjdGlvbkV2ZW50KGdldFNvdXJjZSgpLCAwLCBudWxsKSk7Ci0JCQkJY2FuY2VsRXZlbnQoKTsKLQkJCX0KLQkJfQotCi0JCVRpbWVyIGdldFRpbWVyKCkgewotCQkJcmV0dXJuIFRpbWVyLnRoaXM7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQlib29sZWFuIGV2ZW50UXVldWVkID0gZmFsc2U7Ci0JaW50IGluaXRpYWxEZWxheSwgZGVsYXk7Ci0JYm9vbGVhbiByZXBlYXRzID0gdHJ1ZSwgY29hbGVzY2UgPSB0cnVlOwotCXByaXZhdGUgUnVubmFibGUgZG9Qb3N0RXZlbnQ7Ci0JLy8gVGhlc2UgZmllbGRzIGFyZSBtYWludGFpbmVkIGJ5IFRpbWVyUXVldWUuCi0JLy8gZXZlbnRRdWV1ZWQgY2FuIGFsc28gYmUgcmVzZXQgYnkgdGhlIFRpbWVyUXVldWUsIGJ1dCB3aWxsIG9ubHkgZXZlcgotCS8vIGhhcHBlbiBpbiBhcHBsZXQgY2FzZSB3aGVuIFRpbWVyUXVldWVzIHRocmVhZCBpcyBkZXN0cm95ZWQuCi0JbG9uZyBleHBpcmF0aW9uVGltZTsKLQlUaW1lciBuZXh0VGltZXI7Ci0JYm9vbGVhbiBydW5uaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFRpbWVyIHRoYXQgd2lsbCBub3RpZnkgaXRzIGxpc3RlbmVycyBldmVyeSA8aT5kZWxheSA8L2k+IG1pbGxpc2Vjb25kcy4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsYXkKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gbGlzdGVuZXIgbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBBbiBpbml0aWFsIGxpc3RlbmVyCi0JICogQHNlZSAjc2V0SW5pdGlhbERlbGF5Ci0JICogQHNlZSAjc2V0UmVwZWF0cwotCSAqLwotCXB1YmxpYyBUaW1lcihpbnQgZGVsYXksIEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsYXkgPSBkZWxheTsKLQkJdGhpcy5pbml0aWFsRGVsYXkgPSBkZWxheTsKLQotCQlkb1Bvc3RFdmVudCA9IG5ldyBEb1Bvc3RFdmVudCgpOwotCi0JCWlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlhZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFjdGlvbkxpc3RlbmVyIHRvIHRoZSBUaW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGNhbmNlbEV2ZW50KCkgewotCQlldmVudFF1ZXVlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgbGlzdGVuZXJzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIGludGVyZXN0IGZvciBub3RpZmljYXRpb24gb24gdGhpcyBldmVudCB0eXBlLiBUaGUKLQkgKiBldmVudCBpbnN0YW5jZSBpcyBsYXppbHkgY3JlYXRlZCB1c2luZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW50byB0aGUgZmlyZSBtZXRob2QuCi0JICogCi0JICogQHNlZSBFdmVudExpc3RlbmVyTGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVBY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkvLyBHdWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCUFjdGlvbkxpc3RlbmVyW10gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCi0JCS8vIFByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsKLQkJCWxpc3RlbmVyc1tpXS5hY3Rpb25QZXJmb3JtZWQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBUaW1lcidzIGRlbGF5LgotCSAqIAotCSAqIEBzZWUgI3NldERlbGF5Ci0JICovCi0JcHVibGljIGludCBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGRlbGF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRpbWVyJ3MgaW5pdGlhbCBkZWxheS4KLQkgKiAKLQkgKiBAc2VlICNzZXREZWxheQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbERlbGF5KCkgewotCQlyZXR1cm4gaW5pdGlhbERlbGF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGI+dHJ1ZSA8L2I+IGlmIHRoZSBUaW1lciBjb2FsZXNjZXMgbXVsdGlwbGUgcGVuZGluZyA8Yj5wZXJmb3JtQ29tbWFuZCgpIDwvYj4KLQkgKiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAc2VlICNzZXRDb2FsZXNjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29hbGVzY2UoKSB7Ci0JCXJldHVybiBjb2FsZXNjZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxiPnRydWUgPC9iPiBpZiB0aGUgVGltZXIgd2lsbCBzZW5kIGEgPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlIHRvIGl0cwotCSAqIGxpc3RlbmVycyBtdWx0aXBsZSB0aW1lcy4KLQkgKiAKLQkgKiBAc2VlICNzZXRSZXBlYXRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXBlYXRzKCkgewotCQlyZXR1cm4gcmVwZWF0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxiPnRydWUgPC9iPiBpZiB0aGUgVGltZXIgaXMgcnVubmluZy4KLQkgKiAKLQkgKiBAc2VlICNzdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuIHRpbWVyUXVldWUoKS5jb250YWluc1RpbWVyKHRoaXMpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHBvc3QoKSB7Ci0JCWlmICghZXZlbnRRdWV1ZWQpIHsKLQkJCWV2ZW50UXVldWVkID0gdHJ1ZTsKLQkJCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhkb1Bvc3RFdmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIEFjdGlvbkxpc3RlbmVyIGZyb20gdGhlIFRpbWVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlc3RhcnRzIGEgVGltZXIsIGNhbmNlbGluZyBhbnkgcGVuZGluZyBmaXJpbmdzLCBhbmQgY2F1c2luZyBpdCB0byBmaXJlIHdpdGggaXRzIGluaXRpYWwKLQkgKiBkZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RhcnQoKSB7Ci0JCXN0b3AoKTsKLQkJc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIFRpbWVyIGNvYWxlc2NlcyBtdWx0aXBsZSBwZW5kaW5nIEFjdGlvbkV2ZW50IGZpcmluZ3MuIEEgYnVzeSBhcHBsaWNhdGlvbiBtYXkKLQkgKiBub3QgYmUgYWJsZSB0byBrZWVwIHVwIHdpdGggYSBUaW1lcidzIG1lc3NhZ2UgZ2VuZXJhdGlvbiwgY2F1c2luZyBtdWx0aXBsZQotCSAqIDxiPmFjdGlvblBlcmZvcm1lZCgpIDwvYj4gbWVzc2FnZSBzZW5kcyB0byBiZSBxdWV1ZWQuIFdoZW4gcHJvY2Vzc2VkLCB0aGUgYXBwbGljYXRpb24gc2VuZHMKLQkgKiB0aGVzZSBtZXNzYWdlcyBvbmUgYWZ0ZXIgdGhlIG90aGVyLCBjYXVzaW5nIHRoZSBUaW1lcidzIGxpc3RlbmVycyB0byByZWNlaXZlIGEgc2VxdWVuY2Ugb2YKLQkgKiA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2VzIHdpdGggbm8gZGVsYXkgYmV0d2VlbiB0aGVtLiBDb2FsZXNjaW5nIGF2b2lkcyB0aGlzCi0JICogc2l0dWF0aW9uIGJ5IHJlZHVjaW5nIG11bHRpcGxlIHBlbmRpbmcgbWVzc2FnZXMgdG8gYSBzaW5nbGUgbWVzc2FnZSBzZW5kLiBUaW1lcnMgY29hbGVzY2UKLQkgKiB0aGVpciBtZXNzYWdlIHNlbmRzIGJ5IGRlZmF1bHQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29hbGVzY2UoYm9vbGVhbiBmbGFnKSB7Ci0JCWNvYWxlc2NlID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBUaW1lcidzIGRlbGF5LCB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgPGI+YWN0aW9uUGVyZm9tZWQoKQotCSAqIDwvYj4gbWVzc2FnZXMgdG8gaXRzIGxpc3RlbmVycwotCSAqIAotCSAqIEBzZWUgI3NldEluaXRpYWxEZWxheQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5KGludCBkZWxheSkgewotCQlpZiAoZGVsYXkgPCAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLlRpbWVyX1VJXzAsIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnRvU3RyaW5nKGRlbGF5KX0pOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCXRoaXMuZGVsYXkgPSBkZWxheTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBUaW1lcidzIGluaXRpYWwgZGVsYXkuIFRoaXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgZmlyc3QgInJpbmdpbmciIG9mIHRoZSBUaW1lciBvbmx5LgotCSAqIFN1YnNlcXVlbnQgcmluZ2luZ3Mgd2lsbCBiZSBzcGFjZWQgdXNpbmcgdGhlIGRlbGF5IHByb3BlcnR5LgotCSAqIAotCSAqIEBzZWUgI3NldERlbGF5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbERlbGF5KGludCBpbml0aWFsRGVsYXkpIHsKLQkJaWYgKGluaXRpYWxEZWxheSA8IDApIHsKLQkJCVN0cmluZyBtc2cgPSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuVGltZXJfVUlfMSwgbmV3IE9iamVjdFtde0ludGVnZXIudG9TdHJpbmcoaW5pdGlhbERlbGF5KX0pOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbERlbGF5ID0gaW5pdGlhbERlbGF5OwotCX0KLQotCS8qKgotCSAqIElmIDxiPmZsYWcgPC9iPiBpcyA8Yj5mYWxzZSA8L2I+LCBpbnN0cnVjdHMgdGhlIFRpbWVyIHRvIHNlbmQgPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiB0bwotCSAqIGl0cyBsaXN0ZW5lcnMgb25seSBvbmNlLCBhbmQgdGhlbiBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGVhdHMoYm9vbGVhbiBmbGFnKSB7Ci0JCXJlcGVhdHMgPSBmbGFnOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgVGltZXIsIGNhdXNpbmcgaXQgdG8gc2VuZCA8Yj5hY3Rpb25QZXJmb3JtZWQoKSA8L2I+IG1lc3NhZ2VzIHRvIGl0cyBsaXN0ZW5lcnMuCi0JICogCi0JICogQHNlZSAjc3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aW1lclF1ZXVlKCkuYWRkVGltZXIodGhpcywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBnZXRJbml0aWFsRGVsYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgYSBUaW1lciwgY2F1c2luZyBpdCB0byBzdG9wIHNlbmRpbmcgPGI+YWN0aW9uUGVyZm9ybWVkKCkgPC9iPiBtZXNzYWdlcyB0byBpdHMgVGFyZ2V0LgotCSAqIAotCSAqIEBzZWUgI3N0YXJ0Ci0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJdGltZXJRdWV1ZSgpLnJlbW92ZVRpbWVyKHRoaXMpOwotCQljYW5jZWxFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVyIHF1ZXVlLgotCSAqLwotCVRpbWVyUXVldWUgdGltZXJRdWV1ZSgpIHsKLQkJcmV0dXJuIFRpbWVyUXVldWUuc2luZ2xldG9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VyY2UgZm9yIHRoZSBBY3Rpb25FdmVudCB0aGF0IGlzIGZpcmVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9UaW1lclF1ZXVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NDJmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1RpbWVyUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi0KLQotCi1jbGFzcyBUaW1lclF1ZXVlIGltcGxlbWVudHMgUnVubmFibGUgewotCXByaXZhdGUgc3RhdGljIFRpbWVyUXVldWUgc2luZ2xldG9uOwotCVRpbWVyIGZpcnN0VGltZXI7Ci0JYm9vbGVhbiBydW5uaW5nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBjbGFzc0xvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGltZXJRdWV1ZS4KLQkgKi8KLQlwdWJsaWMgVGltZXJRdWV1ZSgpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBOb3cgc3RhcnQgdGhlIFRpbWVyUXVldWUgdGhyZWFkLgotCQlzdGFydCgpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGFkZFRpbWVyKFRpbWVyIHRpbWVyLCBsb25nIGV4cGlyYXRpb25UaW1lKSB7Ci0JCVRpbWVyIHByZXZpb3VzVGltZXI7Ci0JCVRpbWVyIG5leHRUaW1lcjsKLQotCQkvLyBJZiB0aGUgVGltZXIgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUsIHRoZW4gaWdub3JlIHRoZSBhZGQuCi0JCWlmICh0aW1lci5ydW5uaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmV2aW91c1RpbWVyID0gbnVsbDsKLQkJbmV4dFRpbWVyID0gZmlyc3RUaW1lcjsKLQotCQkvLyBJbnNlcnQgdGhlIFRpbWVyIGludG8gdGhlIGxpbmtlZCBsaXN0IGluIHRoZSBvcmRlciB0aGV5IHdpbGwKLQkJLy8gZXhwaXJlLiBJZiB0d28gdGltZXJzIGV4cGlyZSBhdCB0aGUgc2FtZSB0aW1lLCBwdXQgdGhlIG5ld2VyIGVudHJ5Ci0JCS8vIGxhdGVyIHNvIHRoZXkgZXhwaXJlIGluIHRoZSBvcmRlciB0aGV5IGNhbWUgaW4uCi0KLQkJd2hpbGUgKG5leHRUaW1lciAhPSBudWxsKSB7Ci0JCQlpZiAobmV4dFRpbWVyLmV4cGlyYXRpb25UaW1lID4gZXhwaXJhdGlvblRpbWUpCi0JCQkJYnJlYWs7Ci0KLQkJCXByZXZpb3VzVGltZXIgPSBuZXh0VGltZXI7Ci0JCQluZXh0VGltZXIgPSBuZXh0VGltZXIubmV4dFRpbWVyOwotCQl9Ci0KLQkJaWYgKHByZXZpb3VzVGltZXIgPT0gbnVsbCkgewotCQkJZmlyc3RUaW1lciA9IHRpbWVyOwotCQl9IGVsc2UgewotCQkJcHJldmlvdXNUaW1lci5uZXh0VGltZXIgPSB0aW1lcjsKLQkJfQotCi0JCXRpbWVyLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7Ci0JCXRpbWVyLm5leHRUaW1lciA9IG5leHRUaW1lcjsKLQkJdGltZXIucnVubmluZyA9IHRydWU7Ci0JCW5vdGlmeSgpOwotCX0KLQotCXN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zVGltZXIoVGltZXIgdGltZXIpIHsKLQkJcmV0dXJuIHRpbWVyLnJ1bm5pbmc7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlcmUgYXJlIGEgdG9uIG9mIHRpbWVycywgdGhpcyBtZXRob2QgbWF5IG5ldmVyIHJldHVybi4gSXQgbG9vcHMgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZQotCSAqIGhlYWQgb2YgdGhlIFRpbWVyIGxpc3QgaGFzIGV4cGlyZWQuIElmIGl0IGhhcywgaXQgcG9zdHMgdGhlIFRpbWVyIGFuZCByZXNjaGVkdWxlcyBpdCBpZgotCSAqIG5lY2Vzc2FyeS4KLQkgKi8KLQlzeW5jaHJvbml6ZWQgbG9uZyBwb3N0RXhwaXJlZFRpbWVycygpIHsKLQkJVGltZXIgdGltZXI7Ci0JCWxvbmcgY3VycmVudFRpbWU7Ci0JCWxvbmcgdGltZVRvV2FpdDsKLQotCQkvLyBUaGUgdGltZVRvV2FpdCB3ZSByZXR1cm4gc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlIGFuZCBvbmx5IGJlIHplcm8KLQkJLy8gd2hlbiB3ZSBoYXZlIG5vIFRpbWVycyB0byB3YWl0IGZvci4KLQotCQlkbyB7Ci0JCQl0aW1lciA9IGZpcnN0VGltZXI7Ci0JCQlpZiAodGltZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQotCQkJY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCXRpbWVUb1dhaXQgPSB0aW1lci5leHBpcmF0aW9uVGltZSAtIGN1cnJlbnRUaW1lOwotCi0JCQlpZiAodGltZVRvV2FpdCA8PSAwKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGltZXIucG9zdCgpOyAvLyBoYXZlIHRpbWVyIHBvc3QgYW4gZXZlbnQKLQkJCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCi0JCQkJLy8gUmVtb3ZlIHRoZSB0aW1lciBmcm9tIHRoZSBxdWV1ZQotCQkJCXJlbW92ZVRpbWVyKHRpbWVyKTsKLQotCQkJCS8vIFRoaXMgdHJpZXMgdG8ga2VlcCB0aGUgaW50ZXJ2YWwgdW5pZm9ybSBhdAotCQkJCS8vIHRoZSBjb3N0IG9mIGRyaWZ0LgotCQkJCWlmICh0aW1lci5pc1JlcGVhdHMoKSkgewotCQkJCQlhZGRUaW1lcih0aW1lciwgY3VycmVudFRpbWUgKyB0aW1lci5nZXREZWxheSgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEFsbG93IG90aGVyIHRocmVhZHMgdG8gY2FsbCBhZGRUaW1lcigpIGFuZCByZW1vdmVUaW1lcigpCi0JCQkvLyBldmVuIHdoZW4gd2UgYXJlIHBvc3RpbmcgVGltZXJzIGxpa2UgbWFkLiBTaW5jZSB0aGUgd2FpdCgpCi0JCQkvLyByZWxlYXNlcyB0aGUgbG9jaywgYmUgc3VyZSBub3QgdG8gbWFpbnRhaW4gYW55IHN0YXRlCi0JCQkvLyBiZXR3ZWVuIGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3AuCi0KLQkJCXRyeSB7Ci0JCQkJd2FpdCgxKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSB3aGlsZSAodGltZVRvV2FpdCA8PSAwKTsKLQotCQlyZXR1cm4gdGltZVRvV2FpdDsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVUaW1lcihUaW1lciB0aW1lcikgewotCQlUaW1lciBwcmV2aW91c1RpbWVyOwotCQlUaW1lciBuZXh0VGltZXI7Ci0JCWJvb2xlYW4gZm91bmQ7Ci0KLQkJaWYgKCF0aW1lci5ydW5uaW5nKQotCQkJcmV0dXJuOwotCi0JCXByZXZpb3VzVGltZXIgPSBudWxsOwotCQluZXh0VGltZXIgPSBmaXJzdFRpbWVyOwotCQlmb3VuZCA9IGZhbHNlOwotCi0JCXdoaWxlIChuZXh0VGltZXIgIT0gbnVsbCkgewotCQkJaWYgKG5leHRUaW1lciA9PSB0aW1lcikgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcHJldmlvdXNUaW1lciA9IG5leHRUaW1lcjsKLQkJCW5leHRUaW1lciA9IG5leHRUaW1lci5uZXh0VGltZXI7Ci0JCX0KLQotCQlpZiAoIWZvdW5kKQotCQkJcmV0dXJuOwotCi0JCWlmIChwcmV2aW91c1RpbWVyID09IG51bGwpIHsKLQkJCWZpcnN0VGltZXIgPSB0aW1lci5uZXh0VGltZXI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2aW91c1RpbWVyLm5leHRUaW1lciA9IHRpbWVyLm5leHRUaW1lcjsKLQkJfQotCi0JCXRpbWVyLmV4cGlyYXRpb25UaW1lID0gMDsKLQkJdGltZXIubmV4dFRpbWVyID0gbnVsbDsKLQkJdGltZXIucnVubmluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKSB7Ci0JCWxvbmcgdGltZVRvV2FpdDsKLQotCQl0cnkgewotCQkJd2hpbGUgKHJ1bm5pbmcpIHsKLQkJCQl0aW1lVG9XYWl0ID0gcG9zdEV4cGlyZWRUaW1lcnMoKTsKLQkJCQl0cnkgewotCQkJCQl3YWl0KHRpbWVUb1dhaXQpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocmVhZERlYXRoIHRkKSB7Ci0JCQlydW5uaW5nID0gZmFsc2U7Ci0JCQkvLyBNYXJrIGFsbCB0aGUgdGltZXJzIHdlIGNvbnRhaW4gYXMgbm90IGJlaW5nIHF1ZXVlZC4KLQkJCVRpbWVyIHRpbWVyID0gZmlyc3RUaW1lcjsKLQkJCXdoaWxlICh0aW1lciAhPSBudWxsKSB7Ci0JCQkJdGltZXIuZXZlbnRRdWV1ZWQgPSBmYWxzZTsKLQkJCQl0aW1lciA9IHRpbWVyLm5leHRUaW1lcjsKLQkJCX0KLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmICghdGhpcy5ydW5uaW5nKQotCQkJCQlzdGFydCgpOwotCQkJfQotCQkJdGhyb3cgdGQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRpbWVyUXVldWUgc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzeW5jaHJvbml6ZWQgKGNsYXNzTG9jaykgewotCQkJCXNpbmdsZXRvbiA9IG5ldyBUaW1lclF1ZXVlKCk7Ci0JCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCWlmIChydW5uaW5nKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5UaW1lclF1ZXVlX0VSUk9SXzApOwotCQl9Ci0JCVRocmVhZCB0aW1lclRocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgIlRpbWVyUXVldWUiKTsvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl0aW1lclRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0aW1lclRocmVhZC5zdGFydCgpOwotCQlydW5uaW5nID0gdHJ1ZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlydW5uaW5nID0gZmFsc2U7Ci0JCW5vdGlmeSgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmOwotCQlUaW1lciBuZXh0VGltZXI7Ci0KLQkJYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJUaW1lclF1ZXVlICgiKTsvLyROT04tTkxTLTEkCi0KLQkJbmV4dFRpbWVyID0gZmlyc3RUaW1lcjsKLQkJd2hpbGUgKG5leHRUaW1lciAhPSBudWxsKSB7Ci0JCQlidWYuYXBwZW5kKG5leHRUaW1lci50b1N0cmluZygpKTsKLQotCQkJbmV4dFRpbWVyID0gbmV4dFRpbWVyLm5leHRUaW1lcjsKLQkJCWlmIChuZXh0VGltZXIgIT0gbnVsbCkKLQkJCQlidWYuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudElkZW50aWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzdlNTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUFjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSUlkZW50aWZpZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklkZW50aWZpZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotY2xhc3MgVUlFbmFibGVtZW50SWRlbnRpZmllciBleHRlbmRzIEVuYWJsZW1lbnRJZGVudGlmaWVyIGltcGxlbWVudHMgSUlkZW50aWZpZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIElJZGVudGlmaWVyIGFjdGl2aXR5SWRlbnRpZmllcjsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICovCi0JcHVibGljIFVJRW5hYmxlbWVudElkZW50aWZpZXIoU3RyaW5nIGlkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKGlkLCBwcm9qZWN0KTsKLQkJSUFjdGl2aXR5TWFuYWdlciBtYW5hZ2VyID0gZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5SWRlbnRpZmllciA9IGdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoaWQpOwotCQkJYWN0aXZpdHlJZGVudGlmaWVyLmFkZElkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllckxpc3RlbmVyI2lkZW50aWZpZXJDaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSWRlbnRpZmllckV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKElkZW50aWZpZXJFdmVudCBpZGVudGlmaWVyRXZlbnQpIHsKLQkJYm9vbGVhbiBlbmFibGVkQ2hhbmdlZCA9IHJlc2V0RW5hYmxlZCgpOwotCQlFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCA9IG5ldyBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50KHRoaXMsIGZhbHNlLCBlbmFibGVkQ2hhbmdlZCk7Ci0JCWZpcmVJZGVudGlmaWVyQ2hhbmdlZChldnQpOwotCX0KLQotCXByb3RlY3RlZCBJQWN0aXZpdHlNYW5hZ2VyIGdldEFjdGl2aXR5TWFuYWdlcigpIHsKLQkJcmV0dXJuICgoVUlFbmFibGVtZW50TWFuYWdlcikgSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFKS5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpc3BlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyI2dldE5ld0VuYWJsZWQoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldE5ld0VuYWJsZWQoKSB7Ci0JCUlJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBnZXRBY3Rpdml0eUlkZW50aWZpZXIoKTsKLQkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkKLQkJCXJldHVybiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpICYmIHN1cGVyLmdldE5ld0VuYWJsZWQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCXByb3RlY3RlZCBJSWRlbnRpZmllciBnZXRBY3Rpdml0eUlkZW50aWZpZXIoKSB7Ci0JCWlmIChhY3Rpdml0eUlkZW50aWZpZXIgPT0gbnVsbCl7Ci0JCQlJQWN0aXZpdHlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlhY3Rpdml0eUlkZW50aWZpZXIgPSBnZXRBY3Rpdml0eU1hbmFnZXIoKS5nZXRJZGVudGlmaWVyKGdldElkKCkpOwotCQkJCWFjdGl2aXR5SWRlbnRpZmllci5hZGRJZGVudGlmaWVyTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5SWRlbnRpZmllcjsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJRW5hYmxlbWVudE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI3NDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlFbmFibGVtZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqLwotcHVibGljIGNsYXNzIFVJRW5hYmxlbWVudE1hbmFnZXIgZXh0ZW5kcyBFbmFibGVtZW50TWFuYWdlciB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgYWN0aXZpdHlTdXBwb3J0ID0gbnVsbDsKLQotCXB1YmxpYyBVSUVuYWJsZW1lbnRNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJQWN0aXZpdHlNYW5hZ2VyIGdldEFjdGl2aXR5TWFuYWdlcigpIHsKLQkJaWYgKGdldEFjdGl2aXR5U3VwcG9ydCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlTdXBwb3J0KCkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWN0aXZpdHlTdXBwb3J0LgotCSAqLwotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGdldEFjdGl2aXR5U3VwcG9ydCgpIHsKLQkJaWYgKGFjdGl2aXR5U3VwcG9ydCA9PSBudWxsKQotCQkJYWN0aXZpdHlTdXBwb3J0ID0gaW5pdEFjdGl2aXR5U3VwcG9ydCgpOwotCQlyZXR1cm4gYWN0aXZpdHlTdXBwb3J0OwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCBpbml0QWN0aXZpdHlTdXBwb3J0KCkgewotCQlJV29ya2JlbmNoIHdvcmsgPSBudWxsOwotCQl0cnkgewotCQkJd29yayA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJLy9Ob3QgaW5pdGlhbGl6ZWQgeWV0Ci0JCX0KLQkJcmV0dXJuICh3b3JrICE9IG51bGwpID8gd29yay5nZXRBY3Rpdml0eVN1cHBvcnQoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlciNjcmVhdGVJZGVudGlmaWVyKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIgY3JlYXRlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgVUlFbmFibGVtZW50SWRlbnRpZmllcihpZGVudGlmaWVySWQsIHByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlPcGVyYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1VJT3BlcmF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NjZDUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlPcGVyYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFVJT3BlcmF0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElPcGVyYXRpb25IYW5kbGVyIHsKLQlwcm90ZWN0ZWQgU2hlbGwgcGFyZW50U2hlbGw7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JTkZPUk1BVElPTiA9ICJJbmZvcm1hdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0VSUk9SID0gIkVycm9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09ORklSTSA9ICJDb25maXJtIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgaW5mb3JtYXRpb25UaXRsZSA9IERFRkFVTFRfSU5GT1JNQVRJT047Ci0JcHJvdGVjdGVkIFN0cmluZyBjb25maXJtVGl0bGUgPSBERUZBVUxUX0NPTkZJUk07Ci0JcHJvdGVjdGVkIFN0cmluZyBlcnJvclRpdGxlID0gREVGQVVMVF9FUlJPUjsKLQotCS8qKgotCSAqIFVJT3BlcmF0aW9uSGFuZGxlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVSU9wZXJhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVUlPcGVyYXRpb25IYW5kbGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFVJT3BlcmF0aW9uSGFuZGxlcihTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJcGFyZW50U2hlbGwgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXJldHVybiBMaXN0TWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG1lc3NhZ2UsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZS4gVGhlIGJvb2xlYW4gYXJyYXkKLQkgKiB3aWxsIHJldHVybiB0d28gYm9vbGVhbnMuIFRoZSBmaXJzdCBpbmRpY2F0ZXMgdGhlaXIgcmVzcG9uc2UgdG8gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uIGFuZCB0aGUKLQkgKiBzZWNvbmQgaW5kaWNhdGVzIGlmIHRoZXkgc2VsZWN0ZWQgdGhlIGFwcGx5IHRvIGFsbCBjaGVjayBib3guCi0JICogCi0JICogUmV0dXJuIHRoZSByZXR1cm4gY29kZSBmb3IgdGhlIGRpYWxvZy4gMCA9IFllcywgMSA9IFllcyB0byBhbGwsIDIgPSBObwotCSAqLwotCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhnZXRQYXJlbnRTaGVsbCgpLCBnZXRDb25maXJtVGl0bGUoKSwgbnVsbCwgLy8gYWNjZXB0Ci0JCQkJCS8vIHRoZQotCQkJCQkvLyBkZWZhdWx0Ci0JCQkJCS8vIHdpbmRvdwotCQkJCQkvLyBpY29uCi0JCQkJCW1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfSwgMSk7IC8vIHllcwotCQkvLyBpcwotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlciNjYW5Db250aW51ZVdpdGhBbGxDaGVja0FsbG93Q2FuY2VsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGludCBjYW5Db250aW51ZVdpdGhBbGxDaGVja0FsbG93Q2FuY2VsKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0UGFyZW50U2hlbGwoKSwgZ2V0Q29uZmlybVRpdGxlKCksIG51bGwsIC8vIGFjY2VwdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZGVmYXVsdAotCQkJCQkvLyB3aW5kb3cKLQkJCQkJLy8gaWNvbgotCQkJCQltZXNzYWdlLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAxKTsgLy8geWVzCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFBhcmVudFNoZWxsKCksIGdldEVycm9yVGl0bGUoKSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBjb25maXJtYXRpb25zCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q29uZmlybVRpdGxlKCkgewotCQlyZXR1cm4gY29uZmlybVRpdGxlOwotCX0KLQotCS8qKgotCSAqIFRoZSBkaWFsb2cgdGl0bGUgdG8gYmUgdXNlZCBmb3IgZXJyb3JzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXJyb3JUaXRsZSgpIHsKLQkJcmV0dXJuIGVycm9yVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRpYWxvZyB0aXRsZSB0byBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEluZm9ybWF0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBpbmZvcm1hdGlvblRpdGxlOwotCX0KLQotCXB1YmxpYyBTaGVsbCBnZXRQYXJlbnRTaGVsbCgpIHsKLQkJaWYgKHBhcmVudFNoZWxsID09IG51bGwpCi0JCQlwYXJlbnRTaGVsbCA9IFdUUFVJUGx1Z2luLmdldFBsdWdpbldvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJcmV0dXJuIHBhcmVudFNoZWxsOwotCX0KLQotCS8qKgotCSAqIEFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZSBuZWVkcyB0byBiZSBwcmVzZW50ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmZvcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0UGFyZW50U2hlbGwoKSwgZ2V0SW5mb3JtYXRpb25UaXRsZSgpLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzkvMjAwMSAxMTo1MTozNiBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q29uZmlybVRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlybVRpdGxlKGphdmEubGFuZy5TdHJpbmcgbmV3Q29uZmlybVRpdGxlKSB7Ci0JCWNvbmZpcm1UaXRsZSA9IG5ld0NvbmZpcm1UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg4LzkvMjAwMSAxMTo1MTozNiBBTSkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXJyb3JUaXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yVGl0bGUoamF2YS5sYW5nLlN0cmluZyBuZXdFcnJvclRpdGxlKSB7Ci0JCWVycm9yVGl0bGUgPSBuZXdFcnJvclRpdGxlOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDgvOS8yMDAxIDExOjUxOjM2IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdJbmZvcm1hdGlvblRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb25UaXRsZShqYXZhLmxhbmcuU3RyaW5nIG5ld0luZm9ybWF0aW9uVGl0bGUpIHsKLQkJaW5mb3JtYXRpb25UaXRsZSA9IG5ld0luZm9ybWF0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXIjZ2V0Q29udGV4dCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50U2hlbGwoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVUlUZXN0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2JhN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9VSVRlc3RlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVUlUZXN0ZXJJbXBsIGltcGxlbWVudHMgVUlUZXN0ZXIgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBVSVRlc3RlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuVUlUZXN0ZXIjaXNDdXJyZW50Q29udGV4dFVJKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSB8fCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUsIHdvcmtiZW5jaCBtdXN0IG5vdCBiZSBydW5uaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvVmFsaWRhdGlvblN0YXR1cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGY2YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9WYWxpZGF0aW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgZW5jb21wYXMgYSBzZXQgb2YgVmFsaWRhdGlvbiBzdGF0dXMgQ3JlYXRpb24gZGF0ZTogKDkvMTAvMjAwMSA1OjM1OjEyIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RhdHVzIHsKLQotCS8vIFRPRE8gbWFrZSBhbGwgdGhlc2UgdmFycyBwcml2YXRlIGFuZCBjaGFuZ2UgZXJyTXNncyAmIGVyclN0YXR1cyB0byBtYXBzIHNvIHRoZSBzYW1lIG1ldGhvZHMKLQkvLyBjYW4gYmUgdXNlZCBhcyB3aXRoIHdhcm5pbmdzICYgaW5mbwotCUhhc2h0YWJsZSBlcnJNc2dzID0gbmV3IEhhc2h0YWJsZSgpOwotCUhhc2h0YWJsZSBlcnJTdGF0dXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JSGFzaHRhYmxlIHRDb250cm9scyA9IG5ldyBIYXNodGFibGUoKTsKLQlNYXAgd2Fybk1zZ3M7Ci0JTWFwIHdhcm5TdGF0dXM7Ci0JTWFwIGluZm9Nc2dzOwotCU1hcCBpbmZvU3RhdHVzOwotCi0JLyoqCi0JICogVmFsaWRhdGlvblN0YXR1cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogTG9vayBmb3IgYW55IGVycm9yLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gZXJyb3JzIGFjY29yZGluZyB0byB0aGVpciBrZXkuIGkuZS4sCi0JICogbG93ZXIga2V5IGVycm9ycyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdEVyck1zZygpIHsKLQkJLy9UT0RPIG9uY2UgaXZhcnMgYXJlIGNoYW5nZWQgdG8gbWFwcywgcGFzcyB0aGlzIHRvIGdldExhc3RNc2coKQotCQlFbnVtZXJhdGlvbiBlID0gZXJyU3RhdHVzLmtleXMoKTsKLQkJU3RyaW5nW10gZXJycyA9IG5ldyBTdHJpbmdbZXJyU3RhdHVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXJycy5sZW5ndGg7IGkrKykKLQkJCWVycnNbaV0gPSBudWxsOwotCQlib29sZWFuIGZvdW5kT25lID0gZmFsc2U7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlJbnRlZ2VyIGtleSA9IChJbnRlZ2VyKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoISgoQm9vbGVhbikgZXJyU3RhdHVzLmdldChrZXkpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWVycnNba2V5LmludFZhbHVlKCkgJSBlcnJzLmxlbmd0aF0gPSAoU3RyaW5nKSBlcnJNc2dzLmdldChrZXkpOwotCQkJCWZvdW5kT25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRPbmUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVycnMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGVycnNbaV0gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGVycnNbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFdhcm5pbmdNc2dzKCkgewotCQlpZiAod2Fybk1zZ3MgPT0gbnVsbCkKLQkJCXdhcm5Nc2dzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHdhcm5Nc2dzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFdhcm5pbmdTdGF0dXNNYXAoKSB7Ci0JCWlmICh3YXJuU3RhdHVzID09IG51bGwpCi0JCQl3YXJuU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHdhcm5TdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0SW5mb01zZ3MoKSB7Ci0JCWlmIChpbmZvTXNncyA9PSBudWxsKQotCQkJaW5mb01zZ3MgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gaW5mb01zZ3M7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0SW5mb1N0YXR1c01hcCgpIHsKLQkJaWYgKGluZm9TdGF0dXMgPT0gbnVsbCkKLQkJCWluZm9TdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gaW5mb1N0YXR1czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RXYXJuaW5nTXNnKCkgewotCQlyZXR1cm4gZ2V0TGFzdE1zZyh3YXJuU3RhdHVzLCB3YXJuTXNncyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXN0SW5mb01zZygpIHsKLQkJcmV0dXJuIGdldExhc3RNc2coaW5mb1N0YXR1cywgaW5mb01zZ3MpOwotCX0KLQotCS8qCi0JICogTG9vayBmb3IgYW55IHN0YXR1cy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIHN0YXR1cyBhY2NvcmRpbmcgdG8gdGhlaXIga2V5LiBpLmUuLAotCSAqIGxvd2VyIGtleSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZCBmaXJzdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYXN0TXNnKE1hcCBzdGF0dXNNYXAsIE1hcCBtc2dNYXApIHsKLQkJaWYgKHN0YXR1c01hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSBzdGF0dXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gaW5mb3MgPSBuZXcgU3RyaW5nW3N0YXR1c01hcC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKQotCQkJaW5mb3NbaV0gPSBudWxsOwotCQlib29sZWFuIGZvdW5kT25lID0gZmFsc2U7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSW50ZWdlciBrZXkgPSAoSW50ZWdlcikgZS5uZXh0KCk7Ci0JCQlpZiAoISgoQm9vbGVhbikgc3RhdHVzTWFwLmdldChrZXkpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWluZm9zW2tleS5pbnRWYWx1ZSgpICUgaW5mb3MubGVuZ3RoXSA9IChTdHJpbmcpIG1zZ01hcC5nZXQoa2V5KTsKLQkJCQlmb3VuZE9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvdW5kT25lKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoaW5mb3NbaV0gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGluZm9zW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RFcnJNc2dBbmRGb2N1cygpIHsKLQotCQlFbnVtZXJhdGlvbiBlID0gZXJyU3RhdHVzLmtleXMoKTsKLQotCQlJbnRlZ2VyIHRoZU9uZSA9IG51bGw7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlJbnRlZ2VyIGtleSA9IChJbnRlZ2VyKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoISgoQm9vbGVhbikgZXJyU3RhdHVzLmdldChrZXkpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmICh0aGVPbmUgPT0gbnVsbCB8fCBrZXkuaW50VmFsdWUoKSA8IHRoZU9uZS5pbnRWYWx1ZSgpKSB7Ci0JCQkJCXRoZU9uZSA9IGtleTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoZU9uZSAhPSBudWxsKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgdENvbnRyb2xzLmdldCh0aGVPbmUpOwotCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXJldHVybiAoKFN0cmluZykgZXJyTXNncy5nZXQodGhlT25lKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoSW50ZWdlciBrZXkpIHsKLQkJQm9vbGVhbiBzdGF0ID0gKEJvb2xlYW4pIGVyclN0YXR1cy5nZXQoa2V5KTsKLQkJaWYgKHN0YXQgIT0gbnVsbCkKLQkJCXJldHVybiBzdGF0LmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250cm9sKEludGVnZXIga2V5LCBDb250cm9sIGNvbnRyb2wpIHsKLQkJdENvbnRyb2xzLnB1dChrZXksIGNvbnRyb2wpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yU3RhdHVzKEludGVnZXIga2V5LCBCb29sZWFuIHN0YXR1cywgU3RyaW5nIG1zZykgewotCQllcnJNc2dzLnB1dChrZXksIG1zZyk7Ci0JCWVyclN0YXR1cy5wdXQoa2V5LCBzdGF0dXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgbXNnKSB7Ci0JCWVyck1zZ3MucHV0KGtleSwgbXNnKTsKLQkJZXJyU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2FybmluZ1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIG1zZykgewotCQlnZXRXYXJuaW5nTXNncygpLnB1dChrZXksIG1zZyk7Ci0JCWdldFdhcm5pbmdTdGF0dXNNYXAoKS5wdXQoa2V5LCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZm9TdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBtc2cpIHsKLQkJZ2V0SW5mb01zZ3MoKS5wdXQoa2V5LCBtc2cpOwotCQlnZXRJbmZvU3RhdHVzTWFwKCkucHV0KGtleSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgewotCQllcnJNc2dzLnB1dChrZXksICIiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJTdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQlpZiAod2Fybk1zZ3MgIT0gbnVsbCkKLQkJCXdhcm5Nc2dzLnB1dChrZXksICIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAod2FyblN0YXR1cyAhPSBudWxsKQotCQkJd2FyblN0YXR1cy5wdXQoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCWlmIChpbmZvTXNncyAhPSBudWxsKQotCQkJaW5mb01zZ3MucHV0KGtleSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmZvU3RhdHVzICE9IG51bGwpCi0JCQlpbmZvU3RhdHVzLnB1dChrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSW50ZWdlciBrZXksIGJvb2xlYW4gb2ssIFN0cmluZyBtc2cpIHsKLQkJZXJyTXNncy5wdXQoa2V5LCBtc2cpOwotCQllcnJTdGF0dXMucHV0KGtleSwgbmV3IEJvb2xlYW4ob2spKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0NDBlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbHVnaW5Db250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5Xb3JrYmVuY2hBY3Rpdml0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllcy5XVFBBY3Rpdml0eUJyaWRnZUhlbHBlcjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwgaW1wbGVtZW50cyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciB7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0gbnVsbDsKLQlwcml2YXRlIElBY3Rpdml0eU1hbmFnZXIgYWN0aXZpdHlNYW5hZ2VyID0gbnVsbDsKLQotCXB1YmxpYyBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlckltcGwoKSB7Ci0JCXdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCk7Ci0JCWFjdGl2aXR5TWFuYWdlciA9IHdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5nZXRBY3Rpdml0eU1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVBY3Rpdml0eShTdHJpbmcgYWN0aXZpdHlJRCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCVNldCBlbmFibGVkQWN0aXZpdGllcyA9IGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQkJU2V0IG5ld0VuYWJsZWRBY3Rpdml0aWVzID0gbnVsbDsKLQkJaWYgKGVuYWJsZWQgJiYgIWVuYWJsZWRBY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5SUQpKSB7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQluZXdFbmFibGVkQWN0aXZpdGllcy5hZGRBbGwoZW5hYmxlZEFjdGl2aXRpZXMpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5SUQpOwotCQl9Ci0JCWlmICghZW5hYmxlZCAmJiBlbmFibGVkQWN0aXZpdGllcy5jb250YWlucyhhY3Rpdml0eUlEKSkgewotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJbmV3RW5hYmxlZEFjdGl2aXRpZXMuYWRkQWxsKGVuYWJsZWRBY3Rpdml0aWVzKTsKLQkJCW5ld0VuYWJsZWRBY3Rpdml0aWVzLnJlbW92ZShhY3Rpdml0eUlEKTsKLQkJfQotCQlpZiAobnVsbCAhPSBuZXdFbmFibGVkQWN0aXZpdGllcykgewotCQkJd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LnNldEVuYWJsZWRBY3Rpdml0eUlkcyhuZXdFbmFibGVkQWN0aXZpdGllcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRBY3Rpdml0eUlkcygpIHsKLQkJcmV0dXJuIGFjdGl2aXR5TWFuYWdlci5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkQWN0aXZpdHlJZHMoU2V0IGFjdGl2aXR5SURzKSB7Ci0JCXdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydC5zZXRFbmFibGVkQWN0aXZpdHlJZHMoYWN0aXZpdHlJRHMpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWN0aXZpdHlJRHNGcm9tQ29udHJpYnV0aW9uKGZpbmFsIFN0cmluZyBsb2NhbElELCBmaW5hbCBTdHJpbmcgcGx1Z2luSUQpIHsKLQkJSUlkZW50aWZpZXIgaWRlbnRpZmllciA9IGFjdGl2aXR5TWFuYWdlci5nZXRJZGVudGlmaWVyKFdvcmtiZW5jaEFjdGl2aXR5SGVscGVyLmNyZWF0ZVVuaWZpZWRJZChuZXcgSVBsdWdpbkNvbnRyaWJ1dGlvbigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxJZCgpIHsKLQkJCQlyZXR1cm4gbG9jYWxJRDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJCQlyZXR1cm4gcGx1Z2luSUQ7Ci0JCQl9Ci0JCX0pKTsKLQkJcmV0dXJuIGlkZW50aWZpZXIuZ2V0QWN0aXZpdHlJZHMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBBY3Rpdml0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EwMjIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQWN0aXZpdHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQbHVnaW5Db250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzLklJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSVdvcmtiZW5jaEFjdGl2aXR5U3VwcG9ydDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBBY3Rpdml0eUhlbHBlciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFVJIGlzIHNldCB1cCB0byBmaWx0ZXIgY29udHJpYnV0aW9ucyAoaGFzIGRlZmluZWQgYWN0aXZpdHkgY2F0ZWdvcmllcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRmlsdGVyaW5nKCkgewotCQlyZXR1cm4gIVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZpdHlTdXBwb3J0KCkuZ2V0QWN0aXZpdHlNYW5hZ2VyKCkuZ2V0RGVmaW5lZEFjdGl2aXR5SWRzKCkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxvd1VzZU9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCFpc0ZpbHRlcmluZygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJUGx1Z2luQ29udHJpYnV0aW9uKSB7Ci0JCQlJUGx1Z2luQ29udHJpYnV0aW9uIGNvbnRyaWJ1dGlvbiA9IChJUGx1Z2luQ29udHJpYnV0aW9uKSBvYmplY3Q7Ci0JCQlpZiAoY29udHJpYnV0aW9uLmdldFBsdWdpbklkKCkgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hBY3Rpdml0eVN1cHBvcnQgd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJCQlJSWRlbnRpZmllciBpZGVudGlmaWVyID0gd29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0LmdldEFjdGl2aXR5TWFuYWdlcigpLmdldElkZW50aWZpZXIoY3JlYXRlVW5pZmllZElkKGNvbnRyaWJ1dGlvbikpOwotCQkJCXJldHVybiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlVW5pZmllZElkKElQbHVnaW5Db250cmlidXRpb24gY29udHJpYnV0aW9uKSB7Ci0JCWlmIChjb250cmlidXRpb24uZ2V0UGx1Z2luSWQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRyaWJ1dGlvbi5nZXRQbHVnaW5JZCgpICsgJy8nICsgY29udHJpYnV0aW9uLmdldExvY2FsSWQoKTsKLQkJcmV0dXJuIGNvbnRyaWJ1dGlvbi5nZXRMb2NhbElkKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA1NzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMjMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3dHBjb21tb251aSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlcigpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdF9sb2NhdGlvbl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFzdGVyRGVzY3JpcHRvcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUE9wdGlvbmFsT3BlcmF0aW9uRGF0YU1vZGVsX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3BlcmF0aW9uQWN0aW9uX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQT3B0aW9uYWxPcGVyYXRpb25EYXRhTW9kZWxfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNVUxUSVBMRV9NT0RVTEVfUFJFRl9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElBY3Rpb25XVFBPcGVyYXRpb25fVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXN0ZXJEZXNjcmlwdG9yX0VSUk9SXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQV2l6YXJkX1VJXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJvd3NlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlbmRhYmxlV2l6YXJkX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZW5kZWRXaXphcmRQYWdlX0VSUk9SXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1RQQWN0aW9uRGlhbG9nX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJRdWV1ZV9FUlJPUl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpbWVyX1VJXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGltZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2l6YXJkUGFnZUV4dGVuc2lvbk1hbmFnZXJfVUlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXaXphcmRQYWdlRXh0ZW5zaW9uTWFuYWdlcl9VSV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdpemFyZFBhZ2VFeHRlbnNpb25NYW5hZ2VyX1VJXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX1VJXzA7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBHZW5lcmljQWN0aW9uSWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhYTQ1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dUUEdlbmVyaWNBY3Rpb25JZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBXVFBHZW5lcmljQWN0aW9uSWRzIHsKLQotCVN0cmluZyBDVVQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLkN1dCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09QWSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmdlbmVyaWMuQ29weSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUEFTVEUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLlBhc3RlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5nZW5lcmljLlJlbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZ2VuZXJpYy5EZWxldGUiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9XVFBVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI3Y2I5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV1RQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdUUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX1ZJRVdFUl9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQgPSAiZXh0ZW5kZWRWaWV3ZXIiOyAvLyROT04tTkxTLTEkCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXVFBVSVBsdWdpbiBwbHVnaW47Ci0JLy8gUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdUUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXVFBVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXIoUExVR0lOX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtiZW5jaAotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGludGVybmFsIHRvIHRoZSBqMmVlIHBsdWdpbiBhbmQgbXVzdCBub3QgYmUgY2FsbGVkIGJ5IGFueSBvdGhlciBwbHVnaW5zLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoIGdldFBsdWdpbldvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUnVubmFibGVPcGVyYXRpb25XcmFwcGVyIGdldFJ1bm5hYmxlV2l0aFByb2dyZXNzKGZpbmFsIElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZU9wZXJhdGlvbldyYXBwZXIob3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gV1RQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIFRocm93YWJsZSBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSArICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIElTdGF0dXMgc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coIHN0YXR1cyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBTdHJpbmcgbXNnICkKLSAgICB7Ci0gICAgICAgIGxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkMjlmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIHdoaWNoIGRlbGVnYXRlcyBpdHMgd29yayB0byBhIHJ1bm5hYmxlIHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtzcGFjZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCXByb3RlY3RlZCBMaXN0IGZSdW5uYWJsZXM7Ci0KLQlwdWJsaWMgV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24oSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJc3VwZXIocnVsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VNb2RpZnlDb21wb3NlZE9wZXJhdGlvbihJU2NoZWR1bGluZ1J1bGUgcnVsZSwgTGlzdCBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIocnVsZSk7Ci0JCWZSdW5uYWJsZXMgPSBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKExpc3QgbmVzdGVkUnVubmFibGVzV2l0aFByb2dyZXNzKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSdW5uYWJsZXMgPSBuZXN0ZWRSdW5uYWJsZXNXaXRoUHJvZ3Jlc3M7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gd2hpY2ggd2lsbCBkZWxlZ2F0ZSBpdHMgd29yayB0byB0aGUgZ2l2ZW4gcnVubmFibGUuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIHRoZSBydW5uYWJsZSB0byBkZWxlZ2F0ZSB0byB3aGVuIHRoaXMgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkCi0JICovCi0JcHVibGljIFdvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBuZXN0ZWRPcCkgewotCQlzdXBlcigpOwotCQlnZXRSdW5uYWJsZXMoKS5hZGQobmVzdGVkT3ApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZFJ1bm5hYmxlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBuZXN0ZWRPcCkgewotCQlyZXR1cm4gZ2V0UnVubmFibGVzKCkuYWRkKG5lc3RlZE9wKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSBmUnVubmFibGVzLnNpemUoKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHNpemUpOy8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUnVubmFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSAoSVJ1bm5hYmxlV2l0aFByb2dyZXNzKSBmUnVubmFibGVzLmdldChpKTsKLQkJCW9wLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UnVubmFibGVzKCkgewotCQlpZiAoZlJ1bm5hYmxlcyA9PSBudWxsKQotCQkJZlJ1bm5hYmxlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCXJldHVybiBmUnVubmFibGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhmZTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpL3d0cF91aS9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0JCQlUaGUgV1RQIFdpemFyZCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gYnVpbGQgd2l6YXJkcyBpbiBjb25qdW5jdGlvbiB3aXRoCi0JCQl0aGUgV1RQIE9wZXJhdGlvbiBGcmFtZXdvcmsgcXVpY2tseSBhbmQgd2l0aCBtaW5pbWFsIGVmZm9ydC4KLQkJPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VW5kZXIgQ29uc3RydWN0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogSW1hZ2UgZGVzY3JpcHRpb248L2k+Ci08L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkvd3RwX3VpL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC91aS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxN2E1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aS93dHBfdWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3VpL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotCTxoZWFkPgotCQk8bWV0YQotCQkJbmFtZT0icm9vdCIKLQkJCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQkJPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLQk8L2hlYWQ+Ci0KLQk8Ym9keT4KLQkJPGFic3RyYWN0PgotCQkJVGhlIFdUUCBXaXphcmQgQVBJIGFsbG93cyBjbGllbnRzIHRvIGJ1aWxkIHdpemFyZHMgaW4gY29uanVuY3Rpb24gd2l0aAotCQkJdGhlIFdUUCBPcGVyYXRpb24gRnJhbWV3b3JrIHF1aWNrbHkgYW5kIHdpdGggbWluaW1hbCBlZmZvcnQuCi0JCTwvYWJzdHJhY3Q+Ci0JCTxwPlVuZGVyIENvbnN0cnVjdGlvbi48L3A+Ci0JCTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciIGNhcHRpb249IkltYWdlIGRlc2NyaXB0aW9uIiAvPgotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU5MTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtbm9uX3dvcmtiZW5jaC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI4NWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLWNvbW1vbl9jb3JlLmphcgotY29tbW9uLmphcgotY29tbW9uX2NvcmVzcmMuemlwCi1jb21tb25zcmMuemlwCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFhYjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vcmcuZWNsaXBzZS53dHAuY29tbW9uL2RlYnVnL2xvZ3RyYWNlPWZhbHNlCi1vcmcuZWNsaXBzZS53dHAuY29tbW9uL2RlYnVnL2xvZ3RyYWNlZmlsZT1mYWxzZQotb3JnLmVjbGlwc2Uud3RwLmNvbW1vbi9kZWJ1Zy9sb2dsZXZlbD1XQVJOSU5HClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmNDU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTUwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IE1hciAyNCAwMjowNzoxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2ZDkxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDIucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuYWN0aXZpdGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjQuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMTExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHNyYy1ub25fd29ya2JlbmNoLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1MjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLSAgPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50IiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50Ij4KLSAgICA8dHlwZSBuYW1lPSJDaG9pY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IkVudmlyb25tZW50RXhjZXB0aW9uIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJFbnZpcm9ubWVudFNlcnZpY2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklFbnZpcm9ubWVudCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJTG9nIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklTdGF0dXNIYW5kbGVyIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9Ik51bGxTdGF0dXNIYW5kbGVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTdGF0dXNFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0gCi0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpIj4KLSAgICA8dHlwZSBuYW1lPSJJVVJJIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGYWN0b3J5IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotICAgIDx0eXBlIG5hbWU9IklVUklGaWx0ZXIiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0gICAgPHR5cGUgbmFtZT0iSVVSSVNjaGVtZSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJJVVJJVmlzaXRvciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJTaW1wbGVVUklGYWN0b3J5IiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLSAgICA8dHlwZSBuYW1lPSJVUklFeGNlcHRpb24iIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotICA8L3BhY2thZ2U+Ci0KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbCI+PC9wYWNrYWdlPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZkMjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlcj1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1Db21tb24gRnJhbWV3b3JrcwotT3BlcmF0aW9uRXh0ZW5zaW9uPU9wZXJhdGlvbkV4dGVuc2lvbgotRnVuY3Rpb25fRXh0ZW5zaW9uX0dyb3VwPUZ1bmN0aW9uIEV4dGVuc2lvbiBHcm91cAotV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXI9V1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIKLURhdGFNb2RlbFByb3ZpZGVyPURhdGFNb2RlbFByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjMjA1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Ik9wZXJhdGlvbkV4dGVuc2lvbiIgbmFtZT0iJU9wZXJhdGlvbkV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvT3BlcmF0aW9uRXh0ZW5zaW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZ1bmN0aW9uR3JvdXAiIG5hbWU9IiVGdW5jdGlvbl9FeHRlbnNpb25fR3JvdXAiIHNjaGVtYT0ic2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiIG5hbWU9IiVXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgc2NoZW1hPSJzY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24iIG5hbWU9IiVEYXRhTW9kZWxQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Muc2F2ZUhhbmRsZXIiCi0gICAgICAgICBuYW1lPSJTYXZlIEhhbmRsZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJzYXZlSGFuZGxlciIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUhhbmRsZXJIZWFkbGVzcyI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBrZXk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5FbmFibGVtZW50RGV0ZXJtaW5hdGlvbiIKLSAgICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlciI+Ci0gICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAga2V5PSJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0SGVhZGxlc3MiCi0gICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YzdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmNvbW1vbiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3NyYyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3NyYyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLQotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL0RhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxOTg0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvRGF0YU1vZGVsUHJvdmlkZXJFeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIgaWQ9IkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIiBuYW1lPSJEYXRhIE1vZGVsIFByb3ZpZGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGRhdGEgbW9kZWwgcHJvdmlkZXIgd2l0aCBhIGN1c3RvbSBkYXRhIG1vZGVsIHByb3ZpZGVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJEYXRhTW9kZWxQcm92aWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJEZWZpbmVzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iUHJvdmlkZXJJbXBsZW1lbnRzVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciB0byBleHRlbmQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iUHJvdmlkZXJEZWZpbmVzVHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVyVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdHlwZSB0aGUgZGF0YSBtb2RlbCBwcm92aWRlciBkZWZpbmVzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXJJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZGVudGlmaWVyIGZvciB0aGUgZGVmaW5lZCB0eXBlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IlByb3ZpZGVySW1wbGVtZW50c1R5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlclR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIHR5cGUgdGhlIGRhdGEgbW9kZWwgcHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3ZpZGVySUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgaWRlbnRpZmllciBmb3IgdGhlIGltcGxlbWVudGVkIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL09wZXJhdGlvbkV4dGVuc2lvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmYxZWEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9PcGVyYXRpb25FeHRlbnNpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iT3BlcmF0aW9uRXh0ZW5zaW9uIiBuYW1lPSJPcGVyYXRpb24gRXh0ZW5zaW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgaXMgdGhlIG1ldGhvZG9sb2d5IGZvciBleHRlbmRpbmcgYW4gZXhpc3Rpbmcgb3BlcmF0aW9uIGJ5IGFkZGluZyBlaXRoZXIgYSBwcmUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIHByaW9yLCBvciBhIHBvc3Qgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBvcmlnaW5hbCBvcGVyYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVyYXRpb25FeHRlbnNpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbkV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlT3BlcmF0aW9uQ2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByZS1vcGVyYXRpb24gY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9zdE9wZXJhdGlvbkNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3N0LW9wZXJhdGlvbiBjbGFzcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICByZXF1aXJlZCBpZCBvZiB0aGUgb3BlcmF0aW9uIHRvIGV4dGVuZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zY2hlbWEvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q1MGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9XVFBBY3Rpdml0eUJyaWRnZUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiIGlkPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIgbmFtZT0iV1RQIEFjdGl2aXR5IEJyaWRnZSBIZWxwZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYWN0aXZpdHkgYnJpZGdlIGhlbHBlciB3aGljaCBpcyB1c2VmdWwgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIgY2xhc3MNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NjaGVtYS9mdW5jdGlvbkdyb3VwLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDk1OTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc2NoZW1hL2Z1bmN0aW9uR3JvdXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIiBpZD0iZnVuY3Rpb25Hcm91cCIgbmFtZT0iRnVuY3Rpb24gRXh0ZW5zaW9uIEdyb3VwIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEEgZnVuY3Rpb25Hcm91cCBwcm92aWRlcyBhIGdyb3VwaW5nIG9mIHJlbGF0ZWQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY29udHJpYnV0ZWQgdG8gdGhlIHRvb2xzLiAgRm9yIGV4YW1wbGUsIGEgdGhpcmQgcGFydHkgY29tcG9uZW50IG1heSB3YW50IHRvIGNvbnRyaWJ1dGUgYWN0aW9ucywgZWRpdG9yIHBhZ2VzLCBlZGl0IG1vZGVsIHJlc291cmNlcywgYW5kIG1hbnkgb3RoZXIgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGEgZ2l2ZW4gcHJvZHVjdC4gIEJ5IGFzc29jaWF0aW5nIGFsbCB0aGVzZSBmdW5jdGlvbnMgd2l0aCBhIGdyb3VwIGlkLCBhIG1lY2hhbmlzbSBpcyBleHBvc2VkIGZvciB1c2VycyB0byBzZWxlY3RpdmVseSBlbmFibGUgYW5kIGRpc2FibGUgYmFza2V0cyBvZiBmdW5jdGlvbi4gIEV4dGVuc2lvbiBwb2ludHMgdGhhdCBhbGxvdyBmb3IgYSAmcXVvdDtncm91cElEJnF1b3Q7IGF0dHJpYnV0ZSBnZW5lcmFsbHkgd2lsbCBoaWRlIHRob3NlIGZ1bmN0aW9ucyB3aGVuIHRoZSBncm91cCBpZCBpcyBkaXNhYmxlZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFeHRlbnNpb24gcG9pbnQgZGVmaW5pdGlvbiBmb3IgYSBncm91cC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uR3JvdXBJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZCBmb3IgdGhlIGdyb3VwLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEEgaHVtYW4gcmVhZGFibGUgbmFtZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imljb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgcGF0aCB0byBhbiBpY29uIGltYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdXJsIGZvciB0aGUgZnVuY3Rpb24gZ3JvdXAuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9yZGVyaW5nIG1hZ25pdHVkZSBvZiBwbHVnaW5zDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaXRpYWxpemVyQ2xhc3NOYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIENsYXNzIHVzZWQgdG8gZGV0ZXJtaW5lIHBsdWdpbiBlbmFibGVtZW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmciPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBhbGxvd3Mgb25lIHRvIGJpbmQgZnVuY3Rpb24gZ3JvdXBzIHRvIHBhdHRlcm5zLg0KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb25Hcm91cElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZnVuY3Rpb24gZ3JvdXAgdG8gYmluZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0dGVybiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgcGF0dGVybiB0byBiZSBib3VuZC4gUGF0dGVybnMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2hpY2ggbWF0Y2ggdW5pcXVlIGlkZW50aWZpZXJzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmZ1bmN0aW9uR3JvdXAmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2Z1bmN0aW9uR3JvdXANCi0gICAgICAgICAgICBuYW1lPSZxdW90O0FjbWUgQ28uIEZ1bmN0aW9uIEV4dGVuc2lvbiZxdW90Ow0KLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7VGhlIEFjbWVQcm8gRXh0ZW5zaW9ucyBhZGQgaW50ZWdyYXRpb24gdG8gdGhlIEFjbWUgV2ViIFNlcnZlci4mcXVvdDsNCi0gICAgICAgICAgICBlbmFibGVkQnlEZWZhdWx0PSZxdW90O3RydWUmcXVvdDsNCi0gICAgICAgICAgICBpY29uPSZxdW90Oy4uLiZxdW90Ow0KLSAgICAgICAgICAgIHVybD0mcXVvdDtodHRwOi8vd3d3LmFjbWUuY29tLyZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjLW5vbl93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvbm9udWkvSVdGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyYmFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9JV0ZUV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi0vKioKLSAqIENvbW1vbiBpbnRlcmZhY2UgZm9yIEFyY2hpdmVSdW50aW1lIGFuZCBBcmNoaXZlV3JhcHBlZCBleGNlcHRpb25zLCB3aGljaCBjYW4gY29udGFpbiBuZXN0ZWQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV0ZUV3JhcHBlZEV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKTsKLQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0SW5uZXJNb3N0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotCXB1YmxpYyBqYXZhLmxhbmcuRXhjZXB0aW9uIGdldE5lc3RlZEV4Y2VwdGlvbigpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dGVFdyYXBwZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1OWM5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9XRlRXcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWk7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uZXRvb2xzLndmdC5ubHMuV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXI7Ci0KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNC8wMy8wMSAxMToxMjo1MSBBTSkKLSAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY4ODUwNDQyNzczNzc3ODQ0MjlMOwotCi0JLyoqCi0JICogV0ZUV3JhcHBlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBXRlRXcmFwcGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICovCi0JcHVibGljIFdGVFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuVGhyb3dhYmxlCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgV0ZUV3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0LCBTdHJpbmcgcykgewotCQlzdXBlcih0YXJnZXQsIHMpOwotCX0KLQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAoZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJLy9UT0RPIGFkZCB0aGlzIGJhY2sgaW4KLQkJCS8vIHMucHJpbnRsbihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiCi0JCQlnZXRUYXJnZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCS8vVE9ETyBhZGQgdGhpcyBiYWNrIGluCi0JCQkvLyBzLnByaW50bG4oV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246IgotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy1ub25fd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L25vbnVpL1dvcmtiZW5jaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjYWM3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMtbm9uX3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9ub251aS9Xb3JrYmVuY2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpOwotCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoVXRpbCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gV29ya2JlbmNoUnVubmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBXb3JrYmVuY2hVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHdvcmtiZW5jaElzUnVubmluZygpIC0gdGVzdCB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgcnVubmluZyBpbiB0aGUgd29ya2JlbmNoIGVudmlyb25tZW50LgotCSAqIAotCSAqIEBzZWUgSmF2YVBsdWdpbi5zdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd29ya2JlbmNoSXNSdW5uaW5nKCkgewotCQlyZXR1cm4gV29ya2JlbmNoUnVubmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4gYSBXb3JrYmVuY2ggZW52aXJvbm1lbnQuCi0JICogCi0JICogQHNlZSBKYXZhUGx1Z2luLnN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrYmVuY2hJc1J1bm5pbmcoYm9vbGVhbiBhQm9vbGVhbikgewotCQlXb3JrYmVuY2hSdW5uaW5nID0gYUJvb2xlYW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWIyMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gZm9yIGFuIElEYXRhTW9kZWxPcGVyYXRpb24uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gaW1wbGVtZW50cyBJRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIElTdGF0dXMuT0suCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCB1c2VkIGJ5IHRoaXMgSURhdGFNb2RlbE9wZXJhdGlvbgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuaWQgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDb25zdHJ1Y3RvciB0YWtpbmcgYW4gSURhdGFNb2RlbAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gZHJpdmUgdGhpcyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQgLy8gVE9ETyBhZGQgYSBsYWJlbCBwcm9wZXJ0eSB0byBJRGF0YU1vZGVsPz8/Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5pZCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc2V0SUQoKS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jc2V0SUQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXRJRCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHNldERhdGFNb2RlbCgpCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbE9wZXJhdGlvbiNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBnZXREYXRhTW9kZWwoKQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0RGF0YU1vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGdldFNjaGVkdWxpbmdSdWxlKCkgcmV0dXJucwotCSAqIDxjb2RlPlJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0U2NoZWR1bGluZ1J1bGUoKQotCSAqLwotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSByZXR1cm5zCi0JICogPGNvZGU+SVdvcmtzcGFjZS5BVk9JRF9VUERBVEU8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxPcGVyYXRpb24jZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSB7Ci0JCXJldHVybiBJV29ya3NwYWNlLkFWT0lEX1VQREFURTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZnJhbWV3b3JrIHdpbGwgc2V0IHRoZSBlbnZpcm9ubWVudCBvbiB0aGlzIG9wZXJhdGlvbiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuIFRoZSBvcGVyYXRpb24KLQkgKiBjYW4gdGhlbiB1c2UgdGhlIGVudmlyb25tZW50IHRvIHJlcG9ydCBzdGF0dXMsIGxvZyBpbmZvcm1hdGlvbiwgYW5kIGFjY2VzcyByZXNvdXJjZXMgaW4gYW4KLQkgKiBlbnZpcm9ubWVudCBuZXV0cmFsIHdheS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVudgotCSAqICAgICAgICAgICAgdGhlIGVudmlyb25tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEVudmlyb25tZW50KElFbnZpcm9ubWVudCBlbnYpIHsKLQkJZW52aXJvbm1lbnQgPSBlbnY7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQW4gb3BlcmF0aW9uIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgZW52aXJvbm1lbnQgdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIG9wZXJhdGlvbnMKLQkgKiBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyBhbiBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSUVudmlyb25tZW50IGdldEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZW52aXJvbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiByZWRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRGVmYXVsdCBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB1bmRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2YzMzAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0Fic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogPHA+Ci0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SURhdGFNb2RlbFByb3ZpZGVyPC9jb2RlPi4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEhhc2hTZXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGluaXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCX0KLQotCS8qKgotCSAqIDwvcD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIHNldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNzZXREYXRhTW9kZWwoSURhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbiBpbXBsZW1lbmF0aW9uIG9mIGdldERhdGFNb2RlbCgpLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCi0JLyoqCi0JICogPC9wPgotCSAqIEEgZGVmYXVsdCBpbXBsZW5lYXRpb24gb2YgcHJvcGVydHlTZXQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBoYXMgYmVlbiBzZXQKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXREZWZhdWx0UHJvcGVydHkoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmKEFMTE9XX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmKFJFU1RSSUNUX0VYVEVOU0lPTlMuZXF1YWxzKHByb3BlcnR5TmFtZSkpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgaXNQcm9wZXJ0eUVuYWJsZWQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgdmFsaWRhdGUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIG5lc3RlZCBJRGF0YU1vZGVsIGJlaW5nIHZhbGlkYXRlZC4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShTdHJpbmcpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMKLQkgKiBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGRlZmF1bHQgaW1wbGVtZW5hdGlvbiBvZiBnZXRFeHRlbmRlZENvbnRleHQoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRFeHRlbmRlZENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZ2V0RGVmYXVsdE9wZXJhdGlvbigpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZGVmYXVsdCBpbXBsZW1lbmF0aW9uIG9mIGdldE5hbWUoKS4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXRJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBkZWZhdWx0IGltcGxlbWVuYXRpb24gb2YgZGlzcG9zZSgpLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgcHJvcGVydHkgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgYm9vbGVhbiBwcm9wZXJ0eSBvbiB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpIHsKLQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIGFuIGludCBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgaW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2V0dGluZyBhbiBpbnQgcHJvcGVydHkgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGludCBwcm9wZXJ0eSB2YWx1ZQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRJbnRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgcHJvcGVydHlWYWx1ZSkgewotCQltb2RlbC5zZXRJbnRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyBhIFN0cmluZyBwcm9wZXJ0eSBmcm9tIHRoZSBiYWNraW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgaWYgYSBwcm9wZXJ0eSBpcyBzZXQgZnJvbSB0aGUgYmFja2luZyBJRGF0YU1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3BlcnR5IGlzIHNldCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJiMGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBjb21tdW5pY2F0ZSBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20gSURhdGFNb2RlbHMgdG8gdGhlaXIgSURhdGFNb2RlbExpc3RlbmVycy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWwjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxFdmVudCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZsYWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0NIRyA9IDE7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbC4gQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hHID0gMjsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgZmxhZyB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5J3MgZW5hYmxtZW50IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldEZsYWcoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9DSEcgPSAzOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBmbGFnIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkncyB2YWxpZCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWwjZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZykKLQkgKiBAc2VlICNnZXRGbGFnKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRF9WQUxVRVNfQ0hHID0gNDsKLQotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JcHJpdmF0ZSBpbnQgZmxhZzsKLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnN0cnVjdG9yIGZvciBEYXRhTW9kZWxFdmVudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eQotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICBjb250YWlucyBhIGZsYWcgc3BlY2lmaXlpbmcgdGhlIGV2ZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsRXZlbnQoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5mbGFnID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJRGF0YU1vZGVsIHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4gVmFsaWQgdHlwZXMgYXJlOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+UFJPUEVSVFlfQ0hHPC9jb2RlPjwvbGk+Ci0JICogPGxpPjxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+PC9saT4KLQkgKiA8bGk+PGNvZGU+RU5BQkxFX0NIRzwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgZXZlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZsYWcoKSB7Ci0JCXJldHVybiBmbGFnOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwncyBwcm9wZXJ0eS4gVGhpcyBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxjb2RlPmdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCdzIHByb3BlcnR5LgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gdGhlIElEYXRhTW9kZWwgcHJvcGVydHkncyBlbmFibGVtZW50IHN0YXRlLiBUaGlzIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eUVuYWJsZWQoZ2V0UHJvcGVydHlOYW1lKCkpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZGF0YU1vZGVsIHByb3BlcnR5J3MgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKiBAc2VlIElEYXRhTW9kZWwjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJldHVybiB0aGUgSURhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLiBUaGlzIGlzCi0JICogZXF1YXZhbGVudCB0bzogPGNvZGU+Z2V0RGF0YU1vZGVsKCkuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKGdldFByb3BlcnR5TmFtZSgpKTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGFNb2RlbCBwcm9wZXJ0eSdzIHZhbGlkIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIEBzZWUgSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBkYXRhTW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2IwNzMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0RhdGFNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbEV4dGVuc2lvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbEltcGw7Ci0KLS8qKgotICogPHA+Ci0gKiBEYXRhTW9kZWxGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIElEYXRhTW9kZWwgaW5zdGFuY2VzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlciByZWFkZXI7Ci0KLQlwcml2YXRlIERhdGFNb2RlbEZhY3RvcnkoKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogTG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIElEYXRhTW9kZWxQcm92aWRlciBieSB0aGUgc3BlY2lmaWVkIGlkIGFuZCBjb25zdHJ1Y3RzIGEgbmV3Ci0JICogSURhdGFNb2RlbC4gSWYgdGhlIElEYXRhTW9kZWxQcm92aWRlciBpcyBub3QgZm91bmQgdGhlbiBhIFJ1bnRpbWVFeGNlcHRpb24gaXMgbG9nZ2VkIGFuZCBudWxsCi0JICogaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkYXRhTW9kZWxQcm92aWRlcklECi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIElEYXRhTW9kZWxQcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoU3RyaW5nIGRhdGFNb2RlbFByb3ZpZGVySUQpIHsKLQkJSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbG9hZFByb3ZpZGVyKGRhdGFNb2RlbFByb3ZpZGVySUQpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRGF0YU1vZGVsUHJvdmlkZXIgbG9hZFByb3ZpZGVyKFN0cmluZyBpZCkgewotCQlpZiAobnVsbCA9PSByZWFkZXIpIHsKLQkJCXJlYWRlciA9IG5ldyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyLmdldFByb3ZpZGVyKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb29rcyB1cCB0aGUgYXBwcm9wcmlhdGUgZGF0YU1vZGVsUHJvdmlkZXJJRHMgYnkgdGhlIHNwZWNpZmllZCBkYXRhTW9kZWxQcm92aWRlcktpbmRJRC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbFByb3ZpZGVyS2luZElECi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIGlkIG9mIHRoZSBkYXRhTW9kZWxQcm92aWRlcktpbmRJRAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHZhbGlkIGRhdGFNb2RlbFByb3ZpZGVySURzIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZSBub25lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RGF0YU1vZGVsUHJvdmlkZXJJRHNGb3JLaW5kKFN0cmluZyBkYXRhTW9kZWxQcm92aWRlcktpbmRJRCkgewotCQlTdHJpbmdbXSB2YWxpZFByb3ZpZGVySURzID0gbG9hZFByb3ZpZGVyRm9yUHJvdmlkZXJLaW5kKGRhdGFNb2RlbFByb3ZpZGVyS2luZElEKTsKLQkJcmV0dXJuIG51bGwgIT0gdmFsaWRQcm92aWRlcklEcyA/IHZhbGlkUHJvdmlkZXJJRHMgOiBuZXcgU3RyaW5nWzBdOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbG9hZFByb3ZpZGVyRm9yUHJvdmlkZXJLaW5kKFN0cmluZyBwcm92aWRlcktpbmQpIHsKLQkJaWYgKG51bGwgPT0gcmVhZGVyKSB7Ci0JCQlyZWFkZXIgPSBuZXcgRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlci5nZXRQcm92aWRlckRlc2NyaXB0b3JzRm9yUHJvdmlkZXJLaW5kKHByb3ZpZGVyS2luZCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQnVpbGRzIGFuIHtAbGluayBJRGF0YU1vZGVsfSB1c2luZyB0aGUgc3BlY2lmaWVkIENsYXNzLiBUaGlzIENsYXNzIHdpbGwKLQkgKiBub3JtYWxseSBiZSBhIHN1YiBpbnRlcmZhY2Ugb2Yge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS4gSWYgdGhlCi0JICogQ2xhc3MgaXQgaXMgYW4ge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfS5jbGFzcyB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBhdHRlbXB0IHRvIHVzZSB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzI19wcm92aWRlcl9jbGFzc30gZmllbGQgdG8KLQkgKiBsb2FkIHRoZSB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSB3aXRoIHdoaWNoIHRvIGJhY2sgdGhlCi0JICoge0BsaW5rIElEYXRhTW9kZWx9LiBJZiB0aGlzIGZhaWxzLCBvciBpZiB0aGUgQ2xhc3MgaXMgbm90IGFuIGludGVyZmFjZSwKLQkgKiB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG8KLQkgKiA8Y29kZT5jcmVhdGVEYXRhTW9kZWwoYUNsYXNzLmdldE5hbWUoKSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUNsYXNzCi0JICogICAgICAgICAgICBhbiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9LmNsYXNzIG9yIHRoZSBjbGFzcyB3aG9zZSBuYW1lCi0JICogICAgICAgICAgICBpcyB0aGUgaWQgb2YgdGhlIElEYXRhTW9kZWxQcm92aWRlcgotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoQ2xhc3MgYUNsYXNzKSB7Ci0JCWlmKGFDbGFzcy5pc0ludGVyZmFjZSgpKXsKLQkJCQl0cnl7Ci0JCQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKWFDbGFzcy5nZXRGaWVsZCgiX3Byb3ZpZGVyX2NsYXNzIikuZ2V0KG51bGwpOwotCQkJCQlpZihjbGF6eiAhPSBudWxsKXsKLQkJCQkJCUlEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IChJRGF0YU1vZGVsUHJvdmlkZXIpY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCQkJCXJldHVybiBjcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZTsgdGhlIGludGVyZmFjZSBtYXkgbm90IGhhdmUgZGVmaW5lZCB0aGUgZmllbGQgYW5kIGlzIHJlbHlpbmcgb24gZXh0ZW5zaW9ucy4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gIAotCQl9Ci0JCXJldHVybiBjcmVhdGVEYXRhTW9kZWwoYUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBJRGF0YU1vZGVsIHVzaW5nIHRoZSB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIG9mIGFuIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyCi0JICogQHJldHVybiBhIG5ldyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbChJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKG51bGwgPT0gcHJvdmlkZXIpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gbmV3IERhdGFNb2RlbEltcGwocHJvdmlkZXIpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NGVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHByb3ZpZGVzIGEgaHVtYW4gcmVhZGlibGUgZGVzY3JpcHRpb24gZm9yIGFuIElEYXRhTW9kZWwKLSAqIHByb3BlcnR5VmFsdWUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgewotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGluIHRoZSBhcnJheSwgYSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBpcyBjcmVhdGVkCi0JICogdXNpbmcgPGNvZGU+bmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnModmFsdWVzW2ldKTs8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9ycyBhcnJheQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlRGVzY3JpcHRvcnMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmIChudWxsID09IHZhbHVlcykgewotCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCX0KLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW3ZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmFsdWVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzLiBJZgotCSAqIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiBhIDAgbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgZm9yCi0JICogZWFjaCA8Y29kZT52YWx1ZXNbaV08L2NvZGU+IGFuZCA8Y29kZT5kZXNjcmlwdGlvbnNbaV08L2NvZGU+IGluIHRoZSBhcnJheXMsIGEgbmV3Ci0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgdXNpbmcKLQkgKiA8Y29kZT5uZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTs8L2NvZGU+LiBCb3RoIGFycmF5cwotCSAqIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9ucwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHByb3BlcnR5IGRlc2NyaXB0aW9ucyBjb29yZXNwb25kaW5nIHRoZSB2YWx1ZXMgYXJyYXkKLQkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVEZXNjcmlwdG9ycyhPYmplY3RbXSB2YWx1ZXMsIFN0cmluZ1tdIGRlc2NyaXB0aW9ucykgewotCQlpZiAobnVsbCA9PSB2YWx1ZXMpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQl9Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlc1tpXSwgZGVzY3JpcHRpb25zW2ldKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBwcm9wZXJ0eVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGVxdWF2YWxlbnQgdG8gY2FsbGluZyA8Y29kZT5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlWYWx1ZSwgbnVsbCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5VmFsdWUgYW5kCi0JICogcHJvcGVydHlEZXNjcmlwdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotCSAqIEBwYXJhbSBwcm9wZXJ0eURlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgaHVtYW4gcmVhZGlibGUgcHJvZXBydHkgZGVzY3JpcHRpb25GCi0JICovCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgcHJvcGVydHlWYWx1ZSwgU3RyaW5nIHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQkJdGhpcy5wcm9wZXJ0eURlc2NyaXB0aW9uID0gcHJvcGVydHlEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbi4gSWYgYSBub24gbnVsbCBkZXNjcmlwdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQsCi0JICogdGhlbiBpdCB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSB2YWx1ZSdzIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHdpbGwgYmUKLQkgKiByZXR1cm5lZCBpZiBpdCBpcyBub3QgbnVsbC4gT3RoZXJ3aXNlIHRoZSBlbXB0eSBTdHJpbmcgKDxjb2RlPiIiPC9jb2RlPikgd2lsbCBiZQotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIG5ldmVyIGJlIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBodW1hbiByZWFkaWJsZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbiwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChudWxsICE9IHByb3BlcnR5RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBwcm9wZXJ0eURlc2NyaXB0aW9uOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlKSA/IHByb3BlcnR5VmFsdWUudG9TdHJpbmcoKSA6IG51bGw7Ci0JCXJldHVybiAobnVsbCAhPSBzdHIpID8gc3RyIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzFjNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIHRoZSBjb3JlIHBpZWNlIG9mIGEgZnJhbWV3b3JrIHVzZWQgdG8gc2ltcGxpZnkgZGF0YSBjb2xsZWN0aW9uLCBvcGVyYXRpb24KLSAqIGV4ZWN1dGlvbiwgYW5kIFdpemFyZCBnZW5lcmF0aW9uLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBhcmUgcHJpbWFyaWx5IGFuIGludGVsbGlnZW50IG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgZGF0YS4gRWFjaCBJRGF0YU1vZGVsIHRyYWNrcwotICogc3BlY2lmaWMgT2JqZWN0cyBrbm93biBhcyAicHJvcGVydGllcyIuIEVhY2ggcHJvcGVydHkgbWF5IGJlIHNldCBvciBnZXQgdXNpbmcgaXRzIHByb3BlcnR5IG5hbWUuCi0gKiBBIENvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgZm9yIGFuIElEYXRhTW9kZWwgaW5zdGFuY2UgbWF5IGJlIHJldHJlaXZlZCB1c2luZwotICogPGNvZGU+Z2V0QWxsUHJvcGVydGllcygpPC9jb2RlPi4gSW4gYWRkaXRpb24gdG8gZ2V0dGluZy9zZXR0aW5nIHByb3BlcnRpZXMsIElEYXRhTW9kZWxzIG1heQotICogYWxzbyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciB1bnNldCBwcm9wZXJ0aWVzLCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdG9ycyBmb3IgcHJvcGVydGllcywKLSAqIGVudW1lcmF0aW9ucyBvZiB2YWxpZCBwcm9wZXJ0eSB2YWx1ZXMsIHZhbGlkYXRpb24gZm9yIHByb3BlcnRpZXMsIGFuZCBlbmFibGVtZW50IGZvciBwcm9wZXJ0aWVzLgotICogPC9wPgotICogPHA+Ci0gKiBJRGF0YU1vZGVscyBtYXkgYWxzbyBiZSBuZXN0ZWQgKGFuZCB1bm5lc3RlZCkgcmVjdXJzaXZlbHkgd2l0aGluIGFub3RoZXIuIFdoZW4gb25lIElEYXRhTW9kZWwgaXMKLSAqIG5lc3RlZCB3aXRoaW4gYW5vdGhlciwgdGhlbiBjbGllbnQgY29kZSBtYXkgYWNjZXNzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBmb3JtZXIgdGhyb3VnaCB0aGUKLSAqIGxhdHRlci4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHRoZSBzYW1lIElEYXRhTW9kZWwgKHRyYWNraW5nIHRoZSBzYW1lIHByb3BlcnRpZXMpIG1heSBiZQotICogdXNlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2Ygc2V2ZXJhbCBkaWZmZXJlbnQgYnJvYWRlciBzY2VuYXJpb3MuIE5lc3RpbmcgbWF5IGFwcGx5IHRvIGFueQotICogSURhdGFNb2RlbCwgYW5kIG1heSBiZSBhYml0cmFyeWx5IGRlZXAgKGV2ZW4gY3lsaWNhbCBpZiB5b3UgZGFyZSkuIE5lc3Rpbmcgb2ZmZXJzIGZsZXhpYmlsaXR5LAotICogZXNwZWNpYWxseSBmb3IgZXh0ZW5zaW9uIGJ5IDNyZCBwYXJ0eSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBFYWNoIElEYXRhTW9kZWwgbWF5IGFsc28gc3VwcGx5IGFuIElEYXRhTW9kZWxPcGVyYXRpb24gKGEgc3ViY2xhc3Mgb2YKLSAqIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24pIGZvciBleGVjdXRpb24uIFdoZW4gZXhlY3V0ZWQgd2l0aGluIHRoZQotICogSURhdGFNb2RlbCBmcmFtZXdvcmsgYWxsIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGluaGVyZW50bHkgYW5kIGFiaXRyYXJpbHkgZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogRWFjaCBJRGF0YU1vZGVsIG1heSBhbHNvIGluZGlyZWN0bHkgc3VwcGx5IGEgRGF0YU1vZGVsV2l6YXJkLiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lY2Vzc2FyeSB0bwotICogc3BpbHQgVUkgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGNvcmUgSURhdGFNb2RlbCBmcmFtZXdvcmsuIERhdGFNb2RlbFdpemFyZHMgYXJlIGFsc28gaW5oZXJlbnRseQotICogZXh0ZW5kYWJsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSURhdGFNb2RlbHMgYXJlIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIHJhdGhlciB0aGV5IGFyZSBidWlsdCBmcm9tIGFuCi0gKiBJRGF0YU1vZGVsUHJvdmlkZXIuIENsaWVudHMgd2lzaGluZyB0byBkZWZpbmUgdGhlaXIgb3duIElEYXRhTW9kZWwgbXVzdCBkbyBzbyBieSBpbXBsZW1lbnRpbmcgYW4KLSAqIElEYXRhTW9kZWxQcm92aWRlci4gQ2xpZW50cyB3aXNoaW5nIHRvIHV0aWxpemUgYW4gSURhdGFNb2RlbCBtdXN0IGNyZWF0ZSBpdCB1c2luZyB0aGUKLSAqIERhdGFNb2RlbEZhY3Rvcnkgd2l0aCB0aGUgYXNzb2NpYXRlZCBJRGF0YU1vZGVsUHJvdmlkZXIuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBJRCB3aGljaCBpZGVudGlmaWVzIHRoaXMgSURhdGFNb2RlbCBpbnN0YW5jZS4gVGhlIHNhbWUgSUQgc2hvdWxkIGJlIHVzZWQKLQkgKiBieSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LCB0aGUKLQkgKiBEYXRhTW9kZWxXaXphcmQgKGlmIGFueSkgZm9yIGNsaWVudHMgdG8gZXh0ZW5kIG9yIGluc3RhbnRpYXRlIGRpcmVjdGx5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhIGhhc2hjb2RlLiBNdWx0aXBsZSBJRGF0YU1vZGVsIGluc3RhbmNlcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUKLQkgKiBJRGF0YU1vZGVsUHJvdmlkZXIgdHlwZSB3aWxsIGFsbCBoYXZlIHRoZSBzYW1lIElELgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldElEKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgSUQgZm9yIHRoaXMgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHRvIGV4ZWN1dGUgYWdhaW5zdCB0aGlzIElEYXRhTW9kZWwuIFRoZSByZXR1cm5lZCBvcGVyYXRpb24gaXMKLQkgKiBkZXJpdmVkIGZyb20gdGhlIG9wZXJhdGlvbiBzdXBwbGllZCBieSB0aGUgYmFja2luZyBJRGF0YU1vZGVsUHJvdmlkZXIuIFRoZSByZXR1cm5lZCB0eXBlIGlzCi0JICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gd2hpY2ggYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHJldHVybmVkCi0JICogSURhdGFNb2RlbE9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgcGVydGFpbnMgdG8gSURhdGFNb2RlbHMgZm9yIGV4dGVkZW5kZWQgb3BlcmF0aW9ucy4gVGhlIHJldHVybmVkIGV4dGVuZGVkCi0JICogY29udGV4dCBpcyB1c2VkIGJ5IHRoZSBJRGF0YU1vZGVsT3BlcmF0aW9uIGZyYW1ld29yayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIKLQkgKiBleHRlbmRlZCBvcGVyYXRpb24gc2hvdWxkIGV4ZWN1dGUuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHNob3VsZCBjb250YWluIE9iamVjdHMgYWRhcHRhYmxlIHRvCi0JICogSVByb2plY3QuIFRoaXMgSURhdGFNb2RlbCdzIGZ1bmN0aW9uIGdyb3VwcyBhcmUgbG9va2VkIHVwIHRocm91Z2ggdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20uIElmCi0JICogYSBmdW5jdGlvbiBncm91cCBpcyBkZWZpbmVkLCBpdCBpcyBmaXJzdCBjaGVja2VkIGZvciBlbmFibGVtZW50LiBUaGVuIGVhY2ggYWRhcHRlZCBJUHJvamVjdAotCSAqIGlzIGluc3BlY3RlZCB0byB2ZXJpZnkgaXQgaGFuZGxlcyB0aGUgZnVuY3Rpb24gZ3JvdXAuIElmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBtZXQsIHRoZW4KLQkgKiB0aGUgZXh0ZW5kZWQgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElEYXRhTW9kZWwgaXMgZXhlY3V0ZWQ7IG90aGVyd2lzZSBpdCBpcyBza2lwcGVkLgotCSAqIElmIG5vIGZ1bmN0aW9uIGdyb3VwIGlzIGRlZmluZWQsIG9yIG5vIGV4dGVuZGVkIGNvbnRleHQgaXMgZGVmaW5lZCAoaS5lLiB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogYW4gZW1wdHkgbGlzdCwgb3IgdGhlIG9iamVjdHMgaW4gdGhlIHJldHVybmVkIGxpc3QgYXJlIG5vdCBhZGFwdGFibGUgdG8gSVByb2plY3QpIHRoZW4gdGhlCi0JICogZXh0ZW5kZWQgb3BlcmF0aW9uIHdpbGwgZXhlY3V0ZSAoaXQgd2lsbCBuZXZlciBiZSBza2lwcGVkKS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBjbGllbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgTGlzdCBvZiBPYmplY3RzIGFkYXB0YWJsZSB0byBJUHJvamVjdAotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI2dldEV4dGVuZGVkQ29udGV4dCgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIG5vdCBhIHByb3BlcnR5IHRoZW4gYSBSdW50aW1lRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBCZWZvcmUgdGhlIHByb3BlcnR5IGlzIHJldHVybmVkLCBmaXJzdCB0aGUgb3duaW5nIElEYXRhTW9kZWwgbXVzdCBiZSBsb2NhdGVkLiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIGlzIGEgYmFzZSBwcm9wZXJ0eSB7QGxpbmsgI2lzQmFzZVByb3BlcnR5KFN0cmluZyl9LCB0aGVuIHRoaXMKLQkgKiBJRGF0YU1vZGVsIGlzIHRoZSBvd25lci4gT3RoZXJ3aXNlLCBhIHJlY3Vyc2l2ZSBzZWFyY2ggdGhyb3VnaCB0aGUgbmVzdGVkIElEYXRhTW9kZWxzIGlzCi0JICogY29uZHVjdGVkIHRvIGxvY2F0ZSB0aGUgb3duaW5nIElEYXRhTW9kZWwuIElmIG1vcmUgdGhhbiBvbmUgbmVzdGVkIElEYXRhTW9kZWwgZGVmaW5lcyB0aGUKLQkgKiBwcm9wZXJ0eSwgdGhlbiB0aGUgZmlyc3Qgb25lIGxvY2F0ZWQgaXMgY29uc2lkZXJlZCB0aGUgb3duaW5nIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE9uY2UgdGhlIG93bmluZyBJRGF0YU1vZGVsIGlzIGZvdW5kIHRoZSBwcm9wZXJ0eSBpcyBjaGVja2VkIHRvIHNlZSBpZiBpdCBpcyBzZXQKLQkgKiB7QGxpbmsgI2lzUHJvcGVydHlTZXQoU3RyaW5nKX0uIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBzZXQgdmFsdWUgaXMgcmV0dXJuZWQuIElmIHRoZQotCSAqIHByb3BlcnR5IGlzIG5vdCBzZXQsIGl0cyBkZWZhdWx0IGlzIHJldHVybmVkIHtAbGluayAjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGVyZSBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZ2V0dGluZyBwcmltaXRpdmUgPGNvZGU+aW50PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB0eXBlcyBhcyB3ZWxsIGFzIFN0cmluZ3MuCi0JICogPHVsPgotCSAqIDxsaT57QGxpbmsgI2dldEludFByb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI2dldFN0cmluZ1Byb3BlcnR5KFN0cmluZyl9PC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5Ci0JICogCi0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNnZXRJbnRQcm9wZXJ0eShTdHJpbmcpCi0JICogQHNlZSAjZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQW4gSURhdGFNb2RlbCBpbXBsZW1lbnRvciBkZWZpbmVzIHRoaXMgaW4gSURhdGFNb2RlbFByb3ZpZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgaW50cy4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCB0aGVuIHRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQKLQkgKiB0bzoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+KChJbnRlZ2VyKWdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpLmludFZhbHVlKCk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT4tMTwvY29kZT4gaXMgcmV0dXJuZWQgaWYgYSBjYWxsIHRvIGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIGludCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgYm9vbGVhbnMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPigoQm9vbGVhbilnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKS5ib29sZWFuVmFsdWUoKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBpZiBhIGNhbGwgdG8gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIFN0cmluZ3MuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdGhlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGVxdWF2YWxlbnQgdG86Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPihTdHJpbmcpZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+IiI8L2NvZGU+IGlzIHJldHVybmVkIGlmIGEgY2FsbCB0byBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBzZWUgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlOYW1lIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlWYWx1ZS4gU3Vic2VxdWVudCBjYWxscyB0bwotCSAqIHtAbGluayAjZ2V0UHJvcGVydHkoU3RyaW5nKX0gd2lsbCByZXR1cm4gdGhlIHNhbWUgcHJvcGVydHlWYWx1ZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBhIHByb3BlcnR5VmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzZXQsIHRoZW4gdGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQKLQkgKiAic2V0IiAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eVNldChTdHJpbmcpfSksIGNvbnZlcnNseSwgYSBwcm9wZXJ0eVZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaXMgY29uc2lkZXJlZCAidW5zZXQiLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5TmFtZSBpcyBub3QgYSBwcm9wZXJ0eSAoc2VlIHtAbGluayAjaXNQcm9wZXJ0eShTdHJpbmcpfSkgdGhlbiBhCi0JICogUnVudGltZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlcmUgYXJlIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHNldHRpbmcgcHJpbWl0aXZlIDxjb2RlPmludDwvY29kZT4gYW5kCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdHlwZXMgYXMgd2VsbCBhcyBTdHJpbmdzLgotCSAqIDx1bD4KLQkgKiA8bGk+e0BsaW5rICNzZXRJbnRQcm9wZXJ0eShTdHJpbmcsIGludCl9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNzZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nLCBib29sZWFuKX08L2xpPgotCSAqIDxsaT57QGxpbmsgI3NldFN0cmluZ1Byb3BlcnR5KFN0cmluZywgU3RyaW5nKX08L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgbWF5IGRlZmluZSBhZGRpdGlvbmFsIHBvc3Qgc2V0IGxvZ2ljIGluCi0JICoge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlciNwcm9wZXJ0eVNldChTdHJpbmcsIE9iamVjdCl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5Ci0JICogCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHlTZXQoU3RyaW5nKQotCSAqIEBzZWUgI2lzUHJvcGVydHkoU3RyaW5nKQotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3Byb3BlcnR5U2V0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGludHMuIFRoaXMgbWV0aG9kIGlzIGVxdWF2YWxlbnQgdG86Ci0JICogPHA+Ci0JICogPGNvZGU+c2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihwcm9wZXJ0eVZhbHVlKSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHNlZSAjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpCi0JICogQHNlZSAjZ2V0SW50UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBwcm9wZXJ0eVZhbHVlKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGJvb2xlYW5zLiBUaGlzIG1ldGhvZCBpcyBlcXVhdmFsZW50IHRvOgotCSAqIDxwPgotCSAqIDxjb2RlPnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgKHZhbHVlKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRCb29sZWFuUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHNldHRpbmcgU3RyaW5ncy4gVGhpcyBtZXRob2QgaXMgZXF1YXZhbGVudCB0bzoKLQkgKiA8cD4KLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOzwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAc2VlICNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCkKLQkgKiBAc2VlICNnZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBuZXN0IHRoZSBzcGVjaWZpZWQgSURhdGFNb2RlbCB3aXRoaW4gdGhpcyBJRGF0YU1vZGVsLiBUaGUKLQkgKiA8Y29kZT5uZXN0ZWRNb2RlbE5hbWU8L2NvZGU+IGFyZ3VtZW50IHNob3VsZCBiZSBhIHVuaXF1ZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhpcyBwYXJ0aWN1bGFyCi0JICogbmVzdGVkIElEYXRhTW9kZWwuIFRoZSBzYW1lIFN0cmluZyBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdXNpbmcKLQkgKiBlaXRoZXIge0BsaW5rICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpfSBvciB7QGxpbmsgI3JlbW92ZU5lc3RlZE1vZGVsKFN0cmluZyl9LiBJZiB0aGUKLQkgKiBzcGVjaWZpZWQgbmVzdGVkIElEYXRhTW9kZWwgaGFzIGFscmVhZHkgYmVlbiBuZXN0ZWQgdW5kZXIgdGhpcyBJRGF0YU1vZGVsIG9yIGl0IGlzIHRoZSBzYW1lCi0JICogaW5zdGFuY2UgYXMgdGhpcyBJRGF0YU1vZGVsLCB0aGVuIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5lc3RlZE1vZGVsTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqICAgICAgICAgICAgdGhlIElEYXRhTW9kZWwgdG8gYmUgbmVzdGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmVzdGluZyB3YXMgc3VjY2Vzc2Z1bCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNnZXROZXN0ZWRNb2RlbChTdHJpbmcpCi0JICogQHNlZSAjcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZE5lc3RlZE1vZGVsKFN0cmluZyBuZXN0ZWRNb2RlbE5hbWUsIElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5lc3RlZE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gcmVtb3ZlLgotCSAqIEByZXR1cm4gdGhlIElEYXRhTW9kZWwgcmVtb3ZlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG5lc3RlZCBtb2RlbCBkb2VzIG5vdCBleGlzdCBvcgotCSAqICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGlzIG51bGwuCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nIG5lc3RlZE1vZGVsTmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmVzdGVkTW9kZWxOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbmVzdGVkIElEYXRhTW9kZWwgdG8gY2hlY2suCi0JICogQHJldHVybiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbmVzdGVkIG1vZGVsIGV4aXN0cyAoYXQgdGhlIHRvcCBsZXZlbCBvbmx5KSB3aXRoIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIG5hbWUgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG5lc3RlZCBJRGF0YU1vZGVsIGlkZW50aWZpZWQgdGhlIGJ5IHRoZSBzcGVjaWZpZWQgbmFtZS4gQSBSdW50aW1lRXhjZXB0aW9uIGlzCi0JICogdGhyb3duIGlmIHRoZXJlIGlzIG5vIHN1Y2ggbmVzdGVkIElEYXRhTW9kZWwgKGkuZS4gaXNOZXN0ZWRNb2RlbCgpIHdvdWxkIHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXN0ZWRNb2RlbE5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCB0byBnZXQuCi0JICogQHJldHVybiB0aGUgbmVzdGVkIElEYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChTdHJpbmcgbmVzdGVkTW9kZWxOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBDb2xsZWN0aW9uIG9mIGFsbCBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5lc3RlZE1vZGVscygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RlZCBJRGF0YU1vZGVscyBuYW1lcywgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGVkIElEYXRhTW9kZWxzIG5hbWVzLCBvciBhbiBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIG5lc3RpbmcgKHRoZSBpbnZlcnNlIG9mIG5lc3RlZCkgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgbmVzdGluZyAodGhlIGludmVyc2Ugb2YgbmVzdGVkKSBJRGF0YU1vZGVscywgb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0aW5nTW9kZWxzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgYmFzZSBwcm9wZXJ0aWVzIChub3QgaW5jbHVkaW5nIG5lc3RlZCBwcm9wZXJ0aWVzKSwgb3IgYW4gZW1wdHkKLQkgKiBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIGFsbCBiYXNlIHByb3BlcnRpZXMgKG5vdCBpbmNsdWRpbmcgbmVzdGVkIHByb3BlcnRpZXMpLCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiByZWN1cnNpdmVseSBuZXN0ZWQgSURhdGFNb2RlbHMsIG9yIGFuIGVtcHR5Ci0JICogICAgICAgICBDb2xsZWN0aW9uIGlmIG5vbmUgZXhpc3QuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqIGdldE5lc3RlZFByb3BlcnRpZXMoKSksIG9yIGFuIGVtcHR5IENvbGxlY3Rpb24gaWYgbm9uZSBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgYWxsIHByb3BlcnRpZXMgKHRoZSB1bmlvbiBvZiBnZXRCYXNlUHJvcGVydGllcygpIGFuZAotCSAqICAgICAgICAgZ2V0TmVzdGVkUHJvcGVydGllcygpKSwgb3IgYW4gZW1wdHkgQ29sbGVjdGlvbiBpZiBub25lIGV4aXN0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiByb290IElEYXRhTW9kZWwgb25seS4gTmVzdGVkIElEYXRhTW9kZWxzIGFyZSBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzIHBvc3NpYmxlIGZvciBhIG5lc3RlZAotCSAqIElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcHJvcGVydHkgaXMgYSBiYXNlIHByb3BlcnR5LCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc1Byb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlICNpc05lc3RlZFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jhc2VQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIHRoaXMKLQkgKiBEYXRhTW9kZWwgb3IgYW55IG9mIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBwcm9wZXJ0eSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlICNpc0Jhc2VQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eU5hbWUgZm9yIGFueSBvZgotCSAqIGl0cyAocmVjdXJzaXZlbHkpIG5lc3RlZCBJRGF0YU1vZGVscy4gVGhlIHJvb3QgSURhdGFNb2RlbCBpcyBub3QgY2hlY2tlZCwgdGhvdWdoIGl0IGlzCi0JICogcG9zc2libGUgZm9yIHRoZSByb290IElEYXRhTW9kZWwgdG8gY29udGFpbiB0aGUgc2FtZSBwcm9wZXJ0eS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBuZXN0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHNlZSAjaXNCYXNlUHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGJlZW4gc2V0IG9uIHRoZSBJRGF0YU1vZGVsLiBJZiBpdAotCSAqIGhhcyBub3QgYmVlbiBzZXQsIHRoZW4gYSBjYWxsIHRvIGdldCB0aGUgc2FtZSBwcm9wZXJ0eSB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEFuIElEYXRhTW9kZWwgaW1wbGVtZW50b3IgZGVmaW5lcyB0aGlzIGluIElEYXRhTW9kZWxQcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUHJvdmlkZXIjaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIGVuYWJsZWQgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHRoZSBJU3RhdHVzIHJldHVybmVkIGJ5IHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nKSBpcyBFUlJPUgotCSAqICAgICAgICAgYW5kIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VmFsaWQoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIElTdGF0dXMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIFJldHVucyBhbiBJU3RhdHVzLk9LIGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcwotCSAqIHZhbGlkIHdpdGggcmVzcGVjdCBpdHNlbGYsIG90aGVyIHByb3Blcml0ZXMsIGFuZCBicm9hZGVyIGNvbnRleHQgb2YgdGhlIElEYXRhTW9kZWwuCi0JICogSVN0YXR1cy5FUlJPUiBpcyByZXR1cm5lZCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgaW52YWxpZC4gSVN0YXR1cy5XQVJOSU5HIG1heSBhbHNvIGJlCi0JICogcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBvcHRpbWFsLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgSURhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIElTdGF0dXMgcmV0dXJuZWQgYnkgdmFsaWRhdGUodHJ1ZSkgaXMgRVJST1IgYW5kCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgSVN0YXR1cyByZXR1cm5lZCBieSB2YWxpZGF0ZSh0cnVlKSBpcyBFUlJPUiBhbmQKLQkgKiAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFcXVhdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+dmFsaWRhdGUodHJ1ZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogSXRlcmF0ZXMgb3ZlciBhbGwgYmFzZSBwcm9wZXJ0aWVzIGFuZCBuZXN0ZWQgbW9kZWxzIElEcyBhbmQgY2FsbHMgdmFsaWRhdGUoU3RyaW5nKS4gVGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIHdoZW4gYW55IGNhbGwgdG8gdmFsaWRhdGUoU3RyaW5nKSByZXR1cm5zIGFuIElTdGF0dXMgZXJyb3IgYW5kCi0JICogc3RvcEF0Rmlyc3RGYWlsdXJlIGlzIHNldCB0byB0cnVlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdG9wQXRGaXJzdEZhaWx1cmUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgc3RvcCBhdCB0aGUgZmlyc3QgZmFpbHVyZQotCSAqIEByZXR1cm4gYW4gSVN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGJvb2xlYW4gc3RvcEF0Rmlyc3RGYWlsdXJlKTsKLQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGUKLQkgKiA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgcmV0dXJuZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHdpbGwgYmUKLQkgKiB0aGUgc2FtZSB2YWx1ZSBhcyByZXR1cm5lZCBieSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBGb2xsb3dpbmcgdGhlIGV4YW1wbGUgaW50cm9kdWNlZCBpbiB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfSwgc3VwcG9zZQotCSAqIHRoZSA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgc2V0IHRvIDEuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCB3b3VsZAotCSAqIHJldHVybiBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB3aG9zZSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlKCk8L2NvZGU+IHJldHVybnMKLQkgKiA8Y29kZT4xPC9jb2RlPiBhbmQgd2hvc2UgPGNvZGU+Z2V0UHJvcGVydHlEZXNjcmlwdGlvbigpPC9jb2RlPiByZXR1cm5zIDxjb2RlPnNtYWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQWxzbywgbm90ZSB0aGF0IGV2ZW4gaWYgYSBwYXJ0aWN1bGFyIHByb3BlcnR5IGlzIG5vdCBjb25maW5lZCB0byBhIGZpbml0ZSBzZXQgb2YgdmFsdWVzIGFzCi0JICogZGVmaW5lZCBieSB7QGxpbmsgI2dldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcpfXRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBhCi0JICogdmFsaWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKiBAc2VlICNnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBhcnJheSBjb25zaXN0aW5nIG9mIGFsbCB2YWxpZAotCSAqIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcnMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIEVhY2gKLQkgKiB7QGxpbmsgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yfSBjb250YWlucyBhIHZhbHVlIGFuZCBhIGh1bWFuIHJlYWRpYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUKLQkgKiB2YWx1ZS4gVGhlIHNldCBvZiBhbGwgdmFsdWVzIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgdGhvc2UgdmFsdWVzIHdoaWNoIGFyZSB2YWxpZCBmb3IgdGhlCi0JICogSURhdGFNb2RlbC4gVGhpcyB2YWx1ZSBzZXQgb25seSBtYWtlcyBzZW5zZSB3aGVuIHZhbGlkIHByb3BlcnR5IHZhbHVlcyBjb25mb3JtIHRvIGEgd2VsbAotCSAqIGRlZmluZWQgZmluaXRlIHNldC4gSWYgbm8gc3VjaCB2YWx1ZSBzZXQgZXhpc3RzIGZvciB0aGUgcHJvcGVydHksIHRoZW4gYSAwIGxlbmd0aCBhcnJheSBpcwotCSAqIHJldHVybmVkLiA8Y29kZT5udWxsPC9jb2RlPiBpcyBuZXZlciByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIHByb3BlcnR5IGNhbGxlZCA8Y29kZT5TSElSVF9TSVpFPC9jb2RlPiB3aGljaCBpcyBhbgotCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+IHR5cGUuIEFsc28gc3VwcHNlIHRoYXQgdmFsaWQgc2hpcnQgc2l6ZXMgYXJlIG9ubHkgc21hbGwsIG1lZGl1bSwgb3IKLQkgKiBsYXJnZS4gSG93ZXZlciwgdGhlIGFjdHVhbCB2YWx1ZXMgcmVwcmVzZW50aW5nIHNtYWxsLCBtZWRpdW0sIGFuZCBsYXJnZSBhcmUgMSwgMiwgYW5kIDMKLQkgKiByZXNwZWN0aXZlbHkuIEEgY2FsbCB0byA8Y29kZT5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU0hJUlRfU0laRSk8L2NvZGU+IHdvdWxkIHJldHVybiBhCi0JICogRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGFycmF5IHdoZXJlIHRoZSB2YWx1ZSwgZGVzY3JpcHRpb24gcGFpcnMgd291bGQgYmUgeygxLCBzbWFsbCksCi0JICogKDIsIG1lZGl1bSksICgzLCBsYXJnZSl9LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbiBJRGF0YU1vZGVsIGltcGxlbWVudG9yIGRlZmluZXMgdGhpcyBpbiBJRGF0YU1vZGVsUHJvdmlkZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZW4gbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWxpZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICogQHNlZSAjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIERhdGFNb2RlbEV2ZW50cy4gSWYgdGhlIHNwZWNpZmllZAotCSAqIGxpc3RlbmVyIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbmV3IGxpc3RlbmVyIHRvIGFkZC4KLQkgKiAKLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihJRGF0YU1vZGVsTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyIGRhdGFNb2RlbExpc3RlbmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIElEYXRhTW9kZWxMaXN0ZW5lci4gSWYgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBpcyBub3QgYSByZWdpc3RlcmVkCi0JICogbGlzdGVuciBvbiB0aGlzIElEYXRhTW9kZWwsIHRoZW4gY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUuCi0JICogQHNlZSAjYWRkTGlzdGVuZXIoSURhdGFNb2RlbExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBkYXRhTW9kZWxMaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNWQUxVRV9DSEcKLQkgKiBAc2VlICNub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uIFRoaXMgY29udGFudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzIGJlY2F1c2UgaXQgZG9lcwotCSAqIG5vdCBtYXAgdG8gYW4gZXZlbnQgdHlwZSBvbiBEYXRhTW9kZWxFdmVudC4gV2hlbiBub3RpZnlpbmcgd2l0aCB0aGlzIHR5cGUsIGEgY2hlY2sgaXMgZmlyc3QKLQkgKiBkb25lIHRvIHNlZSB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzZXQuIElmIHRoZSBwcm9wZXJ0eSBpcyA8ZW1wZj5OT1Q8L2VtcGg+IHNldCwgdGhlbiBhCi0JICogPGNvZGU+VkFMVUVfQ0hHPC9jb2RlPiBpcyBmaXJlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DSEcgPSBEYXRhTW9kZWxFdmVudC5ERUZBVUxUX0NIRzsKLQkvKioKLQkgKiA8cD4KLQkgKiBBIGNvbnN0YW50IHVzZWQgZm9yIG5vdGlmaWNhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudCNFTkFCTEVfQ0hHCi0JICogQHNlZSAjbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0NIRyA9IERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEc7Ci0JLyoqCi0JICogPHA+Ci0JICogQSBjb25zdGFudCB1c2VkIGZvciBub3RpZmljYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgRGF0YU1vZGVsRXZlbnQjVkFMSURfVkFMVUVTX0NIRwotCSAqIEBzZWUgI25vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElEX1ZBTFVFU19DSEcgPSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHOwotCi0JLyoqCi0JICogPHA+Ci0JICogTm90aWZ5IGFsbCBsaXN0ZW5lcnMgb2YgYSBwcm9wZXJ0eSBjaGFuZ2UuIDxjb2RlPmV2ZW50VHlwZTwvY29kZT4gc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0JICogY2hhbmdlLiBBY2NlcHRpYmxlIHZhbHVlcyBmb3IgZXZlbnRUeXBlIGFyZSA8Y29kZT5WQUxVRV9DSEc8L2NvZGU+LAotCSAqIDxjb2RlPkRFRkFVTFRfQ0hHPC9jb2RlPiwgPGNvZGU+RU5BQkxFX0NIRzwvY29kZT4sIDxjb2RlPlZBTElEX1ZBTFVFU19DSEc8L2NvZGU+LiBJZgotCSAqIHRoZSBldmVudFR5cGUgaXMgPGNvZGU+REVGQVVMVF9DSEc8L2NvZGU+IGFuZCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldCwgdGhlbiB0aGlzCi0JICogbWV0aG9kIHdpbGwgZG8gbm90aGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVHlwaWNhbGx5IHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGludm9rZWQgYnkgYW4gSURhdGFNb2RlbFByb3ZpZGVyIGZyb20gaXRzIHByb3BlcnR5U2V0Ci0JICogaW1wbGVtZW50YXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2luZwotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUKLQkgKiAKLQkgKiBAc2VlICNWQUxVRV9DSEcKLQkgKiBAc2VlICNERUZBVUxUX0NIRwotCSAqIEBzZWUgI0VOQUJMRV9DSEcKLQkgKiBAc2VlICNWQUxJRF9WQUxVRVNfQ0hHCi0JICogQHNlZSBEYXRhTW9kZWxFdmVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBldmVudFR5cGUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIGRpc3Bvc2UgbWV0aG9kIHVzZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBub3QgaGFuZGxlZCBieSBnZW5lcmFsIGdhcmJhZ2UKLQkgKiBjb2xsZWN0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGFhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgd2hlbiBsaXN0ZW5pbmcgZm9yIERhdGFNb2RlbEV2ZW50cyBmcm9tIGFuIElEYXRhTW9kZWwuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2FkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lcikKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbExpc3RlbmVyIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNlbnQgd2hlbiBEYXRhTW9kZWxFdmVudHMgb2NjdXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIERhdGFNb2RlbEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL0lEYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MzJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi0vKioKLSAqIDxwPgotICogSURhdGFNb2RlbE9wZXJhdGlvbiBkZWZpbmVzIGFuIElEYXRhTW9kZWwgZHJpdmVuIHVuZG9hYmxlIG9wZXJhdGlvbi4gRXZlcnkgSURhdGFNb2RlbE9wZXJhdGlvbgotICogbWF5IGJlIGV4dGVuZGVkIGJ5IHRoaXJkIHBhcnR5IGNsaWVudHMgdXNpbmcgdGhlIGV4dGVuZGVkIG9wZXJhdGlvbiBmcmFtZXdvcmsuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb259LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbAotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzIElVbmRvYWJsZU9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSB1bmlxdWUgb3BlcmF0aW9uIGlkLiBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBvcGVyYXRpb24gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdW5pcXVlIG9wZXJhdGlvbiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdGhlIElEYXRhTW9kZWwgZm9yIHRoaXMgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIHRoZSBJRGF0YU1vZGVsIHVzZWQgdG8gcnVuIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGlzIG9wZXJhdGlvbidzIElEYXRhTW9kZWwuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBvcGVyYXRpb24ncyBJRGF0YU1vZGVsLgotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgSVNjaGVkdWxpbmdSdWxlIHVzZWQgZm9yIGV4ZWN1dGluZyB0aGlzIGpvYiB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLCB0aGVuIElXb3Jrc3BhY2UuZ2V0Um9vdCgpIGlzIHVzZWQgYXMgdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIGR1cmluZyBleGVjdXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElTY2hlZHVsaW5nUnVsZQotCSAqIAotCSAqIEBzZWUgI2dldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjcnVuKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSwgSVNjaGVkdWxpbmdSdWxlLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncyB1c2VkIGZvciBleGVjdXRpbmcgdGhpcyBPcGVyYXRpb24gYXMgYSB3b3Jrc3BhY2Ugam9iLgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUsIElTY2hlZHVsaW5nUnVsZSwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcil9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBPcGVyYXRpb25FeGVjdXRpb25GbGFncwotCSAqIAotCSAqIEBzZWUgI2dldFNjaGVkdWxpbmdSdWxlKCkKLQkgKiBAc2Vlb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlLCBJU2NoZWR1bGluZ1J1bGUsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBmcmFtZXdvcmsgd2lsbCBzZXQgdGhlIGVudmlyb25tZW50IG9uIHRoaXMgb3BlcmF0aW9uIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4gVGhlIG9wZXJhdGlvbgotCSAqIGNhbiB0aGVuIHVzZSB0aGUgZW52aXJvbm1lbnQgdG8gcmVwb3J0IHN0YXR1cywgbG9nIGluZm9ybWF0aW9uLCBhbmQgYWNjZXNzIHJlc291cmNlcyBpbiBhbgotCSAqIGVudmlyb25tZW50IG5ldXRyYWwgd2F5LgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBlbnZpcm9ubWVudAotCSAqICAgICAgICAgICAgdGhlIElFbnZpcm9ubWVudCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoSUVudmlyb25tZW50IGVudmlyb25tZW50KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElFdmlyb25tZW50IHNldCBpbiB7QGxpbmsgI3NldEVudmlyb25tZW50KElFbnZpcm9ubWVudCl9fQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldCBJRW52aXJvbm1lbnQKLQkgKiAKLQkgKiBAc2VlICNzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQpCi0JICovCi0JcHVibGljIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZTA4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHRoZSBiYXNlIGludGVyZmFjZSBmb3IgYWxsIERhdGEgTW9kZWwKLSAqIFByb3BlcnRpZXMgaW50ZXJmYWNlcy4gU3ViIGludGVyZmFjZSBjbGFzc2VzIChlLmcuCi0gKiA8Y29kZT5zb21lLmNvbXBhbnkuSUZvb0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M8L2NvZGU+KSBzaG91bGQgYmUgdXNlZCB0bwotICogY3JlYXRlIGluc3RhbmNlcyBvZiBJRGF0YU1vZGVscyB1c2luZyB0aGUKLSAqIHtAbGluayBEYXRhTW9kZWxGYWN0b3J5I2NyZWF0ZURhdGFNb2RlbChDbGFzcyl9IG1ldGhvZC4gSW4gb3JkZXIgZm9yIHRoaXMKLSAqIG1lY2hhbmlzbSB0byB3b3JrLCB0aGUgYmFja2luZyB7QGxpbmsgSURhdGFNb2RlbFByb3ZpZGVyfSBjbGFzcyBtdXN0IGJlCi0gKiByZWdpc3RlcmQgdG8gc3VwcG9ydCB0aGUgc3ViIElEYXRhTW9kZWxQcm9wZXJ0aWVzIGludGVyZmFjZSBpbiBvbmUgb2YgdHdvCi0gKiB3YXlzLiBUaGlzIHJlZ2lzdHJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHRoZSBtb2RlbCBkZXZlbG9wZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBmaXJzdCB3YXkgdG8gcmVnaXN0ZXIgdGhlIGNvcnJlY3Qge0BsaW5rIElEYXRhTW9kZWxQcm92aWRlcn0gY2xhc3MgaXMgZm9yCi0gKiB0aGUgaW50ZXJmYWNlIHRvIGRlZmluZSBhIHB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzIGZpZWxkCi0gKiB3aGljaCBpcyBzZXQgdG8gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzLCBlLmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxjb2RlPnB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gc29tZS5jb21wYW55LkZvb0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzPC9jb2RlPgotICogPC9wPgotICogVGhlIGFib3ZlIG1lY2hhbmlzbSBpcyByZWNvbW1lbmRlZCB3aGVuZXZlciB0aGUge0BsaW5rIElEYXRhTW9kZWxQcm9wZXJ0aWVzfSBhbmQKLSAqIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzZXMgYXJlIGJvdGggZGVmaW5lZCBpbiB0aGUgc2FtZSBwbHVnaW4gc2NvcGUuCi0gKiBBIHNlY29uZCBtZWNoYW5pc20gdXNpbmcgdGhlIERhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludCBpcwotICogYXZhaWxhYmxlIHdoZW4gdGhlIHtAbGluayBJRGF0YU1vZGVsUHJvdmlkZXJ9IGNsYXNzIGlzIGRlZmluZW5kIG91dHNpZGUgdGhlCi0gKiB7QGxpbmsgSURhdGFNb2RlbFByb3BlcnRpZXN9IHBsdWdpbiBzY29wZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3RvcnkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIEEgYm9vbGVhbiBwcm9wZXJ0eSBkZWZhdWx0cyB0byBCb29sZWFuLlRSVUUuIElmIHRoaXMgaXMgc2V0IHRvIEJvb2xlYW4uRkFMU0Ugbm8gZXh0ZW5kZWQKLQkgKiBvcGVyYXRpb25zIHdpbGwgYmUgZXhlY3V0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgTGlzdCBjb250YWluaW5nIFN0cmluZyBvYmplY3RzLCBkZWZhdXRscyB0byBhbiBlbXB0eSBMaXN0LiBJZiB0aGlzIGxpc3QgY29udGFpbnMgZWxlbWVudHMKLQkgKiBhbmQgQUxMT1dfRVhURU5TSU9OUyBpcyBzZXQgdG8gQm9vbGVhbi5UUlVFLCB0aGVuIG9ubHkgZXh0ZW5kZWQgb3BlcmF0aW9ucyBub3QgaWRlbnRpZmllZCBpbgotCSAqIHRoaXMgbGlzdCB3aWxsIGJlIGV4ZWN1dGVkLiBUaGVzZSBzdHJpbmdzIHNob3VsZCBlaXRoZXIgYmUgdGhlIG9wZXJhdGlvbiBpZCBvciB0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgb3BlcmF0aW9uIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RfRVhURU5TSU9OUyA9ICJJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvSURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYmZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC9JRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogSURhdGFNb2RlbFByb3ZpZGVycyBhcmUgdXNlZCBieSB0aGUgRGF0YU1kb2VsRmFjdG9yeSB0byBjb25zdHJ1Y3QgSURhdGFNb2RlbHMuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIENsaWVudHMgc2hvdWxkIHN1YmNsYXNzCi0gKiB7QGxpbmsgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcn0uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsIiwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGJhY2tpbmcgSURhdGFNb2RlbCBmb3IgdGhpcyBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYmFja2luZyBJRGF0YU1vZGVsCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyBmb3Igd2hpY2ggdGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZS4gVGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgb25seSBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdmFsaWQgcHJvcGVydHkgbmFtZXMuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQcm92aWRlcnMgc2hvdWxkIHBlcmZvcm0gYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBoZXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBkZWZhdWx0IHByb3BlcnRpZXMgc2hvdWxkIGJlIGNvbXB1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHdoZXJlIHRoZSBwcm92aWRlciBzaG91bGQgZGVmaW5lIGhvdyBwcm9wZXJ0eSBlbmFibGVtZW50cyBhcmUgY29tcHV0ZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogSURhdGFNb2RlbFByb3ZpZGVycyBzaG91bGQgcGVyZm9ybSBwcm9wZXJ0eSB2YWxpZGF0aW9uIGhlcmUuIEFsbCBjYWxscyB0bwotCSAqIElEYXRhTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShTdHJpbmcpIGFyZSByb3V0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIElEYXRNb2RlbFByb3ZpZGVyLiBXaGVuCi0JICogSURhdGFNb2RlbC52YWxpZGF0ZSgpIG9yIElEYXRhTW9kZWwudmFsaWRhdGUoYm9vbGVhbikgYXJlIGNhbGxlZCB0byB2YWxpZGF0ZSB0aGUgZW50aXJlCi0JICogSURhdGFNb2RlbCwgYW55IG5lc3RlZCBtb2RlbCBuYW1lcyBhcmUgYWxzbyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgSURhdGFNb2RlbFByb3ZpZGVyIGZvciBhCi0JICogY2hhbmNlIHRvIHZhbGlkYXRlIHRoZSBuZXN0ZWQgSURhdGFNb2RlbCBpbiBhbiBhcHByb3ByaWF0ZSBtYW5uZXIuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIGFuIElTdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYWxsYmFjayBob29rIGZvciB0aGUgSURhdGFNb2RlbCBwcm92aWRlciB0byBiZSBub3RpZmllZCBvZiBhIHNldFByb3BlcnR5KCkKLQkgKiBjYWxsIGludm9rZWQgb24gdGhlIGJhY2tpbmcgSURhdGFNb2RlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBhY3R1YWwgdmFsdWUgaGFzIGJlZW4KLQkgKiBzdG9yZWQgYnkgdGhlIElEYXRhTW9kZWwgYnV0IGJlZm9yZSBhbnkgZ2VuZXJhbCBub3RpZmljYXRpb25zIGFyZSBmaXJlZCB0byBpdHMgbGlzdGVuZXJzLgotCSAqIFRodXMgdGhpcyBJRGF0YU1vZGVsUHJvdmlkZXIgbWF5IHJlYWN0IHRvIHVwZGF0ZXMgYXByb3ByaWF0ZWx5IGJ5IHNldHRpbmcgb3RoZXIgcHJvcGVydGllcywKLQkgKiBub3RpZnlpbmcgZGVmYXVsdCBjaGFuZ2VzLCBub3RpZnlpbmcgdmFsaWQgdmFsdWUgY2hhbmdlcywgZXRjLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGZpcmUgYSBWQUxVRV9DSEcgRGF0YU1vZGVsRXZlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpOwotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWU3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Q29tcG9uZW50IGNyZWF0aW9uIGFuZCBSZWZlcmVuY2VkIENvbXBvbmVudCBhcGkgb3ZlcnZpZXc8L3RpdGxlPgotICAgIDwvaGVhZD4KLQotICAgIDxib2R5PiAgCi0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhpcyBwYWNrYWdlIGluY2x1ZGVzIEFQSSAgZm9yIERhdGEgTW9kZWwgUHJvdmlkZXIgZnJhbWV3b3JrIGZvciBidWlsaW5nIGV4ZWN1dGFibGUKLSAgICAgICAgYW5kIHVuZG9hYmxlIG9wZXJhdGlvbnMgdXNpbmcgZGF0YSBtb2RlbHMsIHRoZWlyIHByb3ZpZGVycyBhbmQgcHJvdmlkZXIgaW50ZXJmYWNlcyB0aGF0Ci0gICAgICAgIGNvbnRhaW4gdGhlIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgcHJvdmlkZXJzIHRvIHNldCBhbmQgcmV0cmlldmUgdGhlc2UgcHJvcGVydGllc2UuIAotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Byb3BlcnRpZXMvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWY3NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5Db21wb25lbnQgY3JlYXRpb24gYW5kIFJlZmVyZW5jZWQgQ29tcG9uZW50IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgQVBJIHRoYXQgZGVmaW5lcyB0aGUgcHJvcGV0aWVzIHRoYXQgY2FuIGJlIHNldCBvbiBhIGZsZXhpYmxlCi0gICAgICAgIHByb2plY3QgZGF0YW1vZGVsIHRvIGRyaXZlIHRoZSB0aGUgd2l6YXJkIGFuZCBvcGVyYXRpb25zLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDA2OWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTIsIDIwMDQKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5GdW5jdGlvbkdyb3VwUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JZGVudGlmaWFibGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIENvbW1vbiBzdXBlcmNsYXNzIGZvciBlbmFibGVtZW50LWF3YXJlIChlLmcuLCB1c2luZyBmdW5jdGlvbiBncm91cHMgb3IgYWN0aXZpaXRpZXMpIGV4dGVuc2lvbgotICogcG9pbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgaW1wbGVtZW50cyBJZGVudGlmaWFibGUgewotCi0JcHJvdGVjdGVkIEludGVnZXIgcHJpb3JpdHk7Ci0KLQlwdWJsaWMgQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFuRWxlbWVudCkgewotCQlzdXBlcihhbkVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0RW5hYmxlbWVudElkZW50aWZpZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZ2V0SUQoKSwgcHJvamVjdCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJRCgpOwotCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJaWYgKHByaW9yaXR5ID09IG51bGwpCi0JCQlwcmlvcml0eSA9IG5ldyBJbnRlZ2VyKEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEZ1bmN0aW9uUHJpb3JpdHkoZ2V0SUQoKSkpOwotCQlyZXR1cm4gcHJpb3JpdHkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcCkgewotCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWQgPSBnZXRFbmFibGVtZW50SWRlbnRpZmllcihwKTsKLQkJcmV0dXJuIGlkLmlzRW5hYmxlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQWRhcHRhYmlsaXR5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOGExOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9BZGFwdGFiaWxpdHlVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRhYmlsaXR5VXRpbGl0eSB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGVsZW1lbnQsIENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJldHVybiAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCWVsc2UKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoZWxlbWVudCwgYWRhcHRlcik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvQ29uZmlndXJhdGlvbkVsZW1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzU3MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIgewotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbHVnaW4gaWQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCi0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKLQotCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJLy8gVE9ETyBqc2hvbGwgaXMgdGhpcyBjb3JyZWN0Pz8/Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzMzMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotLyoqCi0gKiBPdGhlciB0aGluZ3MgdG8gZGVsZXRlOgotICogCi0gKiBUaGUgd3RwdWlBY3Rpb24gZXh0ZW5zaW9uIHBvaW50IGFuZCBzY2hlbWEgaW4gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZS9tZXRob2QvZmllbGQKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICovCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYmVpbmcgdXNlZCB0byB0cmFjayBjb2RlIHNsYXRlZCBmb3IgcmVtb3ZhbC4gQW55IGNsYXNzIG9yIGludGVyZmFjZQotICogaW1wbGVtZW50aW5nIG9yIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZSByZXNwZWN0aXZlbHkgc2hvdWxkIG5vdCBiZSB1c2VkLiBBbGwgc3VjaCBjbGFzc2VzIGFuZAotICogaW50ZXJmYWNlcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAxLjUuCi0gKiAKLSAqIEFueSBtZXRob2Qgb3IgZmllbGQgd2l0aCBqYXZhZG9jIHJlZmVyZW5jaW5nIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBub3QgYmUgdXNlZCBhbmQgd2lsbCBiZQotICogZGVsZXRlZCBwb3N0IFdUUCAxLjUKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxN2Q2NWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKLQkvKioKLQkgKiBVdGlsaXR5IGNsYXNzOyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJpdmF0ZSBFeGNlcHRpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCi0JICogCi0JICogQGV4Y2VwdGlvbiBhbmQKLQkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEFsbE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJbWVzc2FnZXMuYWRkKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQlFeGNlcHRpb24gbmVzdGVkID0gZXhjZXB0aW9uLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQl3aGlsZSAobmVzdGVkICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChuZXN0ZWQuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmIChuZXN0ZWQgaW5zdGFuY2VvZiBJV3JhcHBlZEV4Y2VwdGlvbikKLQkJCQluZXN0ZWQgPSAoKElXcmFwcGVkRXhjZXB0aW9uKSBuZXN0ZWQpLmdldE5lc3RlZEV4Y2VwdGlvbigpOwotCQkJZWxzZQotCQkJCW5lc3RlZCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgbWVzc2FnZXMudG9BcnJheShuZXcgU3RyaW5nW21lc3NhZ2VzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbQotCSAqIAotCSAqIEBleGNlcHRpb24gYW5kCi0JICogICAgICAgICAgICAgICAgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsIGNvbmNhdGVuYXRlZCBhcwotCSAqICAgICAgICAgICAgICAgIG9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKElXcmFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlTdHJpbmdbXSBtZXNzYWdlcyA9IGdldEFsbE1lc3NhZ2VzKGV4Y2VwdGlvbik7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKG1lc3NhZ2VzW2ldKTsKLQkJCWlmIChpIDwgbWVzc2FnZXMubGVuZ3RoIC0gMSkKLQkJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSGFzaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkYTI3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0hhc2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgSGFzaFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBpbnQgU0VFRCA9IDExOwotCXByaXZhdGUgc3RhdGljIGludCBNVUxUSSA9IDMxOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGludCBpKXsKLQkJcmV0dXJuIHNlZWQgKiBNVUxUSSArIGk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIE9iamVjdCBvYmopewotCQlyZXR1cm4gaGFzaChzZWVkLCBudWxsICE9IG9iaiA/IG9iai5oYXNoQ29kZSgpIDogU0VFRCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGhhc2goaW50IHNlZWQsIGJvb2xlYW4gYil7Ci0JCXJldHVybiBoYXNoKHNlZWQsIGIgPyAxIDogU0VFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvSVNhdmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2NlMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2F2ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgQVBJIGZvciBjb3Bpbmcgd2l0aCBhdHRlbXB0cyB0byBvdmVyd3JpdGUgcmVhZC1vbmx5IGZpbGVzIG9yIHNhdmUgZmFpbHVyZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2F2ZUhhbmRsZXIgewotCXB1YmxpYyB2b2lkIGFjY2VzcygpOwotCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKElGaWxlIGFGaWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjFkOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGUgW10gZmlsZXMpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL0lXcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2YzYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9JV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgQXJjaGl2ZVJ1bnRpbWUgYW5kIEFyY2hpdmVXcmFwcGVkIGV4Y2VwdGlvbnMsIHdoaWNoIGNhbiBjb250YWluIG5lc3RlZAotICogZXhjZXB0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVkRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVzc2FnZXMgZnJvbSB0aGlzIGFuZCBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvCi0JICogaW5uZXJtb3N0LCBjb25jYXRlbmF0ZWQgYXMgb25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpOwotCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0JcHVibGljIGphdmEubGFuZy5FeGNlcHRpb24gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKTsKLQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpOwotCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc1NmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBEQUJFUkcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VzIHsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1lc3NhZ2VzKCkgewotCQlpbml0aWFsaXplQnVuZGxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUJ1bmRsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHJlc291cmNlQnVuZGxlICE9IG51bGwgPyByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZG9HZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZG9HZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQlpZiAocGF0dGVybiAhPSBudWxsKQotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIGFyZ3MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MzUwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVGYWlsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi0vKioKLSAqIFJ1bnRpbWUgZXhjZXB0aW9uIHRoYXQgY291bGQgZ2V0IHRocm93biBkdXJpbmcgc2F2ZSBvZiBhbiBlZGl0IG1vZGVsOyBjbGllbnRzIHNob3VsZCB1c2UKLSAqIHtAbGluayAjZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXN9dG8gZ2V0IGFsbCB0aGUgbWVzc2FnZXMgb2YgdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zIHRvCi0gKiByZXBvcnQgdGhlIGZhaWx1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2NDAwMTg5MDE5MTA3MzEyNDBMOwotCi0JLyoqCi0JICogU2F2ZUZhaWxlZEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTYXZlRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVGYWlsZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhdmVGYWlsZWRFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMsIGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NhdmVIYW5kbGVySGVhZGxlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWMwN2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJIZWFkbGVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEwLzE5LzIwMDEgMTE6NDA6NTkgQU0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNhdmVIYW5kbGVySGVhZGxlc3MgaW1wbGVtZW50cyBJU2F2ZUhhbmRsZXIgewotCS8qKgotCSAqIEhlYWRsZXNzU2F2ZUhhbmRsZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2F2ZUhhbmRsZXJIZWFkbGVzcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2Nlc3MgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXNzKCkgewotCX0KLQotCS8qKgotCSAqIGhhbmRsZVNhdmVGYWlsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChTYXZlRmFpbGVkRXhjZXB0aW9uIGV4LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IGV4OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJRXhjZXB0aW9uIG5lc3RlZCA9IGV4LmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpOwotCQlpZiAobmVzdGVkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShuZXN0ZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCWlmIChleCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIGV4KTsKLQkJZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoQ29yZUV4Y2VwdGlvbikgZXgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIHN0YXR1cyA9IGV4LmdldFN0YXR1cygpOwotCQlpZiAoc3RhdHVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRocm93YWJsZSBuZXN0ZWQgPSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmIChuZXN0ZWQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJcmV0dXJuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZSgoQ29yZUV4Y2VwdGlvbikgbmVzdGVkKTsKLQkJcmV0dXJuIHN0YXR1cy5nZXRDb2RlKCkgPT0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzLkZBSUxFRF9XUklURV9MT0NBTDsKLQl9Ci0KLQkvKioKLQkgKiByZWxlYXNlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZENvbnRpbnVlQW5kTWFrZUZpbGVFZGl0YWJsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBhRmlsZSkgewotCQlpZiAoYUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGVycm9yID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVW5hYmxlX3RvX3NhdmVfcmVhZC1vbmx5X2ZfRVJST1JfIiwgbmV3IE9iamVjdFtde2FGaWxlLmdldEZ1bGxQYXRoKCl9KTsgLy8kTk9OLU5MUy0xJCA9ICJVbmFibGUgdG8gc2F2ZSByZWFkLW9ubHkgZmlsZTogIgotCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXJyb3IpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2F2ZUhhbmRsZXJSZWdpc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlclJlZ2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWUyNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TYXZlSGFuZGxlclJlZ2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotCi0KLS8qKgotICogQSByZWdpc3RyeSBmb3IgdGhlIGRlZmF1bHQgSVNhdmVIYW5kbGVyIHRvIHVzZSB3aGVuIHNhdmluZyBlZGl0IG1vZGVscwotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXJSZWdpc3RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSVNhdmVIYW5kbGVyIHNhdmVIYW5kbGVyOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNhdmVIYW5kbGVyUmVnaXN0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2F2ZUhhbmRsZXIgZ2V0U2F2ZUhhbmRsZXIoKSB7Ci0JCWlmIChzYXZlSGFuZGxlciA9PSBudWxsKQotCQkJc2F2ZUhhbmRsZXIgPSAoSVNhdmVIYW5kbGVyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCJzYXZlSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYXZlSGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9TaW1wbGVWYWxpZGF0ZUVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyN2RhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZXMgbXVzdCBjb250YWluIG9ubHkge0BsaW5rIElGaWxlfXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlRWRpdChMaXN0IGZpbGVzKXsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5zaXplKCkgPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVFZGl0KCAoSUZpbGUgW10pZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KElGaWxlW10gZmlsZXMpIHsKLQkJaWYoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dCB2YWxpZGF0b3IgPSAoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoSVNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHQuQ0xBU1NfS0VZKTsKLQkJcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZUVkaXQoZmlsZXMpLmlzT0soKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1NpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmZTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvU2ltcGxlVmFsaWRhdGVFZGl0Q29udGV4dEhlYWRsZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhbGlkYXRlRWRpdENvbnRleHRIZWFkbGVzcyBpbXBsZW1lbnRzIElTaW1wbGVWYWxpZGF0ZUVkaXRDb250ZXh0IHsKLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJRmlsZVtdIGZpbGVzKSB7Ci0JCWZpbmFsIExpc3QgZmlsZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDtpPGZpbGVzLmxlbmd0aDsgaSsrKXsKLQkJCWlmKGZpbGVzW2ldLmV4aXN0cygpICYmIGZpbGVzW2ldLmlzUmVhZE9ubHkoKSl7Ci0JCQkJZmlsZXNMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYoZmlsZXNMaXN0LnNpemUoKSA+IDApewotCQkJSUZpbGUgW10gZmlsZXNUb1ZhbGlkYXRlID0gKElGaWxlIFtdKWZpbGVzTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlc0xpc3Quc2l6ZSgpXSk7Ci0JCQlyZXR1cm4gdmFsaWRhdGVFZGl0SW1wbChmaWxlc1RvVmFsaWRhdGUpOwotCQl9Ci0JCXJldHVybiBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdEltcGwoSUZpbGVbXSBmaWxlc1RvVmFsaWRhdGUpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXNUb1ZhbGlkYXRlLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzNmZGY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAxMCwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkRlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5JTXNnTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLldvcmtiZW5jaFV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXVFBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJTXNnTG9nZ2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgV1RQUGx1Z2luIGluc3RhbmNlID0gbnVsbDsgCi0JcHVibGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgV1RQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChsb2dnZXIgPT0gbnVsbCkgewotCQkJbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihnZXRQbHVnaW5JRCgpKTsKLQkJCXNldFJlbmRlcmVyKGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGdldE1zZ0xvZ2dlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5PU19NQUNPU1guZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpID8gZmFsc2UgOiBuZXcKLQkJCQlqYXZhLmlvLkZpbGUoImEiKS5jb21wYXJlVG8obmV3IGphdmEuaW8uRmlsZSgiQSIpKSAhPSAwOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJV29ya2JlbmNoVXRpbC5zZXRXb3JrYmVuY2hJc1J1bm5pbmcodHJ1ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ODNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dUUFByb2plY3RVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDQsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUFByb2plY3RVdGlsaXRpZXMgewotCi0JLyoqCi0JICogQWRkcyBhIG9sZCBuYXV0dXJlIHRvIGEgcHJvamVjdCwgRklSU1QsIHRoaXMgaXMgdXNlZCB0byBtYWtlIHByb2plY3QgYmFja3dhcmQgY29tcGF0aWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0KLQkJLy9jaGVjayBpZiB0aGUgb2xkIG5hdHVyZSBkb2VzIG5vdCBleGlzdAotCQlib29sZWFuIGFkZE5hdHVyZSA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJldk5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYXR1cmUgPSBwcmV2TmF0dXJlc1tpXTsKLQkJCWlmIChuYXR1cmUuZXF1YWxzKG5hdHVyZUlkKSkgewotCQkJCWFkZE5hdHVyZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhZGROYXR1cmUpIHsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMSwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIElSZXNvdXJjZS5BVk9JRF9OQVRVUkVfQ09ORklHLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuYXR1cmUgaW4gdGhlIHByb2plY3QgaW4gdGhlIGluZGV4IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPbGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBpbnQgaW5kZXgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQotCQkvL2NoZWNrIGlmIHRoZSBvbGQgbmF0dXJlIGRvZXMgbm90IGV4aXN0Ci0JCWJvb2xlYW4gYWRkTmF0dXJlID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByZXZOYXR1cmVzW2ldOwotCQkJaWYgKG5hdHVyZS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJYWRkTmF0dXJlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZE5hdHVyZSkgewotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBpbmRleCk7Ci0KLQkJCW5ld05hdHVyZXNbaW5kZXhdID0gbmF0dXJlSWQ7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCBpbmRleCwgbmV3TmF0dXJlcywgaW5kZXggKyAxLCBwcmV2TmF0dXJlcy5sZW5ndGggLSBpbmRleCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUmVzb3VyY2UuQVZPSURfTkFUVVJFX0NPTkZJRywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF1dHVyZSB0byBhIHByb2plY3QsIEZJUlNUCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDEsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbMF0gPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmF0dXJlIHRvIGEgcHJvamVjdCwgTEFTVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3RMYXN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGEgbmF0dXJlIGZyb20gdGhlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCWludCBzaXplID0gcHJldk5hdHVyZXMubGVuZ3RoOwotCQlpbnQgbmV3c2l6ZSA9IDA7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlib29sZWFuIG1hdGNoZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwcmV2TmF0dXJlc1tpXS5lcXVhbHMobmF0dXJlSWQpKSB7Ci0JCQkJbWF0Y2hmb3VuZCA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQluZXdOYXR1cmVzW25ld3NpemUrK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJfQotCQlpZiAoIW1hdGNoZm91bmQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsICJUaGUgbmF0dXJlIGlkICIgKyBuYXR1cmVJZCArICIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdbXSB0ZW1wID0gbmV3TmF0dXJlczsKLQkJbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbbmV3c2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3TmF0dXJlcywgMCwgbmV3c2l6ZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJSVByb2plY3QgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQlyZXN1bHQgPSAoSVByb2plY3QpIG9iamVjdDsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzdWx0ID0gKChJUmVzb3VyY2UpIG9iamVjdCkuZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQotCQkJcmVzdWx0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIG9iamVjdCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV1RQUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODJkNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XVFBSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogIAotICovCi1wdWJsaWMgY2xhc3MgV1RQUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid3RwX2NvbW1vbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAotCQkJLy8gZ2V0U3RyaW5nKFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7Ci0KLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmFiYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbDsKLQotcHVibGljIGNsYXNzIFdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjIxOTI1NTgxNjAzNjQ4NTM4TDsKLQotCS8qKgotCSAqIFdGVFdyYXBwZWRFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgV3JhcHBlZEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBXcmFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXRlRXcmFwcGVkRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlRocm93YWJsZQotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFdyYXBwZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCwgU3RyaW5nIHMpIHsKLQkJc3VwZXIodGFyZ2V0LCBzKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7Ci0JCXByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtIHMpIHsKLQkJaWYgKGdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4gSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7Ci0JCWlmIChnZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlzLnByaW50bG4oIlN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWRlODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjY4NDYzNzc0NjI3NTYyMDEwMUw7Ci0JLyoqIFRoZSBleGNlcHRpb24gd2hpY2ggbmVjZXNzaXRhdGVkIHRoaXMgcnVudGltZSBleGNlcHRpb24sIGlmIG9uZSBleGlzdHMgKi8KLQlwcm90ZWN0ZWQgRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0TmVzdGVkRXhjZXB0aW9uKGUpOwotCX0KLQotCXB1YmxpYyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQlwdWJsaWMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKHMpOwotCQlzZXROZXN0ZWRFeGNlcHRpb24oZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tIHRoaXMgYW5kIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRBbGxNZXNzYWdlcygpIHsKLQkJcmV0dXJuIEV4Y2VwdGlvbkhlbHBlci5nZXRBbGxNZXNzYWdlcyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20gdGhpcyBhbmQgYWxsIG5lc3RlZCBleGNlcHRpb25zLCBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0bwotCSAqIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzIG9uZQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gRXhjZXB0aW9uSGVscGVyLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXRJbm5lck1vc3ROZXN0ZWRFeGNlcHRpb24oKSB7Ci0JCUV4Y2VwdGlvbiBuID0gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCWlmIChuID09IG51bGwpCi0JCQlyZXR1cm4gdGhpczsKLQkJZWxzZSBpZiAobiBpbnN0YW5jZW9mIElXcmFwcGVkRXhjZXB0aW9uKQotCQkJcmV0dXJuICgoSVdyYXBwZWRFeGNlcHRpb24pIG4pLmdldElubmVyTW9zdE5lc3RlZEV4Y2VwdGlvbigpOwotCQllbHNlCi0JCQlyZXR1cm4gbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkV4Y2VwdGlvbiBnZXROZXN0ZWRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXN0ZWRFeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogQWRkZWQgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciB0aGUgSmF2YSAxLjQuMiBhZGRpdGlvbiBvZgotCSAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBuZXN0ZWQgZXhjZXB0aW9uIGhlbGQgYnkgdGhlIHJlY2VpdmVyLgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuVGhyb3dhYmxlIGdldENhdXNlKCkgewotCQlyZXR1cm4gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKLQkJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewotCQlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRXcml0ZXIgcykgewotCQlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCXMucHJpbnRsbigiU3RhY2sgdHJhY2Ugb2YgbmVzdGVkIGV4Y2VwdGlvbjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmVzdGVkRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOZXN0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXN0ZWRFeGNlcHRpb24oamF2YS5sYW5nLkV4Y2VwdGlvbiBuZXdOZXN0ZWRFeGNlcHRpb24pIHsKLQkJbmVzdGVkRXhjZXB0aW9uID0gbmV3TmVzdGVkRXhjZXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvYWN0aXZpdGllcy9XVFBBY3Rpdml0eUJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MzhlYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5hY3Rpdml0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBBY3Rpdml0eUJyaWRnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJXVFBBY3Rpdml0eUJyaWRnZUhlbHBlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVEVORVJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBXVFBBY3Rpdml0eUJyaWRnZSBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBXVFBBY3Rpdml0eUJyaWRnZUhlbHBlcltdIGxpc3RlbmVyczsKLQotCXB1YmxpYyBzdGF0aWMgV1RQQWN0aXZpdHlCcmlkZ2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChudWxsID09IElOU1RBTkNFKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBXVFBBY3Rpdml0eUJyaWRnZSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIFdUUEFjdGl2aXR5QnJpZGdlKCkgewotCQlsb2FkRXh0ZW5zaW9uUG9pbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlQWN0aXZpdHkoU3RyaW5nIGFjdGl2aXR5SUQsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzW2ldLmVuYWJsZUFjdGl2aXR5KGFjdGl2aXR5SUQsIGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIFNldCBnZXRFbmFibGVkQWN0aXZpdHlJZHMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXJzW2ldLmdldEVuYWJsZWRBY3Rpdml0eUlkcygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZEFjdGl2aXR5SWRzKFNldCBhY3Rpdml0eUlEcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJbGlzdGVuZXJzW2ldLnNldEVuYWJsZWRBY3Rpdml0eUlkcyhhY3Rpdml0eUlEcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFjdGl2aXR5SURzRnJvbUNvbnRyaWJ1dGlvbihTdHJpbmcgbG9jYWxJRCwgU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXJzW2ldLmdldEFjdGl2aXR5SURzRnJvbUNvbnRyaWJ1dGlvbihsb2NhbElELCBwbHVnaW5JRCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvblBvaW50cygpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlsaXN0ZW5lcnMgPSBuZXcgV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXJbZWxlbWVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG51bGwgPT0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKExJU1RFTkVSX0NMQVNTKSkgewotCQkJCWxvZ0Vycm9yKGVsZW1lbnRzW2ldLCAiTm8gIiArIExJU1RFTkVSX0NMQVNTICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbGlzdGVuZXJzW2ldID0gKFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyKSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKExJU1RFTkVSX0NMQVNTKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxvZ0Vycm9yKGVsZW1lbnRzW2ldLCAiRXJyb3IgbG9hZGluZyAiICsgTElTVEVORVJfQ0xBU1MgKyAiOiIgKyBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoTElTVEVORVJfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihidWYudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9hY3Rpdml0aWVzL1dUUEFjdGl2aXR5QnJpZGdlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3OGRmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2FjdGl2aXRpZXMvV1RQQWN0aXZpdHlCcmlkZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmFjdGl2aXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdUUEFjdGl2aXR5QnJpZGdlSGVscGVyIHsKLQotCXB1YmxpYyB2b2lkIGVuYWJsZUFjdGl2aXR5KFN0cmluZyBhY3Rpdml0eUlELCBib29sZWFuIGVuYWJsZWQpOwotCi0JcHVibGljIFNldCBnZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRBY3Rpdml0eUlkcyhTZXQgYWN0aXZpdHlJRHMpOwotCi0JcHVibGljIFNldCBnZXRBY3Rpdml0eUlEc0Zyb21Db250cmlidXRpb24oU3RyaW5nIGxvY2FsSUQsIFN0cmluZyBwbHVnaW5JRCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhZGJjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OID0gIkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0VMRU1FTlQgPSAiRGF0YU1vZGVsUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklORVNfVFlQRV9FTEVNRU5UID0gIlByb3ZpZGVyRGVmaW5lc1R5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVFNfVFlQRV9FTEVNRU5UID0gIlByb3ZpZGVySW1wbGVtZW50c1R5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFID0gInByb3ZpZGVyVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BST1ZJREVSX0lEID0gInByb3ZpZGVySUQiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZHID0gImZ1bmN0aW9uR3JvdXBJRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaE1hcCBwcm92aWRlckV4dGVuc2lvbnM7Ci0JcHJpdmF0ZSBIYXNoTWFwIGRlZmluZXNFeHRlbnNpb25zOwotCXByaXZhdGUgSGFzaE1hcCBpbXBsZW1lbnRzRXh0ZW5zaW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHVibGljIERhdGFNb2RlbEV4dGVuc2lvblJlYWRlcigpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBST1ZJREVSX0VMRU1FTlQpKSB7Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfSUQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1MpOwotCQkJaWYgKG51bGwgPT0gY2xhc3NOYW1lIHx8IGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIFBST1ZJREVSX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9DTEFTUykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJYWRkUHJvdmlkZXJFeHRlbnNpb24oaWQsIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhERUZJTkVTX1RZUEVfRUxFTUVOVCkpIHsKLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX1RZUEUpOwotCQkJaWYgKG51bGwgPT0gdHlwZSB8fCB0eXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfUFJPVklERVJfSUQpOwotCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4dGVuc2lvbjoiICsgRVhURU5TSU9OICsgIiBFbGVtZW50OiIgKyBERUZJTkVTX1RZUEVfRUxFTUVOVCArICIgaXMgbWlzc2luZyAiICsgQVRUUklCVVRFX1BST1ZJREVSX0lEKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlhZGREZWZpbmVzRXh0ZW5zaW9uKHR5cGUsIGlkKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoSU1QTEVNRU5UU19UWVBFX0VMRU1FTlQpKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUk9WSURFUl9UWVBFKTsKLQkJCWlmIChudWxsID09IHR5cGUgfHwgdHlwZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRXh0ZW5zaW9uOiIgKyBFWFRFTlNJT04gKyAiIEVsZW1lbnQ6IiArIERFRklORVNfVFlQRV9FTEVNRU5UICsgIiBpcyBtaXNzaW5nICIgKyBBVFRSSUJVVEVfUFJPVklERVJfVFlQRSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1BST1ZJREVSX0lEKTsKLQkJCWlmIChudWxsID09IGlkIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIGlzIG1pc3NpbmcgIiArIEFUVFJJQlVURV9QUk9WSURFUl9JRCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJYWRkSW1wbGVtZW50c0V4dGVuc2lvbih0eXBlLCBpZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3ZpZGVyRXh0ZW5zaW9uKFN0cmluZyBpZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHByb3ZpZGVyRXh0ZW5zaW9ucy5jb250YWluc0tleShpZCkpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgUnVudGltZUV4Y2VwdGlvbigiRHVwbGljYXRlICIgKyBQUk9WSURFUl9FTEVNRU5UICsgIiAiICsgQVRUUklCVVRFX0lEICsgIiAiICsgaWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlwcm92aWRlckV4dGVuc2lvbnMucHV0KGlkLCBlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVmaW5lc0V4dGVuc2lvbihTdHJpbmcgdHlwZSwgU3RyaW5nIGlkKSB7Ci0JCWlmIChkZWZpbmVzRXh0ZW5zaW9ucy5jb250YWluc0tleSh0eXBlKSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEdXBsaWNhdGUgIiArIFBST1ZJREVSX0VMRU1FTlQgKyAiICIgKyBBVFRSSUJVVEVfUFJPVklERVJfVFlQRSArICIgIiArIHR5cGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlkZWZpbmVzRXh0ZW5zaW9ucy5wdXQodHlwZSwgaWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBsZW1lbnRzRXh0ZW5zaW9uKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJTGlzdCBjYWNoZTsKLQkJaWYgKGltcGxlbWVudHNFeHRlbnNpb25zLmNvbnRhaW5zS2V5KHR5cGUpKQotCQkJY2FjaGUgPSAoTGlzdCkgaW1wbGVtZW50c0V4dGVuc2lvbnMuZ2V0KHR5cGUpOwotCQllbHNlCi0JCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2FjaGUuYWRkKGlkKTsKLQkJaW1wbGVtZW50c0V4dGVuc2lvbnMucHV0KHR5cGUsIGNhY2hlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldFByb3ZpZGVyRXh0ZW5zaW9uKFN0cmluZyBpZCkgewotCQlyZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHByb3ZpZGVyRXh0ZW5zaW9ucy5nZXQoaWQpOwotCQlpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgUFJPVklERVJfRUxFTUVOVCArICIgbm90IGZvdW5kIGZvciAiICsgQVRUUklCVVRFX0lEICsgIjogIiArIGlkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluZXNFeHRlbnNpb24oU3RyaW5nIHByb3ZpZGVyVHlwZSkgewotCQlyZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpOwotCQlTdHJpbmcgZWxlbWVudCA9IChTdHJpbmcpIGRlZmluZXNFeHRlbnNpb25zLmdldChwcm92aWRlclR5cGUpOwotCQlpZiAobnVsbCA9PSBlbGVtZW50KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHRlbnNpb246IiArIEVYVEVOU0lPTiArICIgRWxlbWVudDoiICsgREVGSU5FU19UWVBFX0VMRU1FTlQgKyAiIG5vdCBmb3VuZCBmb3IgIiArIEFUVFJJQlVURV9QUk9WSURFUl9UWVBFICsgIjogIiArIHByb3ZpZGVyVHlwZSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByb3ZpZGVyRGVzY3JpcHRvcnNGb3JQcm92aWRlcktpbmQoU3RyaW5nIHByb3ZpZGVyVHlwZSkgewotCQlyZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpOwotCQlMaXN0IHByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvdmlkZXJMaXN0LmFkZChnZXREZWZpbmVzRXh0ZW5zaW9uKHByb3ZpZGVyVHlwZSkpOwotCQlpZiAoaW1wbGVtZW50c0V4dGVuc2lvbnMuY29udGFpbnNLZXkocHJvdmlkZXJUeXBlKSkgewotCQkJTGlzdCBpbXBsZW1lbnRzSWRzID0gKExpc3QpIGltcGxlbWVudHNFeHRlbnNpb25zLmdldChwcm92aWRlclR5cGUpOwotCQkJaWYgKGltcGxlbWVudHNJZHMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0lkcy5pc0VtcHR5KCkpIHsKLQkJCQlwcm92aWRlckxpc3QuYWRkQWxsKGltcGxlbWVudHNJZHMpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIHByb3ZpZGVyQXJyYXkgPSBuZXcgU3RyaW5nW3Byb3ZpZGVyTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVyQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVyQXJyYXlbaV0gPSAoU3RyaW5nKSBwcm92aWRlckxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlckFycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnlJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKCFoYXNJbml0aWFsaXplZCkgewotCQkJcHJvdmlkZXJFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlZmluZXNFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCWltcGxlbWVudHNFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQkJaGFzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgaWQpIHsKLQkJSURhdGFNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRQcm92aWRlckV4dGVuc2lvbihpZCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyID0gKElEYXRhTW9kZWxQcm92aWRlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJJQlVURV9DTEFTUyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGRjM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIERhdGFNb2RlbEltcGwgaW1wbGVtZW50cyBJRGF0YU1vZGVsLCBJRGF0YU1vZGVsTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PVF9MT0NBVEVEXyA9IFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIwIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX01PREVMX05PVF9MT0NBVEVEID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjEiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gTk9fREVTQ1JJUFRPUlMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGJhc2VQcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBhbGxQcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0eU5hbWVzOyAvLyBsYXppbHkgaW5pdGlhbHplZCB3aGVuIG5lc3RlZCBtb2RlbHMgYWRkZWQKLQlwcml2YXRlIE1hcCBwcm9wZXJ0eVZhbHVlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIE1hcCBuZXN0ZWRNb2RlbHM7Ci0JcHJpdmF0ZSBTZXQgbmVzdGluZ01vZGVsczsKLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsSW1wbChJRGF0YU1vZGVsUHJvdmlkZXIgZGF0YU1vZGVsUHJvdmlkZXIpIHsKLQkJaW5pdChkYXRhTW9kZWxQcm92aWRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoSURhdGFNb2RlbFByb3ZpZGVyIGRhdGFNb2RlbFByb3ZpZGVyKSB7Ci0JCXRoaXMucHJvdmlkZXIgPSBkYXRhTW9kZWxQcm92aWRlcjsKLQkJZGF0YU1vZGVsUHJvdmlkZXIuc2V0RGF0YU1vZGVsKHRoaXMpOwotCQlDb2xsZWN0aW9uIHByb3BlcnR5TmFtZXMgPSBkYXRhTW9kZWxQcm92aWRlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCUhhc2hTZXQgcHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXByb3BlcnRpZXMuYWRkQWxsKHByb3BlcnR5TmFtZXMpOwotCi0JCXByb3BlcnRpZXMuYWRkKElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMpOwotCQlwcm9wZXJ0aWVzLmFkZChJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKTsKLQkJYmFzZVByb3BlcnR5TmFtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHByb3BlcnRpZXMpOwotCQlhbGxQcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJYWxsUHJvcGVydHlOYW1lcy5hZGRBbGwoYmFzZVByb3BlcnR5TmFtZXMpOwotCQlkYXRhTW9kZWxQcm92aWRlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCYXNlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gYmFzZVByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRCYXNlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oYmFzZVByb3BlcnR5TmFtZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gYWxsUHJvcGVydHlOYW1lcy5jb250YWlucyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGFsbFByb3BlcnR5TmFtZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbCAhPSBuZXN0ZWRQcm9wZXJ0eU5hbWVzICYmIG5lc3RlZFByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihuZXN0ZWRQcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tWYWxpZFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihQUk9QRVJUWV9OT1RfTE9DQVRFRF8gKyBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEYXRhTW9kZWxJbXBsIGdldE93bmluZ0RhdGFNb2RlbChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWNoZWNrVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHNlYXJjaE5lc3RlZE1vZGVscyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgRGF0YU1vZGVsSW1wbCBzZWFyY2hOZXN0ZWRNb2RlbHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoaXNCYXNlUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0gZWxzZSBpZiAobmVzdGVkTW9kZWxzICE9IG51bGwpIHsKLQkJCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gbnVsbDsKLQkJCU9iamVjdFtdIGtleXMgPSBuZXN0ZWRNb2RlbHMua2V5U2V0KCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGF0YU1vZGVsID0gKERhdGFNb2RlbEltcGwpIG5lc3RlZE1vZGVscy5nZXQoa2V5c1tpXSk7Ci0JCQkJaWYgKGRhdGFNb2RlbC5pc1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGRhdGFNb2RlbC5zZWFyY2hOZXN0ZWRNb2RlbHMocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oUFJPUEVSVFlfTk9UX0xPQ0FURURfICsgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJaWYgKGRhdGFNb2RlbC5wcm9wZXJ0eVZhbHVlcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZGF0YU1vZGVsLnByb3BlcnR5VmFsdWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3ZpZGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlPYmplY3QgcHJvcCA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAoKEludGVnZXIpIHByb3ApLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJT2JqZWN0IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBwcm9wKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJT2JqZWN0IHByb3AgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoU3RyaW5nKSBwcm9wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3BlcnR5VmFsdWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGF0YU1vZGVsLnByb3ZpZGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlkYXRhTW9kZWwuaW50ZXJuYWxTZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHByb3BlcnR5VmFsdWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWVDaGFuZ2VkKHByb3BlcnR5VmFsdWUsIG9sZFZhbHVlKSkgewotCQkJaWYgKG51bGwgIT0gcHJvcGVydHlWYWx1ZSkKLQkJCQlwcm9wZXJ0eVZhbHVlcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCWVsc2UgaWYgKHByb3BlcnR5VmFsdWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpCi0JCQkJcHJvcGVydHlWYWx1ZXMucmVtb3ZlKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSkgewotCQkJCW5vdGlmeVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJcmV0dXJuIG8xICE9IG8yICYmICgobzEgIT0gbnVsbCAmJiAhbzEuZXF1YWxzKG8yKSkgfHwgIW8yLmVxdWFscyhvMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCB2YWx1ZSkgewotCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCAodmFsdWUpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZE5lc3RlZE1vZGVsKFN0cmluZyBtb2RlbE5hbWUsIElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCWlmICh0aGlzID09IGRhdGFNb2RlbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChudWxsID09IG5lc3RlZE1vZGVscykgewotCQkJbmVzdGVkTW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJbmVzdGVkUHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCX0KLQkJRGF0YU1vZGVsSW1wbCBuZXN0ZWREYXRhTW9kZWwgPSAoRGF0YU1vZGVsSW1wbCkgZGF0YU1vZGVsOwotCQlpZiAobnVsbCA9PSBuZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscykgewotCQkJbmVzdGVkRGF0YU1vZGVsLm5lc3RpbmdNb2RlbHMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWlmIChuZXN0ZWREYXRhTW9kZWwubmVzdGluZ01vZGVscy5jb250YWlucyh0aGlzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCW5lc3RlZERhdGFNb2RlbC5uZXN0aW5nTW9kZWxzLmFkZCh0aGlzKTsKLQotCQluZXN0ZWRNb2RlbHMucHV0KG1vZGVsTmFtZSwgbmVzdGVkRGF0YU1vZGVsKTsKLQotCQlhZGROZXN0ZWRQcm9wZXJ0aWVzKG5lc3RlZERhdGFNb2RlbC5hbGxQcm9wZXJ0eU5hbWVzKTsKLQkJbmVzdGVkRGF0YU1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGVkUHJvcGVydGllcyhDb2xsZWN0aW9uIG5lc3RlZFByb3BlcnRpZXMpIHsKLQkJYm9vbGVhbiBwcm9wZXJ0aWVzQWRkZWQgPSBhbGxQcm9wZXJ0eU5hbWVzLmFkZEFsbChuZXN0ZWRQcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllc0FkZGVkID0gbmVzdGVkUHJvcGVydHlOYW1lcy5hZGRBbGwobmVzdGVkUHJvcGVydGllcykgfHwgcHJvcGVydGllc0FkZGVkOwotCQkvLyBQYXNzIHRoZSBuZXcgcHJvcGVydGllcyB1cCB0aGUgbmVzdGluZyBjaGFpbgotCQlpZiAocHJvcGVydGllc0FkZGVkICYmIG5lc3RpbmdNb2RlbHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXN0aW5nTW9kZWxzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJKChEYXRhTW9kZWxJbXBsKSBpdGVyYXRvci5uZXh0KCkpLmFkZE5lc3RlZFByb3BlcnRpZXMobmVzdGVkUHJvcGVydGllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbHMoKSB7Ci0JCXJldHVybiBuZXN0ZWRNb2RlbHMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGVkTW9kZWxzLnZhbHVlcygpKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXN0ZWRNb2RlbE5hbWVzKCkgewotCQlyZXR1cm4gbmVzdGVkTW9kZWxzICE9IG51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5lc3RlZE1vZGVscy5rZXlTZXQoKSkgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmVzdGluZ01vZGVscygpIHsKLQkJcmV0dXJuIG5lc3RpbmdNb2RlbHMgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmVzdGluZ01vZGVscykgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgcmVtb3ZlTmVzdGVkTW9kZWwoU3RyaW5nIG1vZGVsTmFtZSkgewotCQlpZiAoIWlzTmVzdGVkTW9kZWwobW9kZWxOYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGF0YU1vZGVsSW1wbCBtb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBuZXN0ZWRNb2RlbHMucmVtb3ZlKG1vZGVsTmFtZSk7Ci0JCW1vZGVsLm5lc3RpbmdNb2RlbHMucmVtb3ZlKHRoaXMpOwotCQlyZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKG1vZGVsLmFsbFByb3BlcnR5TmFtZXMpOwotCQltb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG5lc3RlZE1vZGVscy5pc0VtcHR5KCkpIHsKLQkJCW5lc3RlZE1vZGVscyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKENvbGxlY3Rpb24gbmVzdGVkUHJvcGVydGllcykgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG5lc3RlZFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKLQkJYm9vbGVhbiBrZWVwUHJvcGVydHkgPSBmYWxzZTsKLQkJU2V0IG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWtlZXBQcm9wZXJ0eSA9IGZhbHNlOwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoYmFzZVByb3BlcnR5TmFtZXMuY29udGFpbnMocHJvcGVydHkpKSB7Ci0JCQkJa2VlcFByb3BlcnR5ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgha2VlcFByb3BlcnR5ICYmIG5lc3RlZE1vZGVscyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgbmVzdGVkTW9kZWxzSXRlcmF0b3IgPSBuZXN0ZWRNb2RlbHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoIWtlZXBQcm9wZXJ0eSAmJiBuZXN0ZWRNb2RlbHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJRGF0YU1vZGVsSW1wbCBuZXN0ZWRNb2RlbCA9IChEYXRhTW9kZWxJbXBsKSBuZXN0ZWRNb2RlbHNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChuZXN0ZWRNb2RlbC5pc1Byb3BlcnR5KHByb3BlcnR5KSkgewotCQkJCQkJa2VlcFByb3BlcnR5ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgha2VlcFByb3BlcnR5KSB7Ci0JCQkJaWYgKG51bGwgPT0gbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKSB7Ci0JCQkJCW5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCW5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZS5hZGQocHJvcGVydHkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG51bGwgIT0gbmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKSB7Ci0JCQlhbGxQcm9wZXJ0eU5hbWVzLnJlbW92ZUFsbChuZXN0ZWRQcm9wZXJ0aWVzVG9SZW1vdmUpOwotCQkJbmVzdGVkUHJvcGVydHlOYW1lcy5yZW1vdmVBbGwobmVzdGVkUHJvcGVydGllc1RvUmVtb3ZlKTsKLQkJCWlmIChuZXN0aW5nTW9kZWxzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBuZXN0aW5nTW9kZWxzSXRlcmF0b3IgPSBuZXN0aW5nTW9kZWxzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG5lc3RpbmdNb2RlbHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJKChEYXRhTW9kZWxJbXBsKSBuZXN0aW5nTW9kZWxzSXRlcmF0b3IubmV4dCgpKS5yZW1vdmVOZXN0ZWRQcm9wZXJ0aWVzKG5lc3RlZFByb3BlcnRpZXNUb1JlbW92ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lKSB7Ci0JCXJldHVybiBtb2RlbE5hbWUgIT0gbnVsbCAmJiBudWxsICE9IG5lc3RlZE1vZGVscyAmJiBuZXN0ZWRNb2RlbHMuY29udGFpbnNLZXkobW9kZWxOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbCBnZXROZXN0ZWRNb2RlbChTdHJpbmcgbW9kZWxOYW1lKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKG51bGwgIT0gbmVzdGVkTW9kZWxzICYmIG51bGwgIT0gbW9kZWxOYW1lKSA/IChJRGF0YU1vZGVsKSBuZXN0ZWRNb2RlbHMuZ2V0KG1vZGVsTmFtZSkgOiBudWxsOwotCQlpZiAobnVsbCA9PSBkYXRhTW9kZWwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE5FU1RFRF9NT0RFTF9OT1RfTE9DQVRFRCArIG1vZGVsTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJRGF0YU1vZGVsSW1wbCBkYXRhTW9kZWwgPSBnZXRPd25pbmdEYXRhTW9kZWwocHJvcGVydHlOYW1lKTsKLQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBkYXRhTW9kZWwucHJvdmlkZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9ycyA9PSBudWxsID8gTk9fREVTQ1JJUFRPUlMgOiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCURhdGFNb2RlbEltcGwgZGF0YU1vZGVsID0gZ2V0T3duaW5nRGF0YU1vZGVsKHByb3BlcnR5TmFtZSk7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGF0YU1vZGVsLnByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZGVzY3JpcHRvciA9PSBudWxsID8gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSA6IGRlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5UHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGZsYWcpIHsKLQkJaWYgKGZsYWcgPT0gREVGQVVMVF9DSEcpIHsKLQkJCWlmIChpc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmbGFnID0gVkFMVUVfQ0hHOwotCQl9Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgRGF0YU1vZGVsRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBmbGFnKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwgJiYgIWxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCUlEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJbGlzdGVuZXIgPSAoSURhdGFNb2RlbExpc3RlbmVyKSBsaXN0ZW5lcnMuZ2V0KGkpOwotCQkJCWlmIChsaXN0ZW5lciAhPSBldmVudC5nZXREYXRhTW9kZWwoKSkgewotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoYm9vbGVhbiBzdG9wT25GaXJzdEZhaWx1cmUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJU3RhdHVzIHByb3BTdGF0dXM7Ci0JCVN0cmluZyBwcm9wTmFtZTsKLQkJSXRlcmF0b3IgaXQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlpdCA9IGJhc2VQcm9wZXJ0eU5hbWVzLml0ZXJhdG9yKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWl0ID0gZ2V0TmVzdGVkTW9kZWxOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcHJvcE5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJcHJvcFN0YXR1cyA9IHByb3ZpZGVyLnZhbGlkYXRlKHByb3BOYW1lKTsKLQkJCQlpZiAocHJvcFN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJCQkJc3RhdHVzID0gcHJvcFN0YXR1czsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLQkJCQkJCQkoKE11bHRpU3RhdHVzKSBzdGF0dXMpLm1lcmdlKHByb3BTdGF0dXMpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbCIsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbXVsdGkubWVyZ2Uoc3RhdHVzKTsKLQkJCQkJCQltdWx0aS5tZXJnZShwcm9wU3RhdHVzKTsKLQkJCQkJCQlzdGF0dXMgPSBtdWx0aTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoc3RvcE9uRmlyc3RGYWlsdXJlICYmIHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfSBlbHNlIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElEYXRhTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbCkKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBkb2Vzbid0IGhhdmUgYW55IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWRhdGUodHJ1ZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlWYWxpZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB2YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlEYXRhTW9kZWxJbXBsIGRhdGFNb2RlbCA9IGdldE93bmluZ0RhdGFNb2RlbChwcm9wZXJ0eU5hbWUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGRhdGFNb2RlbC5wcm92aWRlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gc3RhdHVzID09IG51bGwgPyBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTIDogc3RhdHVzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkQ29udGV4dCgpIHsKLQkJTGlzdCBleHRlbmRlZENvbnRleHQgPSBwcm92aWRlci5nZXRFeHRlbmRlZENvbnRleHQoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQ29udGV4dCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGV4dGVuZGVkQ29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0UmF3T3BlcmF0aW9uKCkgewotCQlJRGF0YU1vZGVsT3BlcmF0aW9uIHByb3ZpZGVyT3AgPSBwcm92aWRlci5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCWlmIChudWxsID09IHByb3ZpZGVyT3ApIHsKLQkJCXByb3ZpZGVyT3AgPSBuZXcgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24odGhpcykgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyT3A7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwoZ2V0UmF3T3BlcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSURhdGFNb2RlbCwgcHJvdmlkZXI9IiArIHByb3ZpZGVyLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlTdHJpbmcgaWQgPSBwcm92aWRlci5nZXRJRCgpOwotCQlyZXR1cm4gbnVsbCAhPSBpZCA/IGlkIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOGFkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9EYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgewotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQlwcml2YXRlIGludCBvcGVyYXRpb25UeXBlOwotCXByaXZhdGUgaW50IGV4ZWN1dGlvblR5cGU7Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24sIGludCBvcGVyYXRpb25UeXBlLCBpbnQgZXhlY3V0aW9uVHlwZSkgewotCQl0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLQkJdGhpcy5vcGVyYXRpb25UeXBlID0gb3BlcmF0aW9uVHlwZTsKLQkJdGhpcy5leGVjdXRpb25UeXBlID0gZXhlY3V0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBvcGVyYXRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRPcGVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gb3BlcmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV4ZWN1dGlvblR5cGUoKSB7Ci0JCXJldHVybiBleGVjdXRpb25UeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0RhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYmM0YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwgZXh0ZW5kcyBXcmFwcGVkT3BlcmF0aW9uIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIHsKLQotCS8vIFN0YWNrIG9mIFN0YWNrRW50cmllcyB0byBiZSBleGVjdXRlZAotCXByb3RlY3RlZCBTdGFjayBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZSA9IG51bGw7Ci0KLQkvLyBTdGFjayBvZiBTdGFja0VudHJpZXMgYWxyZWFkeSBleGVjdXRlZAotCXByb3RlY3RlZCBTdGFjayB1bmRvU3RhY2sgPSBudWxsOwotCXByb3RlY3RlZCBTdGFjayByZWRvU3RhY2sgPSBudWxsOwotCi0JcHJvdGVjdGVkIE9wZXJhdGlvblN0YWNrRW50cnkgcm9vdFN0YWNrRW50cnkgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Qgb3BlcmF0aW9uTGlzdGVuZXJzOwotCi0JcHJvdGVjdGVkIGludCBleGVjdXRpb25TdGF0ZSA9IE5PVF9TVEFSVEVEOwotCi0JcHVibGljIERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbChJRGF0YU1vZGVsT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24pIHsKLQkJc3VwZXIocm9vdE9wZXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpIHsKLQkJaWYgKG51bGwgPT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlvcGVyYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJb3BlcmF0aW9uTGlzdGVuZXJzLmFkZChvcGVyYXRpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpIHsKLQkJaWYgKG51bGwgIT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlvcGVyYXRpb25MaXN0ZW5lcnMucmVtb3ZlKG9wZXJhdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uU3RhdGUoKSB7Ci0JCXJldHVybiBleGVjdXRpb25TdGF0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFWEVDVVRFX0lNUEwgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVORE9fSU1QTCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVET19JTVBMID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBST0xMQkFDS19JTVBMID0gMzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRVNVTUVfSU1QTCA9IDQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByb3RlY3RlZCBJU3RhdHVzIGNhY2hlVGhyZWFkQW5kQ29udGludWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8sIGludCBydW5UeXBlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQlmaW5hbCBib29sZWFuIGlzVG9wTGV2ZWxPcGVyYXRpb24gPSAhdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5jb250YWluc0tleShjdXJyZW50VGhyZWFkKTsKLQkJdHJ5IHsKLQkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKSB7Ci0JCQkJdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5wdXQoY3VycmVudFRocmVhZCwgdGhpcyk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHJ1blR5cGUpIHsKLQkJCQljYXNlIEVYRUNVVEVfSU1QTCA6Ci0JCQkJCXJldHVybiBleGVjdXRlSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFVORE9fSU1QTCA6Ci0JCQkJCXJldHVybiB1bmRvSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFJFRE9fSU1QTCA6Ci0JCQkJCXJldHVybiByZWRvSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCQljYXNlIFJPTExCQUNLX0lNUEwgOgotCQkJCQlyZXR1cm4gcm9sbEJhY2tJbXBsKG1vbml0b3IsIGluZm8pOwotCQkJCWNhc2UgUkVTVU1FX0lNUEwgOgotCQkJCQlyZXR1cm4gcmVzdW1lSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpc1RvcExldmVsT3BlcmF0aW9uKSB7Ci0JCQkJdGhyZWFkVG9FeHRlbmRlZE9wQ29udHJvbC5yZW1vdmUoY3VycmVudFRocmVhZCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZXN1bWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBSRVNVTUVfSU1QTCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVzdW1lSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZXhlY3V0aW9uU3RhdGUpIHsKLQkJCWNhc2UgTk9UX1NUQVJURUQgOgotCQkJCXJldHVybiBleGVjdXRlSW1wbChtb25pdG9yLCBpbmZvKTsKLQkJCWNhc2UgUEFVU0VEX0VYRUNVVEUgOgotCQkJY2FzZSBDT01QTEVURV9ST0xMQkFDSyA6Ci0JCQkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJCWNhc2UgUEFVU0VEX1VORE8gOgotCQkJCXJldHVybiBkb1VuZG8obW9uaXRvciwgaW5mbyk7Ci0JCQljYXNlIFBBVVNFRF9SRURPIDoKLQkJCQlyZXR1cm4gcmVkb0ltcGwobW9uaXRvciwgaW5mbyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gKENPTVBMRVRFX1VORE8gPT0gZXhlY3V0aW9uU3RhdGUpICYmIHN1cGVyLmNhblJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgUkVET19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByZWRvSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlyZXR1cm4gZG9SZWRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGRvUmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQl0cnkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSBSVU5OSU5HX1JFRE87Ci0JCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCWludCBzaG91bGRDb250aW51ZSA9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCQkJd2hpbGUgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFID09IHNob3VsZENvbnRpbnVlICYmICFyZWRvU3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIHJlZG9TdGFjay5wZWVrKCk7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBzdGFja0VudHJ5LmdldE9wZXJhdGlvbigpOwotCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdW5kb1N0YWNrLnB1c2gocmVkb1N0YWNrLnBvcCgpKTsKLQkJCQlyZXR1cm5TdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5SRURPLCByZXR1cm5TdGF0dXMpOwotCQkJCWV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKG9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTUFJTl9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuUkVETyk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCi0JCQl9Ci0JCQlyZXR1cm4gcmV0dXJuU3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogcmV0dXJuU3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJZXhlY3V0aW9uU3RhdGUgPSByZWRvU3RhY2suaXNFbXB0eSgpID8gQ09NUExFVEVfUkVETyA6IFBBVVNFRF9SRURPOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIChleGVjdXRpb25TdGF0ZSA9PSBDT01QTEVURV9FWEVDVVRFIHx8IGV4ZWN1dGlvblN0YXRlID09IENPTVBMRVRFX1JFRE8pICYmIHN1cGVyLmNhblVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNhY2hlVGhyZWFkQW5kQ29udGludWUobW9uaXRvciwgaW5mbywgVU5ET19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB1bmRvSW1wbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlyZWRvU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJcmV0dXJuIGRvVW5kbyhtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1VuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19VTkRPOwotCQkJT3BlcmF0aW9uU3RhdHVzIHJldHVyblN0YXR1cyA9IG51bGw7Ci0JCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCXdoaWxlIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRSA9PSBzaG91bGRDb250aW51ZSAmJiAhdW5kb1N0YWNrLmlzRW1wdHkoKSkgewotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSB1bmRvU3RhY2sucGVlaygpOwotCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKTsKLQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJlZG9TdGFjay5wdXNoKHVuZG9TdGFjay5wb3AoKSk7Ci0JCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETywgcmV0dXJuU3RhdHVzKTsKLQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChvcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fRklOSVNIRUQsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8pOwotCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQotCQkJfQotCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gdW5kb1N0YWNrLmlzRW1wdHkoKSA/IENPTVBMRVRFX1VORE8gOiBQQVVTRURfVU5ETzsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBFWEVDVVRFX0lNUEwpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGV4ZWN1dGVJbXBsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19FWEVDVVRFOwotCQkJdW5kb1N0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZSA9IG5ldyBTdGFjaygpOwotCQkJcm9vdFN0YWNrRW50cnkgPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeShudWxsLCByb290T3BlcmF0aW9uKTsKLQkJCW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLnB1c2gocm9vdFN0YWNrRW50cnkpOwotCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwocm9vdE9wZXJhdGlvbiwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9TVEFSVElORywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KSkgewotCQkJCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuaXNFbXB0eSgpID8gQ09NUExFVEVfRVhFQ1VURSA6IFBBVVNFRF9FWEVDVVRFOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMgPSBudWxsOwotCQkJaW50IHNob3VsZENvbnRpbnVlID0gSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUU7Ci0JCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIW9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmlzRW1wdHkoKSkgewotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgc3RhY2tFbnRyeSA9IChPcGVyYXRpb25TdGFja0VudHJ5KSBvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wZWVrKCk7Ci0JCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBwcmVTdGFja0VudHJ5ID0gc3RhY2tFbnRyeS5nZXROZXh0UHJlT3BlcmF0aW9uKCk7Ci0JCQkJaWYgKG51bGwgIT0gcHJlU3RhY2tFbnRyeSkgewotCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wdXNoKHByZVN0YWNrRW50cnkpOwotCQkJCQlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbCBldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChwcmVTdGFja0VudHJ5LmdldE9wZXJhdGlvbigpLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBzdGFja0VudHJ5T3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb25Gb3JFeGVjdXRpb24oKTsKLQkJCQlpZiAobnVsbCAhPSBzdGFja0VudHJ5T3BlcmF0aW9uKSB7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHN0YWNrRW50cnlPcGVyYXRpb24sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50Lk1BSU5fU1RBUlRJTkcsIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUpOwotCQkJCQlzaG91bGRDb250aW51ZSA9IG5vdGlmeU9wZXJhdGlvbkxpc3RlbmVycyhldmVudCk7Ci0JCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBzaG91bGRDb250aW51ZSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKHN0YWNrRW50cnlPcGVyYXRpb24sIG1vbml0b3IsIGluZm8sIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUsIHJldHVyblN0YXR1cyk7Ci0JCQkJCXVuZG9TdGFjay5wdXNoKHN0YWNrRW50cnkpOwotCQkJCQlldmVudCA9IG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50SW1wbChzdGFja0VudHJ5T3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQlpZiAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuUEFVU0UgPT0gc2hvdWxkQ29udGludWUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgcG9zdFN0YWNrRW50cnkgPSBzdGFja0VudHJ5LmdldE5leHRQb3N0T3BlcmF0aW9uKCk7Ci0JCQkJaWYgKG51bGwgIT0gcG9zdFN0YWNrRW50cnkpIHsKLQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChwb3N0U3RhY2tFbnRyeSk7Ci0JCQkJCURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsIGV2ZW50ID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnRJbXBsKHBvc3RTdGFja0VudHJ5LmdldE9wZXJhdGlvbigpLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5OT0RFX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucG9wKCk7Ci0JCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwoc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKSwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuTk9ERV9GSU5JU0hFRCwgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJc2hvdWxkQ29udGludWUgPSBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoZXZlbnQpOwotCQkJfQotCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4ZWN1dGlvblN0YXRlID0gb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUuaXNFbXB0eSgpID8gQ09NUExFVEVfRVhFQ1VURSA6IFBBVVNFRF9FWEVDVVRFOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gY2FjaGVUaHJlYWRBbmRDb250aW51ZShtb25pdG9yLCBpbmZvLCBST0xMQkFDS19JTVBMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyByb2xsQmFja0ltcGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlpZiAoUEFVU0VEX0VYRUNVVEUgPT0gZXhlY3V0aW9uU3RhdGUgfHwgUEFVU0VEX1JPTExCQUNLID09IGV4ZWN1dGlvblN0YXRlKSB7Ci0JCQl0cnkgewotCQkJCWV4ZWN1dGlvblN0YXRlID0gUlVOTklOR19ST0xMQkFDSzsKLQkJCQlPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzID0gbnVsbDsKLQkJCQlpbnQgc2hvdWxkQ29udGludWUgPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5DT05USU5VRTsKLQkJCQl3aGlsZSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIuQ09OVElOVUUgPT0gc2hvdWxkQ29udGludWUgJiYgIXVuZG9TdGFjay5pc0VtcHR5KCkpIHsKLQkJCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBzdGFja0VudHJ5ID0gKE9wZXJhdGlvblN0YWNrRW50cnkpIHVuZG9TdGFjay5wZWVrKCk7Ci0JCQkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gc3RhY2tFbnRyeS5nZXRPcGVyYXRpb24oKTsKLQkJCQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX1NUQVJUSU5HLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5ST0xMQkFDSyk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQkJaWYgKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLlBBVVNFID09IHNob3VsZENvbnRpbnVlKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQl1bmRvU3RhY2sucG9wKCk7Ci0JCQkJCU9wZXJhdGlvblN0YWNrRW50cnkgZXhlY3V0aW9uVG9wU3RhY2tFbnRyeSA9IHN0YWNrRW50cnkucm9sbEJhY2tPbmVPcGVyYXRpb24oKTsKLQkJCQkJaWYgKG9wZXJhdGlvblN0YWNrVG9FeGVjdXRlLmNvbnRhaW5zKGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpKSB7Ci0JCQkJCQl3aGlsZSAob3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucGVlaygpICE9IGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpIHsKLQkJCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wb3AoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0YWNrIHBhcmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCQkJCQlwYXJlbnRTdGFjay5wdXNoKGV4ZWN1dGlvblRvcFN0YWNrRW50cnkpOwotCQkJCQkJT3BlcmF0aW9uU3RhY2tFbnRyeSBlbnRyeSA9IGV4ZWN1dGlvblRvcFN0YWNrRW50cnkucGFyZW50OwotCQkJCQkJd2hpbGUgKCFvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5jb250YWlucyhlbnRyeSkpIHsKLQkJCQkJCQlwYXJlbnRTdGFjay5wdXNoKGVudHJ5KTsKLQkJCQkJCQllbnRyeSA9IGVudHJ5LnBhcmVudDsKLQkJCQkJCX0KLQkJCQkJCXdoaWxlIChvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wZWVrKCkgIT0gZW50cnkpIHsKLQkJCQkJCQlvcGVyYXRpb25TdGFja1RvRXhlY3V0ZS5wb3AoKTsKLQkJCQkJCX0KLQkJCQkJCXdoaWxlICghcGFyZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3BlcmF0aW9uU3RhY2tUb0V4ZWN1dGUucHVzaChwYXJlbnRTdGFjay5wb3AoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuU3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuVU5ETywgcmV0dXJuU3RhdHVzKTsKLQkJCQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwob3BlcmF0aW9uLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5NQUlOX0ZJTklTSEVELCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5ST0xMQkFDSyk7Ci0JCQkJCXNob3VsZENvbnRpbnVlID0gbm90aWZ5T3BlcmF0aW9uTGlzdGVuZXJzKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldHVyblN0YXR1cyA9PSBudWxsID8gU3RhdHVzLk9LX1NUQVRVUyA6IHJldHVyblN0YXR1czsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZXhlY3V0aW9uU3RhdGUgPSB1bmRvU3RhY2suaXNFbXB0eSgpID8gQ09NUExFVEVfUk9MTEJBQ0sgOiBQQVVTRURfUk9MTEJBQ0s7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBub3RpZnlPcGVyYXRpb25MaXN0ZW5lcnMoRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudEltcGwgZXZlbnQpIHsKLQkJaWYgKG51bGwgIT0gb3BlcmF0aW9uTGlzdGVuZXJzKSB7Ci0JCQlJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJCWxpc3RlbmVyID0gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyKSBvcGVyYXRpb25MaXN0ZW5lcnMuZ2V0KGkpOwotCQkJCWlmIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRSA9PSBsaXN0ZW5lci5ub3RpZnkoZXZlbnQpKSB7Ci0JCQkJCXJldHVybiBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5QQVVTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLkNPTlRJTlVFOwotCX0KLQotCXByb3RlY3RlZCBPcGVyYXRpb25TdGF0dXMgYWRkU3RhdHVzKE9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChyZXR1cm5TdGF0dXMgPT0gbnVsbCkgewotCQkJcmV0dXJuU3RhdHVzID0gbmV3IE9wZXJhdGlvblN0YXR1cyhzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuU3RhdHVzLnNldFNldmVyaXR5KHN0YXR1cy5nZXRTZXZlcml0eSgpKTsKLQkJCXJldHVyblN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVyblN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgT3BlcmF0aW9uU3RhdHVzIGFkZEV4dGVuZGVkU3RhdHVzKE9wZXJhdGlvblN0YXR1cyByZXR1cm5TdGF0dXMsIElTdGF0dXMgYVN0YXR1cykgewotCQlpZiAocmV0dXJuU3RhdHVzID09IG51bGwpIHsKLQkJCXJldHVyblN0YXR1cyA9IG5ldyBPcGVyYXRpb25TdGF0dXMobmV3IElTdGF0dXNbXXtXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTfSk7Ci0JCX0KLQkJcmV0dXJuU3RhdHVzLmFkZEV4dGVuZGVkU3RhdHVzKGFTdGF0dXMpOwotCQlyZXR1cm4gcmV0dXJuU3RhdHVzOwotCX0KLQotCXByaXZhdGUgT3BlcmF0aW9uU3RhdHVzIHJ1bk9wZXJhdGlvbihmaW5hbCBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJQWRhcHRhYmxlIGluZm8sIGZpbmFsIGludCBleGVjdXRpb25UeXBlLCBPcGVyYXRpb25TdGF0dXMgcmV0dXJuU3RhdHVzKSB7Ci0JCWlmIChyb290T3BlcmF0aW9uID09IG9wZXJhdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBydW5PcGVyYXRpb24ob3BlcmF0aW9uLCBtb25pdG9yLCBpbmZvLCBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5FWEVDVVRFKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVyblN0YXR1cyA9IGFkZFN0YXR1cyhyZXR1cm5TdGF0dXMsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gcnVuT3BlcmF0aW9uKG9wZXJhdGlvbiwgbW9uaXRvciwgaW5mbywgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuRVhFQ1VURSk7Ci0JCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVyblN0YXR1cyA9IGFkZEV4dGVuZGVkU3RhdHVzKHJldHVyblN0YXR1cywgc3RhdHVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyNSIsIG5ldyBPYmplY3RbXXtvcGVyYXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm5TdGF0dXMgPSBhZGRFeHRlbmRlZFN0YXR1cyhyZXR1cm5TdGF0dXMsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldHVyblN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgcnVuT3BlcmF0aW9uKGZpbmFsIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbywgZmluYWwgaW50IGV4ZWN1dGlvblR5cGUpIHsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyB3b3Jrc3BhY2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzKGluZm8pIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoIChleGVjdXRpb25UeXBlKSB7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LkVYRUNVVEUgOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi5leGVjdXRlKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlVORE8gOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi51bmRvKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50LlJFRE8gOgotCQkJCQkJCXRoaXMuc2V0U3RhdHVzKG9wZXJhdGlvbi5yZWRvKHBtLCBpbmZvKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKG51bGwgPT0gdGhpcy5nZXRTdGF0dXMoKSkgewotCQkJCQkJdGhpcy5zZXRTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aGlzLnNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBvcGVyYXRpb24uZ2V0U2NoZWR1bGluZ1J1bGUoKTsKLQkJaWYgKG51bGwgPT0gcnVsZSkgewotCQkJcnVsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgcnVsZSwgb3BlcmF0aW9uLmdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCksIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXdvcmtzcGFjZVJ1bm5hYmxlLnNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdUUENvbW1vblBsdWdpbi5QTFVHSU5fSUQsIDAsIFdUUFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjI1IiwgbmV3IE9iamVjdFtde29wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKX0pLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlUnVubmFibGUuZ2V0U3RhdHVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE9wZXJhdGlvblN0YWNrRW50cnkgewotCi0JCXByaXZhdGUgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb247Ci0JCXByaXZhdGUgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb25Gb3JFeGVjdXRpb247Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCQlwcml2YXRlIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIgZXh0T3BIb2xkZXIgPSBudWxsOwotCi0JCXByaXZhdGUgaW50IHByZU9wSW5kZXggPSAwOwotCQlwcml2YXRlIGludCBwb3N0T3BJbmRleCA9IDA7Ci0KLQkJcHJpdmF0ZSBPcGVyYXRpb25TdGFja0VudHJ5W10gcHJlT3BTdGFja0VudHJpZXMgPSBudWxsOwotCQlwcml2YXRlIE9wZXJhdGlvblN0YWNrRW50cnlbXSBwb3N0T3BTdGFja0VudHJpZXMgPSBudWxsOwotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IHBhcmVudCA9IG51bGw7Ci0KLQkJcHVibGljIE9wZXJhdGlvblN0YWNrRW50cnkoT3BlcmF0aW9uU3RhY2tFbnRyeSBwYXJlbnQsIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotCQkJdGhpcy5vcGVyYXRpb25Gb3JFeGVjdXRpb24gPSBvcGVyYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgT3BlcmF0aW9uU3RhY2tFbnRyeSByb2xsQmFja09uZU9wZXJhdGlvbigpIHsKLQkJCXBvc3RPcEluZGV4ID0gMDsKLQkJCW9wZXJhdGlvbkZvckV4ZWN1dGlvbiA9IG9wZXJhdGlvbjsKLQkJCWlmIChwcmVPcEluZGV4ID09IDAgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFyZW50LnJvbGxCYWNrRXh0ZW5kZWQodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXByaXZhdGUgT3BlcmF0aW9uU3RhY2tFbnRyeSByb2xsQmFja0V4dGVuZGVkKE9wZXJhdGlvblN0YWNrRW50cnkgZXh0ZW5kZWRFbnRyeSkgewotCQkJd2hpbGUgKHBvc3RPcEluZGV4ID4gMCkgewotCQkJCWludCBpbmRleCA9IC0tcG9zdE9wSW5kZXg7Ci0JCQkJaWYgKHBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPT0gZXh0ZW5kZWRFbnRyeSkgewotCQkJCQlwb3N0T3BTdGFja0VudHJpZXNbaW5kZXhdID0gbnVsbDsKLQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHByZU9wSW5kZXggPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gLS1wcmVPcEluZGV4OwotCQkJCWlmIChwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPT0gZXh0ZW5kZWRFbnRyeSkgewotCQkJCQlwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPSBudWxsOwotCQkJCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCQkJcmV0dXJuIHRoaXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobnVsbCAhPSBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gcGFyZW50LnJvbGxCYWNrRXh0ZW5kZWQodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IGdldE5leHRQcmVPcGVyYXRpb24oKSB7Ci0JCQlpZiAoIWV4dGVuZGVkT3BzSW5pdGlhbGl6ZWQpIHsKLQkJCQlpbml0RXh0ZW5kZWRPcHMoKTsKLQkJCX0KLQkJCWlmIChleHRPcEhvbGRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlMaXN0IG9wcyA9IGV4dE9wSG9sZGVyLmdldFByZU9wcygpOwotCQkJaWYgKG9wcyA9PSBudWxsIHx8IG9wcy5zaXplKCkgPD0gcHJlT3BJbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQl3aGlsZSAocHJlT3BJbmRleCA8IG9wcy5zaXplKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBwcmVPcEluZGV4Kys7Ci0JCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IChJRGF0YU1vZGVsT3BlcmF0aW9uKSBvcHMuZ2V0KGluZGV4KTsKLQkJCQlpZiAoc2hvdWxkRXhlY3V0ZUV4dGVuZGVkKG9wLmdldElEKCkpKSB7Ci0JCQkJCW9wLnNldERhdGFNb2RlbChnZXREYXRhTW9kZWwoKSk7Ci0JCQkJCW9wLnNldEVudmlyb25tZW50KGdldEVudmlyb25tZW50KCkpOwotCQkJCQlwcmVPcFN0YWNrRW50cmllc1tpbmRleF0gPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeSh0aGlzLCBvcCk7Ci0JCQkJCXJldHVybiBwcmVPcFN0YWNrRW50cmllc1tpbmRleF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGdldE9wZXJhdGlvbklEKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbklEKCkgewotCQkJcmV0dXJuIG9wZXJhdGlvbi5nZXRJRCgpOwotCQl9Ci0KLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIG9wZXJhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV4ZWN1dGVkKCkgewotCQkJcmV0dXJuIG51bGwgIT0gb3BlcmF0aW9uRm9yRXhlY3V0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSByb290IG9wZXJhdGlvbiBpcyBvbmx5IHJldHVybmVkIG9uY2U7IHRoaXMgd2F5IGl0IGlzIGtub3duIHdoZXRoZXIgaXQgaGFzIGJlZW4KLQkJICogZXhlY3V0ZWQgeWV0IG9yIG5vdC4KLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldE9wZXJhdGlvbkZvckV4ZWN1dGlvbigpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG9wZXJhdGlvbkZvckV4ZWN1dGlvbjsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3BlcmF0aW9uRm9yRXhlY3V0aW9uID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPcGVyYXRpb25TdGFja0VudHJ5IGdldE5leHRQb3N0T3BlcmF0aW9uKCkgewotCQkJaWYgKCFleHRlbmRlZE9wc0luaXRpYWxpemVkKSB7Ci0JCQkJaW5pdEV4dGVuZGVkT3BzKCk7Ci0JCQl9Ci0JCQlpZiAoZXh0T3BIb2xkZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJTGlzdCBvcHMgPSBleHRPcEhvbGRlci5nZXRQb3N0T3BzKCk7Ci0JCQlpZiAob3BzID09IG51bGwgfHwgb3BzLnNpemUoKSA8PSBwb3N0T3BJbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQl3aGlsZSAocG9zdE9wSW5kZXggPCBvcHMuc2l6ZSgpKSB7Ci0JCQkJaW50IGluZGV4ID0gcG9zdE9wSW5kZXgrKzsKLQkJCQlJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gKElEYXRhTW9kZWxPcGVyYXRpb24pIG9wcy5nZXQoaW5kZXgpOwotCQkJCWlmIChzaG91bGRFeGVjdXRlRXh0ZW5kZWQob3AuZ2V0SUQoKSkpIHsKLQkJCQkJb3Auc2V0RGF0YU1vZGVsKGdldERhdGFNb2RlbCgpKTsKLQkJCQkJb3Auc2V0RW52aXJvbm1lbnQoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JCQkJCXBvc3RPcFN0YWNrRW50cmllc1tpbmRleF0gPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeSh0aGlzLCBvcCk7Ci0JCQkJCXJldHVybiBwb3N0T3BTdGFja0VudHJpZXNbaW5kZXhdOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgaW5pdEV4dGVuZGVkT3BzKCkgewotCQkJaWYgKHNob3VsZEV4ZWN1dGVFeHRlbmRlZChvcGVyYXRpb24uZ2V0SUQoKSkpIHsKLQkJCQlleHRPcEhvbGRlciA9IENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuY3JlYXRlRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIob3BlcmF0aW9uLmdldElEKCkpOwotCQkJCWlmIChudWxsICE9IGV4dE9wSG9sZGVyKSB7Ci0JCQkJCWlmIChleHRPcEhvbGRlci5oYXNQcmVPcHMoKSkgewotCQkJCQkJcHJlT3BTdGFja0VudHJpZXMgPSBuZXcgT3BlcmF0aW9uU3RhY2tFbnRyeVtleHRPcEhvbGRlci5nZXRQcmVPcHMoKS5zaXplKCldOwotCQkJCQl9Ci0JCQkJCWlmIChleHRPcEhvbGRlci5oYXNQb3N0T3BzKCkpIHsKLQkJCQkJCXBvc3RPcFN0YWNrRW50cmllcyA9IG5ldyBPcGVyYXRpb25TdGFja0VudHJ5W2V4dE9wSG9sZGVyLmdldFBvc3RPcHMoKS5zaXplKCldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZXh0ZW5kZWRPcHNJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFeGVjdXRlRXh0ZW5kZWQoU3RyaW5nIG9wZXJhdGlvbklEKSB7Ci0JCS8vIENoZWNrIHRoZSB0b3AgbW9zdCBsZXZlbCBvcGVyYXRpb24gZmlyc3QKLQkJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsIHRocmVhZFJvb3RPcGVyYXRpb24gPSAoRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsKSB0aHJlYWRUb0V4dGVuZGVkT3BDb250cm9sLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQkJaWYgKHRocmVhZFJvb3RPcGVyYXRpb24gIT0gdGhpcyAmJiB0aHJlYWRSb290T3BlcmF0aW9uLmdldERhdGFNb2RlbCgpICE9IGdldERhdGFNb2RlbCgpICYmICF0aHJlYWRSb290T3BlcmF0aW9uLnNob3VsZEV4ZWN1dGVFeHRlbmRlZChvcGVyYXRpb25JRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBObyBleHRlbmRlZCBvcGVyYXRpb25zIGFyZSBiZWluZyBleGVjdXRlZAotCQlib29sZWFuIGFsbG93RXh0ZW5zaW9ucyA9IGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKTsKLQkJaWYgKCFhbGxvd0V4dGVuc2lvbnMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBUaGlzIHNwZWNpZmljIG9wZXJhdGlvbiBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0JCUxpc3QgcmVzdHJpY3RlZEV4dGVuc2lvbnMgPSAoTGlzdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUyk7Ci0JCWlmIChyZXN0cmljdGVkRXh0ZW5zaW9ucy5jb250YWlucyhvcGVyYXRpb25JRCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBUaGlzIHNwZWNpZmljIGZ1bmN0aW9uIGdyb3VwIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKLQkJTGlzdCBleHRlbmRlZENvbnRleHQgPSBnZXREYXRhTW9kZWwoKS5nZXRFeHRlbmRlZENvbnRleHQoKTsKLQkJZm9yIChpbnQgY29udGV4dENvdW50ID0gMDsgY29udGV4dENvdW50IDwgZXh0ZW5kZWRDb250ZXh0LnNpemUoKTsgY29udGV4dENvdW50KyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihleHRlbmRlZENvbnRleHQuZ2V0KGNvbnRleHRDb3VudCksIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChudWxsICE9IHByb2plY3QgJiYgIUlFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKG9wZXJhdGlvbklELCBwcm9qZWN0KS5pc0VuYWJsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDk0YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiA8cD4KLSAqIElEYXRhTW9kZWxNYW5hZ2VyT3BlcmF0aW9uIGlzIGFuIElEYXRhTW9kZWxPcGVyYXRpb24gcmV0dXJuZWQgZnJvbQotICoge0BsaW5rb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKX0uIFRoaXMgT3BlcmF0aW9uIHdyYXBzIHRoZSBJRGF0YU1vZGVsT3BlcmF0aW9uIHJldHVybmVkCi0gKiBmcm9tIHRoZSBJRGF0TW9kZWxQcm92aWRlciBiYWNraW5nIHRoZSBJRGF0YU1vZGVsIHRoYXQgY3JlYXRlZCBpdC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBvcGVyYXRpb24gc3VwcG9ydHMgcHJlIGFuZCBwb3N0IG9wZXJhdGlvbiBleGVjdXRpb24uIFByZSBhbmQgcG9zdCBvcGVyYXRpb25zIGFyZQotICogSURhdGFNb2RlbE9wZXJhdGlvbnMgcmVnaXN0ZXJlZCB0aHJvdWdoIHRoZSBPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5zaW9uIHBvaW50IHdoaWNoIGFyZSBleGVjdXRlZAotICogYmVmb3JlIGFuZCBhZnRlciB0aGUgcHJpbWFyeSBvcGVyYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMTwvYj4gPGJyPgotICogU3VwcG9zZSBhbiBJRGF0YU1vZGVsUHJvdmlkZXIgcmV0dXJucyBJRGF0YU1vZGVsT3BlcmF0aW9uIFggYXMgaXRzIGRlZmF1bHQgb3BlcmF0aW9uLCBhbmQgdGhpcwotICogSURhdGFNb2RlbE1hbmFnZXJPcGVyYXRpb24gaXMgd3JhcHBpbmcgWC4gQWxzbyBzdXBwb3NlIG9wZXJhdGlvbiBBIGlzIHJlZ2lzdGVyZWQgYXMgYSBwcmUKLSAqIG9wZXJhdGlvbiB0byBYIGFuZCBvcGVyYXRpb24gQiBpcyByZWdpc3RlcmVkIGFzIGEgcG9zdCBvcGVyYXRpb24gdG8gWC4gV2hlbiB0aGlzCi0gKiBJRGF0YU1vZGVsTWFuYWdlck9wZXJhdGlvbiBpcyBleGVjdXRlZCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGlzIG9yZGVyOgotICogQSwgWCwgQiB3aGljaCBtYXkgYmUgdGhvdWdodCBhcyBhIHByZW9yZGVyIGV4ZWN1dGlvbiBvZiB0aGUgZm9sbG93aW5nIHRyZWU6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgICAgICAgWAotICogICAgICAgICAgLyBcCi0gKiAgICAgICAgIEEgICBCCi0gKiAgICAgICAgIAotICogICBleGVjdXRpb24gPSBBLmV4ZWN1dGUoKSwgIFguZXhlY3V0ZSgpLCBCLmV4ZWN1dGUoKQotICogICB1bmRvID0gQi51bmRvKCksIFgudW5kbygpLCBBLnVuZG8oKQotICogICByZWRvID0gQS5yZWRvKCksIFgucmVkbygpLCBCLnJlZG8oKQotICogPC9wcmU+Ci0gKiAKLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiA8YnI+Ci0gKiBJZiBBIGhhZCBhIHByZSBvcGVyYXRpb24gQyBhbmQgcG9zdCBvcGVyYXRpb24gRCwgYW5kIEIgaGFkIGEgcHJlIG9wZXJhdGlvbiBFIGFuZCBwb3N0IG9wZXJhdGlvbiBGCi0gKiB0aGVuIHRoZSB0cmVlIHdvdWxkIGxvb2sgbGlrZToKLSAqIDwvcD4KLSAqIAotICogPHByZT4KLSAqICAgICAgICAgICAgWAotICogICAgICAgICAgIC8gXAotICogICAgICAgICAgLyAgIFwKLSAqICAgICAgICAgQSAgICAgQgotICogICAgICAgIC8gXCAgIC8gXAotICogICAgICAgQyAgIEQgRSAgIEYKLSAqICAgCi0gKiAgIGV4ZWN1dGlvbiA9IEMuZXhlY3V0ZSgpLCBBLmV4ZWN1dGUoKSwgIEQuZXhlY3V0ZSgpLCBYLmV4ZWN1dGUoKSwgRS5leGVjdXRlKCksIEIuZXhlY3V0ZSgpLCBGLmV4ZWN1dGUoKQotICogICB1bmRvID0gRi51bmRvKCksIEIudW5kbygpLCBFLnVuZG8oKSwgWC51bmRvKCksIEQudW5kbygpLCBBLnVuZG8oKSwgQy51bmRvKCkKLSAqICAgcmVkbyA9IEMucmVkbygpLCBBLnJlZG8oKSwgIEQucmVkbygpLCBYLnJlZG8oKSwgRS5yZWRvKCksIEIucmVkbygpLCBGLnJlZG8oKQotICogPC9wcmU+Ci0gKiAKLSAqIDwvcD4KLSAqIDxiPkV4YW1wbGUgMzwvYj4gPGJyPgotICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwcmUgb3BlcmF0aW9uIG9yIHBvc3Qgb3BlcmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLCB0aGVuIHRoZXJlCi0gKiBpcyBubyBkZWZpbmVkIG9yZGVyaW5nIG9mIHRob3NlIHByZSBhbmQgcG9zdCBvcGVyYXRpb24gd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsIG90aGVyIHRoYW4KLSAqIHRoYXQgaXQgd2lsbCBiZSBjb25zaXN0ZW50LiBGb3IgZXhhbXBsZSBzdXBwb3NlIG9wZXJhdGlvbiBYIGhhZCBvbmx5IHR3byBwcmUgb3BlcmF0aW9ucywgQSBhbmQgQiwKLSAqIGFuZCB0d28gcG9zdCBvcGVyYXRpb25zLCBDIGFuZCBELiBUaGUgZXhlY3V0aW9uIHRyZWUgd291bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICAgICAgIFggICAgICAgICAgICAgIFggICAgICAgICAgICAgIFggICAgICAgICAgICAgIFgKLSAqICAgICAgICAvIFwgICAgICAgICAgICAvIFwgICAgICAgICAgICAvIFwgICAgICAgICAgICAvIFwKLSAqICAgICAgQUIgICBDRCAgICAgICAgQkEgICBDRCAgICAgICAgQUIgICBEQyAgICAgICAgQkEgICBEQwotICogICAKLSAqICAgIGV4ZWMgPSBBQlhDRCAgIGV4ZWMgPSBCQVhDRCAgIGV4ZWMgPSBBQlhEQyAgIGV4ZWMgPSBCQVhEQwotICogICAgdW5kbyA9IERDWEJBICAgdW5kbyA9IERDWEFCICAgdW5kbyA9IENEWEJBICAgdW5kbyA9IENEWEFCIAotICogICAgcmVkbyA9IEFCWENEICAgcmVkbyA9IEJBWENEICAgcmVkbyA9IEFCWERDICAgcmVkbyA9IEJBWERDCi0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBEdXJpbmcgZXhlY3V0aW9uLCByb2xsYmFjaywgdW5kbywgYW5kIHJlZG8sIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH1zIGFyZSBmaXJlZCB0byBhbGwKLSAqIHJlZ2lzdGVyZWQge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyfXMgZ2l2aW5nIGVhY2ggb2YgdGhlbSBhbiBvcHBvcnR1bml0eSB0byBwYXVzZSB0aGUKLSAqIG9wZXJhdGlvbiBieSByZXR1cm5pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyI1BBVVNFfS4KLSAqIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH0gaGFzIG1vcmUgZGV0YWlscyBvbiB3aGVuIHRoZXNlIGV2ZW50cyBhcmUgZmlyZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2Vlb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsI2dldERlZmF1bHRPcGVyYXRpb24oKQotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIGV4dGVuZHMgSURhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBuZXZlciBiZWVuIGV4ZWN1dGVkLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcwotCSAqIHN0YXRlIGl0IG1heSBvbmx5IGJlIGV4ZWN1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9TVEFSVEVEID0gMDsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoaWxlIHRoZSBvcGVyYXRpb24gaXMgZXhlY3V0aW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX0VYRUNVVEUgPSAxOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhdGlvbiBpcyByb2xsaW5nIGJhY2suIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlCi0JICogaXQgbWF5IG9ubHkgYmUgcGF1c2VkIGJ5IGFuIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn0uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3JvbGxCYWNrKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkdfUk9MTEJBQ0sgPSAyOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhdGlvbiBpcyByZWRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jdW5kbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX1VORE8gPSAzOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hpbGUgdGhlIG9wZXJhaXRvbiBpcyByZWRvaW5nLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcyBzdGF0ZSBpdAotCSAqIG1heSBvbmx5IGJlIHBhdXNlZCBieSBhbiB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXJ9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jcmVkbyhJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HX1JFRE8gPSA0OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHBhdXNlZCB3aGlsZSBpdCB3YXMgZXhlY3V0aW5nLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBlaXRoZXIgYmUgcmVzdW1lZCB0byBjb250aW51ZSBleGVjdXRpb24gb3Igcm9sbGVkIGJhY2sgdG8KLQkgKiB1bmRvIHRoZSBwYXJ0aWFsIGV4ZWN1dGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICogQHNlZSAjcm9sbEJhY2soSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfRVhFQ1VURSA9IDU7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyByb2xsaW5nIGJhY2suIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IGVpdGhlciBiZSByZXN1bWVkIHRvIGNvbnRpbnVlIHJvbGxpbmcgYmFjayBvciBleGVjdXRlZAotCSAqIHdoaWNoIGNvbnRpbnVlIHRoZSBmb3dhcmQgZXhlY3V0aW9uIGZyb20gdGhlIHBvaW50IHdoZXJlIHRoZSByb2xsYmFjayB3YXMgcGF1c2VkCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI3Jlc3VtZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX1JPTExCQUNLID0gNjsKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhldWN0aW9uIHN0YXRlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwYXVzZWQgd2hpbGUgaXQgd2FzIHVuZG9pbmcuIFdoZW4gdGhlCi0JICogb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUgaXQgbWF5IGJlIG9ubHkgYmUgcmVzdW1lZCB0byBjb250aW51ZSB1bmRvaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlICNyZXN1bWUoSVByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRURfVU5ETyA9IDc7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcGF1c2VkIHdoaWxlIGl0IHdhcyByZWRvaW5nLiBXaGVuIHRoZQotCSAqIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlIGl0IG1heSBvbmx5IGJlIHJlc3VtZWQgdG8gY29udGludWUgcmVkb2luZy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjcmVzdW1lKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0VEX1JFRE8gPSA4OwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIGV4ZWN1dGlvbi4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMKLQkgKiBzdGF0ZSBpdCBtYXkgb25seSBiZSB1bmRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfRVhFQ1VURSA9IDk7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgcm9sbGluZyBiYWNrLiBXaGVuIHRoZSBvcGVyYXRpb24gaXMgaW4gdGhpcwotCSAqIHN0YXRlIGl0IG1heSBvbmx5IGJlIGV4ZWN1dGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yLCBJQWRhcHRhYmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFX1JPTExCQUNLID0gMTA7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZXVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBvcGVyYXRpb24gZmluaXNoZWQgdW5kb2luZy4gV2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIHRoaXMgc3RhdGUKLQkgKiBpdCBtYXkgb25seSBiZSByZWRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNyZWRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfVU5ETyA9IDExOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGV1Y3Rpb24gc3RhdGUgd2hlbiB0aGUgb3BlcmF0aW9uIGZpbmlzaGVkIHJlZG9pbmcuIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBpbiB0aGlzIHN0YXRlCi0JICogaXQgbWF5IG9ubHkgYmUgdWRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKElQcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVfUkVETyA9IDEyOwotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLiBSZXR1cm5zIG9uZSBvZjoKLQkgKiA8dWw+Ci0JICogPGxpPntAbGluayAjTk9UX1NUQVJURUR9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX0VYRUNVVEV9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNSVU5OSU5HX1JPTExCQUNLfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19VTkRPfTwvbGk+Ci0JICogPGxpPntAbGluayAjUlVOTklOR19SRURPfTwvbGk+Ci0JICogPGxpPntAbGluayAjUEFVU0VEX0VYRUNVVEV9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfUk9MTEJBQ0t9PC9saT4KLQkgKiA8bGk+e0BsaW5rICNQQVVTRURfVU5ET308L2xpPgotCSAqIDxsaT57QGxpbmsgI1BBVVNFRF9SRURPfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfRVhFQ1VURX08L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX1JPTExCQUNLfTwvbGk+Ci0JICogPGxpPntAbGluayAjQ09NUExFVEVfVU5ET308L2xpPgotCSAqIDxsaT57QGxpbmsgI0NPTVBMRVRFX1JFRE99PC9saT4KLQkgKiA8L3VsPgotCSAqIDxwPgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhlY3V0aW9uU3RhdGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlc3VtZXMgZXhlY3V0aW9uIGlmIHRoZSBvcGVyYXRpb24gaXMgY3VyZW50bHkgcGF1c2VkLiBBbiBvcGVyYXRpb24gaXMgcGF1c2VkIGlmCi0JICoge0BsaW5rICNnZXRFeGVjdXRpb25TdGF0ZSgpfSByZXR1cm5zIGFueSBvZiB7QGxpbmsgI1BBVVNFRF9FWEVDVVRFfSwKLQkgKiB7QGxpbmsgI1BBVVNFRF9ST0xMQkFDS30sIHtAbGluayAjUEFVU0VEX1VORE99LCBvciB7QGxpbmsgI1BBVVNFRF9SRURPfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIChvciA8Y29kZT5udWxsPC9jb2RlPikgdG8gdXNlIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MgdG8KLQkgKiAgICAgICAgICAgIHRoZSB1c2VyLgotCSAqIEBwYXJhbSBpbmZvCi0JICogICAgICAgICAgICB0aGUgSUFkYXB0YWJsZSAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgaW4gb3JkZXIgdG8gc3VwcGx5Ci0JICogICAgICAgICAgICBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIGlmIG5lY2Vzc2FyeS4gV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlciBmb3IgdGhlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbC5jbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJU3RhdHVzIG9mIHRoZSByZXN1bWUuIFRoZSBzdGF0dXMgc2V2ZXJpdHkgc2hvdWxkIGJlIHNldCB0byA8Y29kZT5PSzwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGFuZCA8Y29kZT5FUlJPUjwvY29kZT4gaWYgaXQgd2FzIG5vdC4gQW55IG90aGVyCi0JICogICAgICAgICBzdGF0dXMgaXMgYXNzdW1lZCB0byByZXByZXNlbnQgYW4gaW5jb21wbGV0aW9uIG9mIHRoZSByZXN1bWUuCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVzdW1lKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogUm9sbHMgYmFjayB0aGUgcGFydGlhbCBleGVjdXRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgaW4KLQkgKiB7QGxpbmsgI2dldEV4ZWN1dGlvblN0YXRlKCl9IHJldHVybnMgZWl0ZXIge0BsaW5rICNQQVVTRURfRVhFQ1VURX0gb3IKLQkgKiB7QGxpbmsgI1BBVVNFRF9ST0xMQkFDS30uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvciAob3IgPGNvZGU+bnVsbDwvY29kZT4pIHRvIHVzZSBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIHRvCi0JICogICAgICAgICAgICB0aGUgdXNlci4KLQkgKiBAcGFyYW0gaW5mbwotCSAqICAgICAgICAgICAgdGhlIElBZGFwdGFibGUgKG9yIDxjb2RlPm51bGw8L2NvZGU+KSBwcm92aWRlZCBieSB0aGUgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseQotCSAqICAgICAgICAgICAgVUkgaW5mb3JtYXRpb24gZm9yIHByb21wdGluZyB0aGUgdXNlciBpZiBuZWNlc3NhcnkuIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgaXQgc2hvdWxkIG1pbmltYWxseSBjb250YWluIGFuIGFkYXB0ZXIgZm9yIHRoZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgSVN0YXR1cyBvZiB0aGUgcmVzdW1lLiBUaGUgc3RhdHVzIHNldmVyaXR5IHNob3VsZCBiZSBzZXQgdG8gPGNvZGU+T0s8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhbmQgPGNvZGU+RVJST1I8L2NvZGU+IGlmIGl0IHdhcyBub3QuIEFueSBvdGhlcgotCSAqICAgICAgICAgc3RhdHVzIGlzIGFzc3VtZWQgdG8gcmVwcmVzZW50IGFuIGluY29tcGxldGlvbiBvZiB0aGUgcmVzdW1lLgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJvbGxCYWNrKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBvcGVyYXRpb24gZXZlbnRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uTGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBJT3BlcmF0aW9uTGlzdGVuZXIgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbkxpc3RlbmVyKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyIG9wZXJhdGlvbkxpc3RlbmVyKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJT3BlcmF0aW9uTGluc3RlbmVyLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb25MaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIElPcGVyYXRvaW5MaXN0ZW5lciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgb3BlcmF0aW9uTGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2NzgwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogPHA+Ci0gKiBUaGVzZSBldmVudHMgYXJlIGZpcmVkIHRvIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lcn1zIGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn1zIGR1cmluZyBleGVjdXRpb24sIHJvbGxiYWNrLCB1bmRvLAotICogYW5kIHJlZG8uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogPGI+RXhhbXBsZSAyPC9iPiBmcm9tIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259PGJyPgotICogPHByZT4KLSAqICAgICAgICAgIFgKLSAqICAgICAgICAgLyBcCi0gKiAgICAgICAgLyAgIFwKLSAqICAgICAgIEEgICAgIEIKLSAqICAgICAgLyBcICAgLyBcCi0gKiAgICAgQyAgIEQgRSAgIEYKLSAqIDwvcHJlPgotICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBldmVudHMgd2lsbCBiZSBmaXJlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGR1cmluZyBhbiBleGVjdXRpb246Ci0gKiA8dGFibGUgYm9yZGVyPTE+Ci0gKiA8dHI+PHRoPm9wZXJhdGlvbjwvdGg+PHRoPm9wZXJhdGlvbiB0eXBlPC90aD48dGg+ZXhlY3V0aW9uIHR5cGU8L3RoPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkM8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+Tk9ERV9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5OT0RFX1NUQVJUSU5HPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk5PREVfU1RBUlRJTkc8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkY8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk5PREVfRklOSVNIRUQ8L3RkPjx0ZD5FWEVDVVRFPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+Tk9ERV9GSU5JU0hFRDwvdGQ+PHRkPkVYRUNVVEU8L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPlg8L3RkPjx0ZD5OT0RFX0ZJTklTSEVEPC90ZD48dGQ+RVhFQ1VURTwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYSByb2xsYmFjazoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5ST0xMQkFDSzwvdGQ+PC90cj4KLSAqIDwvdGFibGU+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPkV4YW1wbGUgMjwvYj4gZnJvbSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufTxicj4KLSAqIDxwcmU+Ci0gKiAgICAgICAgICBYCi0gKiAgICAgICAgIC8gXAotICogICAgICAgIC8gICBcCi0gKiAgICAgICBBICAgICBCCi0gKiAgICAgIC8gXCAgIC8gXAotICogICAgIEMgICBEIEUgICBGCi0gKiA8L3ByZT4KLSAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgZXZlbnRzIHdpbGwgYmUgZmlyZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBkdXJpbmcgYW4gdW5kbzoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QjwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5FPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RDwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5BPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5FeGFtcGxlIDI8L2I+IGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn08YnI+Ci0gKiA8cHJlPgotICogICAgICAgICAgWAotICogICAgICAgICAvIFwKLSAqICAgICAgICAvICAgXAotICogICAgICAgQSAgICAgQgotICogICAgICAvIFwgICAvIFwKLSAqICAgICBDICAgRCBFICAgRgotICogPC9wcmU+Ci0gKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZHVyaW5nIGEgcmVkbzoKLSAqIDx0YWJsZSBib3JkZXI9MT4KLSAqIDx0cj48dGg+b3BlcmF0aW9uPC90aD48dGg+b3BlcmF0aW9uIHR5cGU8L3RoPjx0aD5leGVjdXRpb24gdHlwZTwvdGg+PC90cj4KLSAqIDx0cj48dGQ+QzwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5DPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkE8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+QTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5EPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkQ8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+WDwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5YPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkU8L3RkPjx0ZD5NQUlOX1NUQVJUSU5HPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RTwvdGQ+PHRkPk1BSU5fRklOSVNIRUQ8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5CPC90ZD48dGQ+TUFJTl9TVEFSVElORzwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8dHI+PHRkPkI8L3RkPjx0ZD5NQUlOX0ZJTklTSEVEPC90ZD48dGQ+VU5ETzwvdGQ+PC90cj4KLSAqIDx0cj48dGQ+RjwvdGQ+PHRkPk1BSU5fU1RBUlRJTkc8L3RkPjx0ZD5VTkRPPC90ZD48L3RyPgotICogPHRyPjx0ZD5GPC90ZD48dGQ+TUFJTl9GSU5JU0hFRDwvdGQ+PHRkPlVORE88L3RkPjwvdHI+Ci0gKiA8L3RhYmxlPgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50IHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gdHlwZSBzZXQgd2hlbiBhbiBvcGVyYXRpb24gZXhlY3V0aW9uIHRyYXZlcnNhbCBpcyBhYm91dCB0byBzdGFydCB3aXRoaW4gdGhlCi0JICogdHJlZSBvZiBvcGVyYXRpb25zIGhhbmRsZWQgYnkgdGhlIG93bmluZyB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufS4gVGhpcyBvcGVyYXRpb24KLQkgKiB0eXBlIGlzIG9ubHkgc2V0IHdoZW4gdGhlIGV4ZWN1dGlvbiB0eXBlIGlzIHNldCB0byB7QGxpbmsgI0VYRUNVVEV9LiBVc2luZyB0aGUgZXhhbXBsZQotCSAqIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJhdGlvbiB0eXBlIHdpbGwgYmUgZmlyZWQgYWNjb3JkaW5nIHRvIGFuIGluIG9yZGVyIHRyYXZlcnNhbCBvZgotCSAqIHRoZSB0cmVlOyBpLmUuIFhBQ0RCRUYKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9TVEFSVElORyA9IDE7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCB3aGVuIGFuIG9wZXJhdGlvbiBleGVjdXRpb24gdHJhdmVyc2FsIGZpbmlzaGVzIHdpdGhpbiB0aGUgdHJlZSBvZgotCSAqIG9wZXJhdGlvbnMgaGFuZGxlZCBieSB0aGUgb3duaW5nIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb259LiBUaGlzIG9wZXJhdGlvbiB0eXBlIGlzCi0JICogb25seSBzZXQgd2hlbiB0aGUgZXhlY3V0aW9uIHR5cGUgaXMgc2V0IHRvIHtAbGluayAjRVhFQ1VURX0uIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMKLQkgKiB3aXRoIHRoaXMgb3BlcmF0aW9uIHR5cGUgd2lsbCBiZSBmaXJlZCBhY2NvcmRpbmcgdG8gYSBwb3N0IG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZTsgaS5lLgotCSAqIENEQUVGQlgKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9GSU5JU0hFRCA9IDI7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCByaWdodCBiZWZvcmUgYW4gb3BlcmF0aW9uIGlzIGdvaW5nIHRvIGRvIGl0cyB3b3JrLiBUaGlzIG9wZXJhdGlvbiB0eXBlCi0JICogbWF5IGJlIHVzZWQgd2l0aCBhbGwgZXhlY3Rpb24gdHlwZXMuIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJpdG9uIHR5cGUKLQkgKiB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRyZWUgdHJhdmVyc2FsOiBDQURYQkVGCi0JICogPHA+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9TVEFSVElORyA9IDM7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiB0eXBlIHNldCBpbW1lZGlhdGx5IGFmdGVyIGFuIG9wZXJhdGlvbiBmaW5zaGVkIGRvaW5nIGl0cyB3b3JrLiBUaGlzIG9wZXJhdGlvbgotCSAqIHR5cGUgbWF5IGJlIHVzZWQgd2l0aCBhbGwgZXhlY3Rpb24gdHlwZXMuIFVzaW5nIHRoZSBleGFtcGxlIGFib3ZlLCBldmVudHMgd2l0aCB0aGlzIG9wZXJpdG9uCi0JICogdHlwZSB3aWxsIGJlIGZpcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRyZWUgdHJhdmVyc2FsOiBDQURYQkVGCi0JICogPHA+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFJTl9GSU5JU0hFRCA9IDQ7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZXhlY3V0aW9uIHR5cGUgc2V0IHdoZW4gZHVyaW5nIGV4ZWN1dGlvbi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURSA9IDA7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyByb2xsYmFjay4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9MTEJBQ0sgPSAxOwotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBleGVjdXRpb24gdHlwZSBzZXQgd2hlbiBkdXJpbmcgdW5kby4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDI7Ci0JLyoqCi0JICogPHA+Ci0JICogVGhlIGV4ZWN1dGlvbiB0eXBlIHNldCB3aGVuIGR1cmluZyByZWRvLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURPID0gMzsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG9wZXJhdGlvbiBpbiBxdWVzdGlvbi4gVGhpcyBvcGVyYXRpb24gd2lsbCBiZSBvbmUgb2YgdGhlIG9wZXJhdGlvbnMgd2l0aGluIHRoZQotCSAqIHRyZWUgb2Ygb3BlcmF0aW9ucyBoYW5kbGVkIGJ5IHRoZSBvd25pbmcge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn0KLQkgKiBleGVjdXRpbmcgaXQuIFRoaXMgd2lsbCBiZSBvbmUgb2Yge0BsaW5rICNOT0RFX1NUQVJUSU5HfSwge0BsaW5rICNOT0RFX0ZJTklTSEVEfSwKLQkgKiB7QGxpbmsgI01BSU5fU1RBUlRJTkd9LCBvciB7QGxpbmsgI01BSU5fRklOSVNIRUR9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiB7QGxpbmsgI05PREVfU1RBUlRJTkd9LCB7QGxpbmsgI05PREVfRklOSVNIRUR9LCB7QGxpbmsgI01BSU5fU1RBUlRJTkd9LCBvcgotCSAqICAgICAgICAge0BsaW5rICNNQUlOX0ZJTklTSEVEfS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgZXhlY3V0aW9uIHRoZSBvcGVyYXRpb24gaXMgYWJvdXQgdG8gYmVnaW4uIFRoaXMgd2lsbCBiZSBvbmUgb2YKLQkgKiB7QGxpbmsgI0VYRUNVVEV9LCB7QGxpbmsgI1JPTExCQUNLfSwge0BsaW5rICNVTkRPfSwgb3Ige0BsaW5rICNSRURPfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNFWEVDVVRFfSwge0BsaW5rICNST0xMQkFDS30sIHtAbGluayAjVU5ET30sIG9yIHtAbGluayAjUkVET30uCi0JICovCi0JcHVibGljIGludCBnZXRFeGVjdXRpb25UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVmNDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZGF0YW1vZGVsL0lEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSAqIDxwPgotICogVXNlZCB0byBsaXN0ZW4gZm9yIHtAbGluayBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudH1zIGZpcmVkIGZyb20ge0BsaW5rIElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbn1zLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgcmV0dXJuIHRoaXMgY29uc3RhbnQgZnJvbSB7QGxpbmsgI25vdGlmeShJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25FdmVudCl9IHRvIHNwZWNpZnkgdGhhdAotCSAqIGV4ZWN1dGlvbiBzaG91bGQgY29udGludWUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRJTlVFID0gMDsKLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIHJldHVybiB0aGlzIGNvbnN0YW50IGZyb20ge0BsaW5rICNub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQpfSB0byBzcGVjaWZ5IHRoYXQKLQkgKiBleGVjdXRpb24gc2hvdWxkIHBhdXNlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVVTRSA9IDE7Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIExpc3RlbmVyIGludGVyZmFjZSBieSB7QGxpbmsgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9ufSBmb3Igb3BlcmF0aW9uIGV4ZWN1dGlvbgotCSAqIG5vdGlmaWNhdGlvbi4gUHJpb3IgdG8gc3RhcnRpbmcgYW55IG9wZXJhdGlvbidzIGV4ZWN1dGlvbiwgbm90aWZpY2F0aW9ucyB3aWxsIGJlIHNlbnQgd2hpY2gKLQkgKiBhbGxvdyBjbGllbnRzIHRvIHBhdXNlIGFuIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gSW1wbGVtZW50ZXJzIHNob3VsZCByZXR1cm4ge0BsaW5rICNDT05USU5VRX0KLQkgKiB0byBhbGxvdyB0aGUgb3BlcmF0aW9uJ3MgZXhlY3V0aW9uIHRvIGNvbnRpbnVlIG9yIHtAbGluayAjUEFVU0V9IHRvIHBhdXNlIGV4ZWN1dGlvbi4gSWYKLQkgKiB7QGxpbmsgI1BBVVNFfSBpcyByZXR1cm5lZCwgdGhlbiB0aGUgZW50aXJlIG9wZXJhdGlvbiBzdGFjayB3aWxsIGJlIHBhdXNlZCB1bnRpbCBpdCBpcwotCSAqIHJlc3VtZWQuIFRoZSByZXNwb25zaWJsaXR5IGZvciByZXN1bWluZyBhIHBhdXNlZCBvcGVyYXRpb24gbGllcyBvbiB0aGUgY2xpZW50IHRoYXQgcGF1c2VkIGl0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gZXZlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybiBDT05USU5VRSB0byBjb250aW51ZSwgb3IgUEFVU0UgdG8gcGF1c2UuCi0JICogCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24jYWRkT3BlcmF0aW9uTGlzdGVuZXIoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIpCi0JICogQHNlZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24jcmVzdW1lKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICovCi0JcHVibGljIGludCBub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9JV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTRiZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIElBZGFwdGFibGUgaW5mbzsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi1wdWJsaWMgSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1cyhJQWRhcHRhYmxlIGluZm8pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci1wdWJsaWMgSUFkYXB0YWJsZSBnZXRJbmZvKCkgewotCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQlyZXR1cm4gaW5mbzsKLX0KLXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIGFTdGF0dXMpIHsKLQlzdGF0dXMgPSBhU3RhdHVzOwotfQotCi1wdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCX0KLXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9XcmFwcGVkT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2RhdGFtb2RlbC9XcmFwcGVkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzU4NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9kYXRhbW9kZWwvV3JhcHBlZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlZE9wZXJhdGlvbiBpbXBsZW1lbnRzIElEYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQkKLQlwdWJsaWMgV3JhcHBlZE9wZXJhdGlvbihJRGF0YU1vZGVsT3BlcmF0aW9uIHJvb3RPcGVyYXRpb24pIHsKLQkJdGhpcy5yb290T3BlcmF0aW9uID0gcm9vdE9wZXJhdGlvbjsKLQkJaWYgKG51bGwgPT0gcm9vdE9wZXJhdGlvbikgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uY2FuUmVkbygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmNhblVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpIHsKLQkJcm9vdE9wZXJhdGlvbi5zZXRJRChpZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0SUQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotCQlyb290T3BlcmF0aW9uLnNldERhdGFNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXREYXRhTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJcm9vdE9wZXJhdGlvbi5zZXRFbnZpcm9ubWVudChlbnZpcm9ubWVudCk7Ci0JfQotCi0JcHVibGljIElFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0RW52aXJvbm1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5nZXRTY2hlZHVsaW5nUnVsZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi51bmRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5yZWRvKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uRXhlY3V0aW9uRmxhZ3MoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldE9wZXJhdGlvbkV4ZWN1dGlvbkZsYWdzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIHJvb3RPcGVyYXRpb24uZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgSVVuZG9Db250ZXh0W10gZ2V0Q29udGV4dHMoKSB7Ci0JCXJldHVybiByb290T3BlcmF0aW9uLmdldENvbnRleHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGV4dChJVW5kb0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gcm9vdE9wZXJhdGlvbi5oYXNDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJcm9vdE9wZXJhdGlvbi5hZGRDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoSVVuZG9Db250ZXh0IGNvbnRleHQpIHsKLQkJcm9vdE9wZXJhdGlvbi5yZW1vdmVDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPcGVyYXRpb24uZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Fic3RyYWN0SWRlbnRpZmlhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQWJzdHJhY3RJZGVudGlmaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkMTQzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvQWJzdHJhY3RJZGVudGlmaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0SWRlbnRpZmlhYmxlIGltcGxlbWVudHMgSWRlbnRpZmlhYmxlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgQWJzdHJhY3RJZGVudGlmaWFibGUoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMb2FkT3JkZXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0FzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0FzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFmYTBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9Bc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBibGFuY2V0dAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIHNpbmdsZXRvbjsKLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAobzIgPT0gbnVsbCAmJiBvMSAhPSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IChGdW5jdGlvbkdyb3VwKSBvMTsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDIgPSAoRnVuY3Rpb25Hcm91cCkgbzI7Ci0KLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID4gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID09IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA8IGdyb3VwMi5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3Igc2luZ2xldG9uKCkgewotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSBuZXcgQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGUxMjUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9EYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRW5hYmxlbWVudEZhY3RvcnkgewotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBhcHByb3ByaWF0ZSBJRGF0YU1vZGVsUHJvdmlkZXIgYnkgdGhlIHNwZWNpZmllZCBwcm92aWRlcktpbmQgU3RyaW5nIGFuZCBhCi0JICogY29udGV4dCBvZiB0aGUgY29udGFpbmluZyBQcm9qZWN0LiBUaGUgbWV0aG9kIGdldHMgYW4gYXJyYXkgb2YgRGF0YU1vZGVsUHJvdmlkZXJEZXNjcmlwdG9yCi0JICogZnJvbSB0aGUgYmFzZSBEYXRhTW9kZWxGYWN0b3J5IHRoZW4gZmlsdGVycyBvdXQgUHJvdmlkZXJzIGJhc2VkIG9uIGZ1bmN0aW9uIGdyb3VwIGVuYWJsZW1lbnQuCi0JICogRmluYWxseSB0aGUgUHJvdmlkZXIgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyByZXR1cm5lZC4gSWYgdGhlIElEYXRhTW9kZWxQcm92aWRlciBpcyBub3QKLQkgKiBmb3VuZCB0aGVuIGEgUnVudGltZUV4Y2VwdGlvbiBpcyBsb2dnZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIHByb3ZpZGVyS2luZAotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyBpZCBvZiB0aGUgcHJvdmlkZXIga2luZAotCSAqIEBwYXJhbSBjdXJQcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBJUHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgSURhdGFNb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoU3RyaW5nIHByb3ZpZGVyS2luZCwgSVByb2plY3QgY3VyUHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm92aWRlcklEcyA9IERhdGFNb2RlbEZhY3RvcnkuZ2V0RGF0YU1vZGVsUHJvdmlkZXJJRHNGb3JLaW5kKHByb3ZpZGVyS2luZCk7Ci0JCWlmIChwcm92aWRlcklEcyA9PSBudWxsIHx8IHByb3ZpZGVySURzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0b3BQcm92aWRlciA9IGdldEhpZ2hlc3RQcmlvcml0eUVuYWJsZWRQcm92aWRlckRlc2MocHJvdmlkZXJJRHMsIGN1clByb2plY3QpOwotCQlpZiAodG9wUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwodG9wUHJvdmlkZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIaWdoZXN0UHJpb3JpdHlFbmFibGVkUHJvdmlkZXJEZXNjKFN0cmluZ1tdIHByb3ZpZGVySURzLCBJUHJvamVjdCBjdXJQcm9qZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0SUQgPSBwcm92aWRlcklEc1swXTsKLQkJSUVuYWJsZW1lbnRJZGVudGlmaWVyIGVuYWJsZW1lbnRJZGVudGlmaWVyOwotCQlJZGVudGlmaWFibGUgdGVtcElkZW50aWZpYWJsZTsKLQkJSWRlbnRpZmlhYmxlIHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8IHByb3ZpZGVySURzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0ZW1wSWRlbnRpZmlhYmxlID0gbmV3IEFic3RyYWN0SWRlbnRpZmlhYmxlKHByb3ZpZGVySURzW2ldKTsKLQkJCWVuYWJsZW1lbnRJZGVudGlmaWVyID0gRW5hYmxlbWVudE1hbmFnZXIuSU5TVEFOQ0UuZ2V0SWRlbnRpZmllcih0ZW1wSWRlbnRpZmlhYmxlLmdldElEKCksIGN1clByb2plY3QpOwotCQkJaWYgKGVuYWJsZW1lbnRJZGVudGlmaWVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID09IG51bGwpCi0JCQkJCXRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID0gdGVtcElkZW50aWZpYWJsZTsKLQkJCQllbHNlIGlmIChJZGVudGlmaWFibGVDb21wYXJhdG9yLmluc3RhbmNlLmNvbXBhcmUodGVtcElkZW50aWZpYWJsZSwgdG9wUHJpb3JpdHlJZGVudGlmaWFibGUpID09IElkZW50aWZpYWJsZUNvbXBhcmF0b3IuR1JFQVRFUl9USEFOKQotCQkJCQl0b3BQcmlvcml0eUlkZW50aWZpYWJsZSA9IHRlbXBJZGVudGlmaWFibGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvcFByaW9yaXR5SWRlbnRpZmlhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdElEOwotCQlyZXR1cm4gdG9wUHJpb3JpdHlJZGVudGlmaWFibGUuZ2V0SUQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Rlc2NlbmRpbmdHcm91cENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyMDg1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yIHNpbmdsZXRvbjsKLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobzIgPT0gbnVsbCAmJiBvMSAhPSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWlmIChvMSA9PSBudWxsICYmIG8yID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMSA9IChGdW5jdGlvbkdyb3VwKSBvMTsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDIgPSAoRnVuY3Rpb25Hcm91cCkgbzI7Ci0KLQkJaWYgKGdyb3VwMS5nZXRQcmlvcml0eSgpID4gZ3JvdXAyLmdldFByaW9yaXR5KCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChncm91cDEuZ2V0UHJpb3JpdHkoKSA9PSBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAwOwotCQlpZiAoZ3JvdXAxLmdldFByaW9yaXR5KCkgPCBncm91cDIuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBzaW5nbGV0b24oKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkKLQkJCXNpbmdsZXRvbiA9IG5ldyBEZXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmRiYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50SWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVtZW50SWRlbnRpZmllciBpbXBsZW1lbnRzIElFbmFibGVtZW50SWRlbnRpZmllciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBIQVNIX0lOSVRJQUwgPSBFbmFibGVtZW50SWRlbnRpZmllci5jbGFzcy5nZXROYW1lKCkuaGFzaENvZGUoKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNldCBzdHJvbmdSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgU2V0IGZ1bmN0aW9uR3JvdXBJZHM7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmdbXSBmdW5jdGlvbkdyb3VwSWRzQXNBcnJheTsKLQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc2hDb2RlOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYXNoQ29kZUNvbXB1dGVkOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIExpc3QgaWRlbnRpZmllckxpc3RlbmVyczsKLQotCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBzdHJpbmc7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcm90ZWN0ZWQgRW5hYmxlbWVudElkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0JCXRoaXMoaWQsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBFbmFibGVtZW50SWRlbnRpZmllcihTdHJpbmcgaWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZElkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpIHsKLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWlkZW50aWZpZXJMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKCFpZGVudGlmaWVyTGlzdGVuZXJzLmNvbnRhaW5zKGlkZW50aWZpZXJMaXN0ZW5lcikpCi0JCQlpZGVudGlmaWVyTGlzdGVuZXJzLmFkZChpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0JCXN0cm9uZ1JlZmVyZW5jZXMuYWRkKHRoaXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmplY3QpIHsKLQkJRW5hYmxlbWVudElkZW50aWZpZXIgY2FzdGVkT2JqZWN0ID0gKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBvYmplY3Q7Ci0JCXJldHVybiBVdGlsLmNvbXBhcmUoaWQsIGNhc3RlZE9iamVjdC5pZCk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFbmFibGVtZW50SWRlbnRpZmllcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRW5hYmxlbWVudElkZW50aWZpZXIgY2FzdGVkT2JqZWN0ID0gKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBvYmplY3Q7Ci0JCWJvb2xlYW4gZXF1YWxzID0gVXRpbC5lcXVhbHMoaWQsIGNhc3RlZE9iamVjdC5pZCk7Ci0JCXJldHVybiBlcXVhbHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgZnVuY3Rpb25JZGVudGlmaWVyRXZlbnQpIHsKLQkJaWYgKGZ1bmN0aW9uSWRlbnRpZmllckV2ZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlpZiAoaWRlbnRpZmllckxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGlkZW50aWZpZXJMaXN0ZW5lcnMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlkZW50aWZpZXJMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspCi0JCQkJCSgoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIpIGlkZW50aWZpZXJMaXN0ZW5lcnMuZ2V0KGkpKS5pZGVudGlmaWVyQ2hhbmdlZChmdW5jdGlvbklkZW50aWZpZXJFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEZ1bmN0aW9uR3JvdXBJZHMoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkdyb3VwSWRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoIWhhc2hDb2RlQ29tcHV0ZWQpIHsKLQkJCWhhc2hDb2RlID0gSEFTSF9JTklUSUFMOwotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIEhBU0hfRkFDVE9SICsgVXRpbC5oYXNoQ29kZShpZCk7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpIHsKLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCWlkZW50aWZpZXJMaXN0ZW5lcnMucmVtb3ZlKGlkZW50aWZpZXJMaXN0ZW5lcik7Ci0KLQkJaWYgKGlkZW50aWZpZXJMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJc3Ryb25nUmVmZXJlbmNlcy5yZW1vdmUodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnVuY3Rpb25Hcm91cElkcyhTZXQgZnVuY3Rpb25Hcm91cElkcykgewotCQlmdW5jdGlvbkdyb3VwSWRzID0gVXRpbC5zYWZlQ29weShmdW5jdGlvbkdyb3VwSWRzLCBTdHJpbmcuY2xhc3MpOwotCi0JCWlmICghVXRpbC5lcXVhbHMoZnVuY3Rpb25Hcm91cElkcywgdGhpcy5mdW5jdGlvbkdyb3VwSWRzKSkgewotCQkJdGhpcy5mdW5jdGlvbkdyb3VwSWRzID0gZnVuY3Rpb25Hcm91cElkczsKLQkJCXRoaXMuZnVuY3Rpb25Hcm91cElkc0FzQXJyYXkgPSAoU3RyaW5nW10pIHRoaXMuZnVuY3Rpb25Hcm91cElkcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5mdW5jdGlvbkdyb3VwSWRzLnNpemUoKV0pOwotCi0JCQloYXNoQ29kZUNvbXB1dGVkID0gZmFsc2U7Ci0JCQloYXNoQ29kZSA9IDA7Ci0JCQlzdHJpbmcgPSBudWxsOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKGVuYWJsZWQgIT0gdGhpcy5lbmFibGVkKSB7Ci0JCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCQkJaGFzaENvZGVDb21wdXRlZCA9IGZhbHNlOwotCQkJaGFzaENvZGUgPSAwOwotCQkJc3RyaW5nID0gbnVsbDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlY29tcHV0ZSB0aGUgZW5hYmxlZCBzdGF0ZSBhbmQgcmV0dXJuIHdoZXRoZXIgdGhlIHN0YXRlIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNldEVuYWJsZWQoKSB7Ci0JCXJldHVybiBzZXRFbmFibGVkKGdldE5ld0VuYWJsZWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0TmV3RW5hYmxlZCgpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZnVuY3Rpb25Hcm91cElkc0FzQXJyYXkubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdW5jdGlvbkdyb3VwSWRzQXNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEdyb3VwQnlJRChmdW5jdGlvbkdyb3VwSWRzQXNBcnJheVtpXSk7Ci0JCQlpZiAoZ3JvdXAgIT0gbnVsbCAmJiBncm91cC5pc0VuYWJsZWQocHJvamVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoJ1snKTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZnVuY3Rpb25Hcm91cElkcyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGVuYWJsZWQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChpZCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCddJyk7Ci0JCQlzdHJpbmcgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzc29jaWF0ZWQgUHJvamVjdCBtYXkgYmUgbnVsbAotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5RnVuY3Rpb25Hcm91cElkKCkgewotCQlpbnQgc2VsZWN0ZWRQcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlpbnQgcHJpb3JpdHkgPSAwOwotCQlTdHJpbmcgc2VsZWN0ZWRGdW5jdGlvbkdyb3VwSWQgPSBudWxsOwotCQlTdHJpbmcgZnVuY3Rpb25Hcm91cElkID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGdldEZ1bmN0aW9uR3JvdXBJZHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlmdW5jdGlvbkdyb3VwSWQgPSBpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKTsKLQkJCXByaW9yaXR5ID0gRnVuY3Rpb25Hcm91cFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0R3JvdXBQcmlvcml0eShmdW5jdGlvbkdyb3VwSWQpOwotCQkJaWYgKHByaW9yaXR5IDwgc2VsZWN0ZWRQcmlvcml0eSkKLQkJCQlzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZCA9IGZ1bmN0aW9uR3JvdXBJZDsKLQkJCWlmIChwcmlvcml0eSA9PSAwKQotCQkJCXJldHVybiBzZWxlY3RlZEZ1bmN0aW9uR3JvdXBJZDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRGdW5jdGlvbkdyb3VwSWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXJFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0VuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwYjE5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudElkZW50aWZpZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZnVuY3Rpb25Hcm91cElkc0NoYW5nZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWRDaGFuZ2VkOwotCXByaXZhdGUgSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXI7Ci0KLQlwdWJsaWMgRW5hYmxlbWVudElkZW50aWZpZXJFdmVudChJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciwgYm9vbGVhbiBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCwgYm9vbGVhbiBlbmFibGVkQ2hhbmdlZCkgewotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLQkJdGhpcy5mdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCA9IGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkOwotCQl0aGlzLmVuYWJsZWRDaGFuZ2VkID0gZW5hYmxlZENoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSB0aGF0IGNoYW5nZWQuIEd1YXJhbnRlZWQgbm90IHRvIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZnVuY3Rpb25Hcm91cElkcyBwcm9wZXJ0eSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSwgaWZmIHRoZSBmdW5jdGlvbkdyb3VwSWRzIHByb3BlcnR5IGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRnVuY3Rpb25Hcm91cElkc0NoYW5nZWQoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBlbmFibGVkIHByb3BlcnR5IGNoYW5nZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlLCBpZmYgdGhlIGVuYWJsZWQgcHJvcGVydHkgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFbmFibGVkQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWRDaGFuZ2VkOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgW2lkZW50aWZpZXI9IiArIGlkZW50aWZpZXIudG9TdHJpbmcoKSArICIsIGZ1bmN0aW9uR3JvdXBJZHNDaGFuZ2VkPSIgKyBoYXNGdW5jdGlvbkdyb3VwSWRzQ2hhbmdlZCgpICsgIiwgZW5hYmxlZENoYW5nZWQ9IiArIGhhc0VuYWJsZWRDaGFuZ2VkKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRW5hYmxlbWVudE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRiNWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9FbmFibGVtZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMywgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KLSAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlbWVudE1hbmFnZXIgaW1wbGVtZW50cyBJRW5hYmxlbWVudE1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRW5hYmxlbWVudE1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRW5hYmxlbWVudE1hbmFnZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBpZGVudGlmaWVyc0J5UHJvamVjdCA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCi0JcHVibGljIEVuYWJsZW1lbnRNYW5hZ2VyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBNYXAgaW4gd2hpY2ggdGhlIGtleXMgYXJlIGlkcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGlkZW50aWZpZXJzCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRJZGVudGlmaWVyc0J5SWQoSVByb2plY3QgcHJvamVjdCkgewotCQlNYXAgYU1hcCA9IChNYXApIGlkZW50aWZpZXJzQnlQcm9qZWN0LmdldChwcm9qZWN0KTsKLQkJaWYgKGFNYXAgPT0gbnVsbCkgewotCQkJYU1hcCA9IG5ldyBXZWFrSGFzaE1hcCgpOwotCQkJaWRlbnRpZmllcnNCeVByb2plY3QucHV0KHByb2plY3QsIGFNYXApOwotCQl9Ci0JCXJldHVybiBhTWFwOwotCX0KLQotICAgIHB1YmxpYyBJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIGlmIChpZGVudGlmaWVySWQgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHByb2plY3QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaWRlbnRpZmllclJlcXVpcmVzVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0JICAgICAgICBNYXAgaWRlbnRpZmllcnNCeUlkID0gZ2V0SWRlbnRpZmllcnNCeUlkKHByb2plY3QpOwkKLQkgICAgICAgIGlkZW50aWZpZXIgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIGlkZW50aWZpZXJzQnlJZC5nZXQoaWRlbnRpZmllcklkKTsKLQkgICAgICAgIGlmKGlkZW50aWZpZXIgPT0gbnVsbCl7Ci0JICAgICAgICAJaWRlbnRpZmllclJlcXVpcmVzVXBkYXRlID0gdHJ1ZTsKLQkgICAgICAgIAlpZGVudGlmaWVyID0gY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVySWQsIHByb2plY3QpOwotCSAgICAgICAgICAgIGlkZW50aWZpZXJzQnlJZC5wdXQoaWRlbnRpZmllcklkLCBpZGVudGlmaWVyKTsKLQkgICAgICAgIH0KLQkgICAgfQotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkIChpZGVudGlmaWVyKXsKLSAgICAgICAgCWlmKGlkZW50aWZpZXJSZXF1aXJlc1VwZGF0ZSl7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXJldHVybiBpZGVudGlmaWVyOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJvdGVjdGVkIEVuYWJsZW1lbnRJZGVudGlmaWVyIGNyZWF0ZUlkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXJJZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyKGlkZW50aWZpZXJJZCwgcHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IHVwZGF0ZUlkZW50aWZpZXIoRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgewotCQlTdHJpbmcgaWQgPSBpZGVudGlmaWVyLmdldElkKCk7Ci0JCVNldCBmdW5jdGlvbkdyb3VwSWRzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlMaXN0IGdyb3VwcyA9IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEtub3duR3JvdXBzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBncm91cHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmIChncm91cCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWlmIChncm91cC5pc01hdGNoKGlkKSkKLQkJCQlmdW5jdGlvbkdyb3VwSWRzLmFkZChncm91cC5nZXRHcm91cElEKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBmdW5jdGlvbkdyb3Vwc0NoYW5nZWQgPSBpZGVudGlmaWVyLnNldEZ1bmN0aW9uR3JvdXBJZHMoZnVuY3Rpb25Hcm91cElkcyk7Ci0JCWJvb2xlYW4gZW5hYmxlZENoYW5nZWQgPSBpZGVudGlmaWVyLnJlc2V0RW5hYmxlZCgpOwotCi0JCWlmIChmdW5jdGlvbkdyb3Vwc0NoYW5nZWQgfHwgZW5hYmxlZENoYW5nZWQpCi0JCQlyZXR1cm4gbmV3IEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQoaWRlbnRpZmllciwgZnVuY3Rpb25Hcm91cHNDaGFuZ2VkLCBlbmFibGVkQ2hhbmdlZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgaWRlbnRpZmllciBsaXN0ZW5lcnMgdGhhdCB0aGUgc3RhdGUgb2YgYSBwcm9qZWN0IGhhcyBjaGFuZ2VkIHRoYXQgYWZmZWN0cyB0aGUKLQkgKiBlbmFibGVtZW50IG9mIGEgZ3JvdXAgZm9yIGEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgZmFpbCBzYWZlLCBpbiB0aGF0IGlmIG9uZSBsaXN0ZW5lciB0aHJvd3MKLQkgKiBhbiBleGNlcHRpb24gd2hpbGUgYmVpbmcgbm90aWZpZWQsIGl0IHdpbGwgbm90IHN0b3AgdGhlIG5vdGlmaWNhdGlvbiBvZiBvdGhlciBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQgbm90aWZ5aW5nIGFueSBvZiB0aGUgbGlzdGVuZXJzLiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZQotCSAqICAgICAgICAgICAgIGNvcmUgZXhjZXB0aW9uIGZvciB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbm90aWZ5RnVuY3Rpb25Hcm91cENoYW5nZWQoU3RyaW5nIGdyb3VwSUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlNYXAgaWRlbnRpZmllcnMgPSBnZXRJZGVudGlmaWVyc0J5SWQocHJvamVjdCk7Ci0KLQkJaWYgKGlkZW50aWZpZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpZGVudGlmaWVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJU3RhdHVzIGVycm9yU3RhdHVzID0gbnVsbDsKLQkJSVN0YXR1cyBuZXh0U3RhdHVzID0gbnVsbDsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWlkZW50aWZpZXIgPSAoRW5hYmxlbWVudElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCi0JCQlFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCA9IHVwZGF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcik7Ci0JCQl0cnkgewotCQkJCWlmIChldnQgIT0gbnVsbCkKLQkJCQkJaWRlbnRpZmllci5maXJlSWRlbnRpZmllckNoYW5nZWQoZXZ0KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vRGVmZXIgdGhlIGV4Y2VwdGlvbiBzbyBvdGhlcnMgY2FuIGhhbmRsZSBpdC4KLQkJCQluZXh0U3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vbk1lc3NhZ2VzLklOVEVSTkFMX0VSUk9SLCBleCk7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoZXJyb3JTdGF0dXMgPT0gbnVsbCkKLQkJCQkJZXJyb3JTdGF0dXMgPSBuZXh0U3RhdHVzOwotCQkJCWVsc2UgaWYgKGVycm9yU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkKLQkJCQkJKChNdWx0aVN0YXR1cykgZXJyb3JTdGF0dXMpLmFkZChuZXh0U3RhdHVzKTsKLQkJCQllbHNlIHsKLQkJCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0ge2Vycm9yU3RhdHVzLCBuZXh0U3RhdHVzfTsKLQkJCQkJZXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoZXJyb3JTdGF0dXMuZ2V0UGx1Z2luKCksIGVycm9yU3RhdHVzLmdldENvZGUoKSwgY2hpbGRyZW4sIFdUUENvbW1vbk1lc3NhZ2VzLklOVEVSTkFMX0VSUk9SLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAoZXJyb3JTdGF0dXMgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKGVycm9yU3RhdHVzKTsKLQotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjbGllbnRzIHRvIGRpc3Bvc2Ugb2YgbGlzdGVuZXJzCi0JICogCi0JICogQHBhcmFtIGVuYWJsZW1lbnRJZGVudGlmaWVycwotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIoQ29sbGVjdGlvbiBlbmFibGVtZW50SWRlbnRpZmllcnMsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBlbmFibGVtZW50SWRlbnRpZmllcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IChJRW5hYmxlbWVudElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWRlbnRpZmllci5yZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODI1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvRnVuY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlci9ibGFuY2V0dAotICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Hcm91cCBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRV9BVFRSID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfREVTQ19BVFRSID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VOQUJMRURfQllfREVGQVVMVF9BVFRSID0gImVuYWJsZWRCeURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUFJJT1JJVFlfQVRUUiA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9JTlRJQUxJWkVSX0NMQVNTX0FUVFIgPSAiaW5pdGlhbGl6ZXJDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FR0FUSVZFX1BSSU9SSVRZID0gLTE7Ci0KLQlwcml2YXRlIFN0cmluZyBncm91cElEOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgaW50aWFsaXplckNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdFeHRlbnNpb247Ci0JcHJpdmF0ZSBpbnQgcHJpb3JpdHkgPSBORUdBVElWRV9QUklPUklUWTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSUdyb3VwSW5pdGlhbGl6ZXIgZ3JvdXBJbnRlcmZhY2U7Ci0JcHJpdmF0ZSBTZXQgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nczsKLS8vCXByaXZhdGUgdHJhbnNpZW50IEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ1tdIGZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3NBc0FycmF5OwotCXByaXZhdGUgYm9vbGVhbiBlcnJvclJlcG9ydGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cChTdHJpbmcgZ3JvdXBJRCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5ncm91cElEID0gZ3JvdXBJRDsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfREVTQ19BVFRSKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCVN0cmluZyBnZXRJbml0YWxpemVyQ2xhc3NOYW1lKCkgewotCQlpZiAoaW50aWFsaXplckNsYXNzTmFtZSA9PSBudWxsKQotCQkJaW50aWFsaXplckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUik7Ci0JCXJldHVybiBpbnRpYWxpemVyQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FX0FUVFIpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWNsYXJpbmdFeHRlbnNpb25OYW1lKCkgewotCQlpZiAoZGVjbGFyaW5nRXh0ZW5zaW9uID09IG51bGwpIHsKLQkJCWlmIChlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlkZWNsYXJpbmdFeHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0V4dGVuc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdyb3VwSUQoKSB7Ci0JCXJldHVybiBncm91cElEOwotCX0KLQotCUlHcm91cEluaXRpYWxpemVyIGdldEluaXRpYWxpemVyQ2xhc3MoKSB7Ci0JCWlmIChncm91cEludGVyZmFjZSA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlncm91cEludGVyZmFjZSA9IChJR3JvdXBJbml0aWFsaXplcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEdST1VQX0lOVElBTElaRVJfQ0xBU1NfQVRUUik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjkiLCBuZXcgT2JqZWN0W117R1JPVVBfSU5USUFMSVpFUl9DTEFTU19BVFRSLCBnZXRJbml0YWxpemVyQ2xhc3NOYW1lKCksIGdldERlY2xhcmluZ0V4dGVuc2lvbk5hbWUoKX0pICsgIlxyXG4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCXJldHVybiBncm91cEludGVyZmFjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlwiIiArIGdldE5hbWUoKSArICJcIiAoIiArIGdldEdyb3VwSUQoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQlpZiAocHJpb3JpdHkgPT0gTkVHQVRJVkVfUFJJT1JJVFkpCi0JCQlwcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfUFJJT1JJVFlfQVRUUikpOwotCQlyZXR1cm4gcHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKGdldEluaXRpYWxpemVyQ2xhc3MoKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldEluaXRpYWxpemVyQ2xhc3MoKS5pc0dyb3VwRW5hYmxlZChwcm9qZWN0KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMuZXF1YWxzKG8pKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKCEobyBpbnN0YW5jZW9mIEZ1bmN0aW9uR3JvdXApKQotCQkJcmV0dXJuIDE7Ci0KLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBvOwotCQlpZiAoZ2V0UHJpb3JpdHkoKSA9PSBncm91cC5nZXRQcmlvcml0eSgpKQotCQkJcmV0dXJuIGdldEdyb3VwSUQoKS5jb21wYXJlVG8oZ3JvdXAuZ2V0R3JvdXBJRCgpKTsKLQotCQllbHNlIGlmIChnZXRQcmlvcml0eSgpIDwgZ3JvdXAuZ2V0UHJpb3JpdHkoKSkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID09IG51bGwpIHsKLQkJCWlmICghZXJyb3JSZXBvcnRlZCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMCIsIG5ldyBPYmplY3RbXXtnZXRHcm91cElEKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllcnJvclJlcG9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nID0gKEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmdldFBhdHRlcm4oKS5tYXRjaGVyKHN0cmluZykubWF0Y2hlcygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWJvb2xlYW4gc2V0RnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncyhTZXQgZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncykgewotCQlmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID0gVXRpbC5zYWZlQ29weShmdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzLCBGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuY2xhc3MpOwotCi0JCWlmICghVXRpbC5lcXVhbHMoZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5ncywgdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKSkgewotCQkJdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzID0gZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nczsKLS8vCQkJdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzQXNBcnJheSA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdbXSkgdGhpcy5mdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzLnRvQXJyYXkobmV3IEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ1t0aGlzLmZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZ3Muc2l6ZSgpXSk7Ci0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg3NzcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9GQUNUT1IgPSA4OTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSEFTSF9JTklUSUFMID0gRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nLmNsYXNzLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotCXByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uR3JvdXBJZDsKLQlwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzaENvZGU7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYXNoQ29kZUNvbXB1dGVkOwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBzdHJpbmc7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyhTdHJpbmcgZnVuY3Rpb25Hcm91cElkLCBQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXRoaXMuZnVuY3Rpb25Hcm91cElkID0gZnVuY3Rpb25Hcm91cElkOwotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmplY3QpIHsKLQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGNhc3RlZE9iamVjdCA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcpIG9iamVjdDsKLQkJaW50IGNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShmdW5jdGlvbkdyb3VwSWQsIGNhc3RlZE9iamVjdC5mdW5jdGlvbkdyb3VwSWQpOwotCi0JCWlmIChjb21wYXJlVG8gPT0gMCkKLQkJCWNvbXBhcmVUbyA9IFV0aWwuY29tcGFyZShwYXR0ZXJuLnBhdHRlcm4oKSwgY2FzdGVkT2JqZWN0LnBhdHRlcm4ucGF0dGVybigpKTsKLQotCQlyZXR1cm4gY29tcGFyZVRvOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIGNhc3RlZE9iamVjdCA9IChGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmcpIG9iamVjdDsKLQkJYm9vbGVhbiBlcXVhbHMgPSB0cnVlOwotCQllcXVhbHMgJj0gVXRpbC5lcXVhbHMoZnVuY3Rpb25Hcm91cElkLCBjYXN0ZWRPYmplY3QuZnVuY3Rpb25Hcm91cElkKTsKLQkJZXF1YWxzICY9IFV0aWwuZXF1YWxzKHBhdHRlcm4sIGNhc3RlZE9iamVjdC5wYXR0ZXJuKTsKLQkJcmV0dXJuIGVxdWFsczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5SWQoKSB7Ci0JCXJldHVybiBmdW5jdGlvbkdyb3VwSWQ7Ci0JfQotCi0JcHVibGljIFBhdHRlcm4gZ2V0UGF0dGVybigpIHsKLQkJcmV0dXJuIHBhdHRlcm47Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKCFoYXNoQ29kZUNvbXB1dGVkKSB7Ci0JCQloYXNoQ29kZSA9IEhBU0hfSU5JVElBTDsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUoZnVuY3Rpb25Hcm91cElkKTsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiBIQVNIX0ZBQ1RPUiArIFV0aWwuaGFzaENvZGUocGF0dGVybik7Ci0JCQloYXNoQ29kZUNvbXB1dGVkID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBoYXNoQ29kZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKCdbJykuYXBwZW5kKGZ1bmN0aW9uR3JvdXBJZCkuYXBwZW5kKCIscGF0dGVybj1cIiIpLmFwcGVuZChwYXR0ZXJuLnBhdHRlcm4oKSkuYXBwZW5kKCJcIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdHJpbmcgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBzdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0Z1bmN0aW9uR3JvdXBSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZjOTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9GdW5jdGlvbkdyb3VwUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogVGhlIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSB3aWxsIGNvbnN1bWUgQ29uZmlndXJhdGlvbiBlbGVtZW50cyBjb25mb3JtaW5nIHRvIHRoZSBGdW5jdGlvbkdyb3VwCi0gKiBFeHRlbnNpb24gUG9pbnQgc2NoZW1hLgotICogCi0gKiBAYXV0aG9yIG1kZWxkZXIvYmxhbmNldHQKLSAqLwotcHVibGljIGNsYXNzIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9FTEVNRU5UID0gImZ1bmN0aW9uR3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSURfQVRUUiA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fR1JPVVBfUEFUVEVSTl9CSU5ESU5HX0VMTVQgPSAiZnVuY3Rpb25Hcm91cFBhdHRlcm5CaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVFRFUk5fQVRUUiA9ICJwYXR0ZXJuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBNYXBCeUlkOwotCXByaXZhdGUgTGlzdCBrbm93bkdyb3VwczsKLQlwcml2YXRlIE1hcCBwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQ7Ci0KLQlwcml2YXRlIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSgpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgV1RQQ29tbW9uUGx1Z2luLkdST1VQX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7Ci0JCXBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IEZ1bmN0aW9uR3JvdXBSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBSZWFkIGFsbCB0aGUgZWxlbWVudHMgZmlyc3QsIHRoZW4gc2V0IHRoZSBwYXR0ZXJuIGJpbmRpbmdzIG9uIHRoZSBmdW5jdGlvbgotCSAqIGdyb3VwcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJc3VwZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCXNldFBhdHRlcm5CaW5kaW5ncygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXR0ZXJuQmluZGluZ3MoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXBJZCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU2V0IHZhbHVlID0gKFNldCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUZ1bmN0aW9uR3JvdXAgYUdyb3VwID0gZ2V0R3JvdXBCeUlEKGdyb3VwSWQpOwotCQkJaWYgKGFHcm91cCAhPSBudWxsKQotCQkJCWFHcm91cC5zZXRGdW5jdGlvbkdyb3VwUGF0dGVybkJpbmRpbmdzKHZhbHVlKTsKLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhHUk9VUF9FTEVNRU5UKSkgewotCQkJcmVhZEdyb3VwKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEZVTkNUSU9OX0dST1VQX1BBVFRFUk5fQklORElOR19FTE1UKSkgewotCQkJcmVhZFBhdHRlcm5CaW5kaW5nKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRQYXR0ZXJuQmluZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3JvdXBJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lEX0FUVFIpOwotCQlTdHJpbmcgcGF0dGVybiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBVFRFUk5fQVRUUik7Ci0JCWlmICghaXNOdWxsT3JFbXB0eShncm91cElEKSAmJiAhaXNOdWxsT3JFbXB0eShwYXR0ZXJuKSkgewotCQkJUGF0dGVybiBhUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKTsKLQkJCUZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyBiaW5kaW5nID0gbmV3IEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyhncm91cElELCBhUGF0dGVybik7Ci0JCQlhZGRQYXR0ZXJuQmluZGluZyhncm91cElELCBiaW5kaW5nKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJpbmRpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUGF0dGVybkJpbmRpbmcoU3RyaW5nIGdyb3VwSUQsIEZ1bmN0aW9uR3JvdXBQYXR0ZXJuQmluZGluZyBiaW5kaW5nKSB7Ci0JCVNldCBiaW5kaW5ncyA9IChTZXQpIHBhdHRlcm5CaW5kaW5nc0J5R3JvdXBJZC5nZXQoZ3JvdXBJRCk7Ci0JCWlmIChiaW5kaW5ncyA9PSBudWxsKSB7Ci0JCQliaW5kaW5ncyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlwYXR0ZXJuQmluZGluZ3NCeUdyb3VwSWQucHV0KGdyb3VwSUQsIGJpbmRpbmdzKTsKLQkJfQotCQliaW5kaW5ncy5hZGQoYmluZGluZyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIGFTdHJpbmcpIHsKLQkJcmV0dXJuIGFTdHJpbmcgPT0gbnVsbCB8fCBhU3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRHcm91cChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3JvdXBJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEdST1VQX0lEX0FUVFIpOwotCQlpZiAoIWlzTnVsbE9yRW1wdHkoZ3JvdXBJRCkpIHsKLQkJCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSBuZXcgRnVuY3Rpb25Hcm91cChncm91cElELCBlbGVtZW50KTsKLQkJCWdldEdyb3VwTWFwQnlJZCgpLnB1dChncm91cElELCBncm91cCk7Ci0JCQlnZXRLbm93bkdyb3VwcygpLmFkZChncm91cCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QXNjZW5kaW5nU29ydGVkR3JvdXBzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQ29tcGFyYXRvciBhc2NlbmRpbmdHcnBDb21wYXJhdG9yID0gQXNjZW5kaW5nR3JvdXBDb21wYXJhdG9yLnNpbmdsZXRvbigpOwotCQlMaXN0IGdyb3VwTGlzdCA9IGdldEtub3duR3JvdXBzKHByb2plY3QpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGdyb3VwTGlzdCwgYXNjZW5kaW5nR3JwQ29tcGFyYXRvcik7Ci0JCXJldHVybiBncm91cExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldERlc2NlbmRpbmdTb3J0ZWRHcm91cHMoSVByb2plY3QgcHJvamVjdCkgewotCQlDb21wYXJhdG9yIGRlc2NlbmRpbmdHcnBDb21wYXJhdG9yID0gRGVzY2VuZGluZ0dyb3VwQ29tcGFyYXRvci5zaW5nbGV0b24oKTsKLQkJTGlzdCBncm91cExpc3QgPSBnZXRLbm93bkdyb3Vwcyhwcm9qZWN0KTsKLQkJQ29sbGVjdGlvbnMuc29ydChncm91cExpc3QsIGRlc2NlbmRpbmdHcnBDb21wYXJhdG9yKTsKLQkJcmV0dXJuIGdyb3VwTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRLbm93bkdyb3VwcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFycmF5TGlzdCBncm91cEJ5UHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KGdldEtub3duR3JvdXBzKCkuc2l6ZSgpKTsKLQkJTGlzdCBncm91cExpc3QgPSBnZXRLbm93bkdyb3VwcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTGlzdC5zaXplKCk7IGkrKykgewotCQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IChGdW5jdGlvbkdyb3VwKSBncm91cExpc3QuZ2V0KGkpOwotCQkJaWYgKGdyb3VwLmlzRW5hYmxlZChwcm9qZWN0KSkKLQkJCQlncm91cEJ5UHJvamVjdExpc3QuYWRkKGdyb3VwKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXBCeVByb2plY3RMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFzY2VuZGluZ1ByaW9yaXR5R3JvdXBOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3Qgc29ydGVkR3JvdXAgPSBnZXRBc2NlbmRpbmdTb3J0ZWRHcm91cHMocHJvamVjdCk7Ci0JCXJldHVybiBnZXRHcm91cExpc3ROYW1lcyhzb3J0ZWRHcm91cCwgbmV3IEFycmF5TGlzdChzb3J0ZWRHcm91cC5zaXplKCkpKTsKLQotCX0KLQotCXB1YmxpYyBMaXN0IGdldERlc2NlbmRpbmdQcmlvcml0eUdyb3VwTmFtZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHNvcnRlZEdyb3VwID0gZ2V0RGVzY2VuZGluZ1NvcnRlZEdyb3Vwcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldEdyb3VwTGlzdE5hbWVzKHNvcnRlZEdyb3VwLCBuZXcgQXJyYXlMaXN0KHNvcnRlZEdyb3VwLnNpemUoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRHcm91cExpc3ROYW1lcyhMaXN0IHNvcnRlZEdyb3VwLCBMaXN0IHNvcnRlZEdyb3VwTmFtZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRHcm91cC5zaXplKCk7IGkrKykgewotCQkJRnVuY3Rpb25Hcm91cCBncnAgPSAoRnVuY3Rpb25Hcm91cCkgc29ydGVkR3JvdXAuZ2V0KGkpOwotCQkJc29ydGVkR3JvdXBOYW1lcy5hZGQoZ3JwLmdldEdyb3VwSUQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvcnRlZEdyb3VwTmFtZXM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEdyb3VwSURzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXBNYXBCeUlkKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgRnVuY3Rpb25Hcm91cCBnZXRHcm91cEJ5SUQoU3RyaW5nIGdyb3VwSUQpIHsKLQkJcmV0dXJuIChGdW5jdGlvbkdyb3VwKSBnZXRHcm91cE1hcEJ5SWQoKS5nZXQoZ3JvdXBJRCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcm91cEVuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGdyb3VwSUQpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cCA9IGdldEdyb3VwQnlJRChncm91cElEKTsKLQkJaWYgKGdyb3VwICE9IG51bGwpCi0JCQlyZXR1cm4gZ3JvdXAuaXNFbmFibGVkKHByb2plY3QpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0S25vd25Hcm91cHMoKSB7Ci0JCWlmIChrbm93bkdyb3VwcyA9PSBudWxsKQotCQkJa25vd25Hcm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBrbm93bkdyb3VwczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdyb3VwTWFwQnlJZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldEdyb3VwTWFwQnlJZCgpIHsKLQkJaWYgKGdyb3VwTWFwQnlJZCA9PSBudWxsKQotCQkJZ3JvdXBNYXBCeUlkID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGdyb3VwTWFwQnlJZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHR3byBncm91cHMgcmVmZXJlbmNlZCBieQotCSAqIAotCSAqIEBncm91cElEMSBhbmQKLQkgKiBAZ3JvdXBJRDIKLQkgKiAKLQkgKiBAcGFyYW0gZ3JvdXBJRDEKLQkgKiBAcGFyYW0gZ3JvdXBJRDIKLQkgKiBAcmV0dXJuIDAgaWYgdGhlIHR3byBncm91cHMgYXJlIGVxdWFsLCAxIGlmCi0JICogQGdyb3VwSUQxIGhhcyBhIGhpZ2hlciBwcmVjZWRlbmNlLCBvdGhlcndpc2UgLTEKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGdyb3VwSUQxLCBTdHJpbmcgZ3JvdXBJRDIpIHsKLQkJRnVuY3Rpb25Hcm91cCBncm91cDEgPSBnZXRHcm91cEJ5SUQoZ3JvdXBJRDEpOwotCQlGdW5jdGlvbkdyb3VwIGdyb3VwMiA9IGdldEdyb3VwQnlJRChncm91cElEMik7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjgiLCBuZXcgT2JqZWN0W117Z3JvdXBJRDF9KSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyOCIsIG5ldyBPYmplY3RbXXtncm91cElEMn0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwMS5jb21wYXJlVG8oZ3JvdXAyKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdyb3VwUHJpb3JpdHkoU3RyaW5nIGdycElkKSB7Ci0JCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSBnZXRHcm91cEJ5SUQoZ3JwSWQpOwotCQlyZXR1cm4gKGdyb3VwICE9IG51bGwpID8gZ3JvdXAuZ2V0UHJpb3JpdHkoKSA6IC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RnVuY3Rpb25Qcmlvcml0eShTdHJpbmcgZW5hYmxlbWVudElEKSB7Ci0JCWludCBwcmlvcml0eSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0S25vd25Hcm91cHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZ1bmN0aW9uR3JvdXAgZ3JvdXAgPSAoRnVuY3Rpb25Hcm91cCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZ3JvdXAuaXNNYXRjaChlbmFibGVtZW50SUQpKQotCQkJCXByaW9yaXR5ID0gTWF0aC5taW4ocHJpb3JpdHksIGdyb3VwLmdldFByaW9yaXR5KCkpOwotCQl9Ci0JCXJldHVybiBwcmlvcml0eTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lFbmFibGVtZW50SWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzNkODEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTAsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50SWRlbnRpZmllciB7Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JSWRlbnRpZmllckxpc3RlbmVyPC9jb2RlPiB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8KLQkgKiBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGlkZW50aWZpZXJMaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIHRvIHJlZ2lzdGVyLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlCi0JICogICAgICAgICAgICB0byByZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGluc3RhbmNlLCBubwotCSAqICAgICAgICAgICAgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KLQkgKi8KLQl2b2lkIGFkZElkZW50aWZpZXJMaXN0ZW5lcihJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciBpZGVudGlmaWVyTGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIGZ1bmN0aW9uIGdyb3VwIGlkcyB0aGF0IHRoaXMgaW5zdGFuY2UgbWF0Y2hlcy4KLQkgKiA8cD4KLQkgKiBOb3RpZmljYXRpb24gaXMgc2VudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaWYgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYWN0aXZpdHkgaWRzIHRoYXQgdGhpcyBpbnN0YW5jZSBtYXRjaGVzLiBUaGlzIHNldCBtYXkgYmUgZW1wdHksIGJ1dCBpcwotCSAqICAgICAgICAgZ3VhcmFudGVlZCBub3QgdG8gYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgc2V0IGlzIG5vdCBlbXB0eSwgaXQgaXMgZ3VhcmFudGVlZAotCSAqICAgICAgICAgdG8gb25seSBjb250YWluIGluc3RhbmNlcyBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqLwotCVNldCBnZXRGdW5jdGlvbkdyb3VwSWRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGlzIGluc3RhbmNlLiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBpbnN0YW5jZSBpcyBlbmFibGVkLgotCSAqIDxwPgotCSAqIE5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpZiB0aGlzIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSwgaWZmIHRoaXMgaW5zdGFuY2UgaXMgZW5hYmxlZC4KLQkgKi8KLQlib29sZWFuIGlzRW5hYmxlZCgpOwotCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXI8L2NvZGU+IGxpc3RlbmluZyBmb3IgY2hhbmdlcwotCSAqIHRvIHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllckxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gdW5yZWdpc3Rlci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uIElmIGFuIGF0dGVtcHQgaXMKLQkgKiAgICAgICAgICAgIG1hZGUgdG8gdW5yZWdpc3RlciBhbiBpbnN0YW5jZSB3aGljaCBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSwKLQkgKiAgICAgICAgICAgIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCi0JICovCi0Jdm9pZCByZW1vdmVJZGVudGlmaWVyTGlzdGVuZXIoSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgaWRlbnRpZmllckxpc3RlbmVyKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGNmOTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxMCwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9mIGFuIGluc3RhbmNlIG9mIDxjb2RlPklJZGVudGlmaWVyPC9jb2RlPiBoYXZlCi0JICogY2hhbmdlZC4gU3BlY2lmaWMgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGluIHRoZSA8Y29kZT5JZGVudGlmaWVyRXZlbnQ8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyRXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGV2ZW50LiBHdWFyYW50ZWVkIG5vdCB0byBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQl2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JRW5hYmxlbWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0Yzk0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUVuYWJsZW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDEyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci0KLS8qKgotICogQGF1dGhvciBzY2hhY2hlcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbmFibGVtZW50TWFuYWdlciB7Ci0JU3RyaW5nIElOVEVSTkFMX0VOQUJMRU1FTlRfREVURVJNSU5BVElPTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRW5hYmxlbWVudERldGVybWluYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlJRW5hYmxlbWVudE1hbmFnZXIgSU5TVEFOQ0UgPSAoSUVuYWJsZW1lbnRNYW5hZ2VyKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElOVEVSTkFMX0VOQUJMRU1FTlRfREVURVJNSU5BVElPTl9JRCk7Ci0KLQlJRW5hYmxlbWVudElkZW50aWZpZXIgZ2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcklkLCBJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIE5vdGlmeSBhbGwgaWRlbnRpZmllciBsaXN0ZW5lcnMgdGhhdCB0aGUgc3RhdGUgb2YgYSBwcm9qZWN0IGhhcyBjaGFuZ2VkIHRoYXQgYWZmZWN0cyB0aGUKLQkgKiBlbmFibGVtZW50IG9mIGEgZ3JvdXAgZm9yIGEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgZmFpbCBzYWZlLCBpbiB0aGF0IGlmIG9uZSBsaXN0ZW5lciB0aHJvd3MKLQkgKiBhbiBleGNlcHRpb24gd2hpbGUgYmVpbmcgbm90aWZpZWQsIGl0IHdpbGwgbm90IHN0b3AgdGhlIG5vdGlmaWNhdGlvbiBvZiBvdGhlciBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQgbm90aWZ5aW5nIGFueSBvZiB0aGUgbGlzdGVuZXJzLiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZQotCSAqICAgICAgICAgICAgIGNvcmUgZXhjZXB0aW9uIGZvciB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMuCi0JICovCi0Jdm9pZCBub3RpZnlGdW5jdGlvbkdyb3VwQ2hhbmdlZChTdHJpbmcgZ3JvdXBJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2xpZW50cyB0byBkaXNwb3NlIG9mIGxpc3RlbmVycwotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVtZW50SWRlbnRpZmllcnMKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIoQ29sbGVjdGlvbiBlbmFibGVtZW50SWRlbnRpZmllcnMsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSUdyb3VwSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JR3JvdXBJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNkYzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JR3JvdXBJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIGJsYW5jZXR0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdyb3VwSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIGJvb2xlYW4gaXNHcm91cEVuYWJsZWQoSVByb2plY3QgcHJvamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvZW5hYmxlbWVudC9JZGVudGlmaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzNjRiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkZW50aWZpYWJsZSB7Ci0KLQkvKioKLQkgKiByZXR1cm4gaWQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgaW5zdGFuY2Ugb2YgYW4gZXh0ZW5zaW9uIHBvaW50LiBJdCBpcyB1cCB0byBlYWNoCi0JICogaW5kaXZpZHVhbCBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXIgdG8gZGVjaWRlIHdoYXQgdGhhdCBtaWdodCBiZSAoZS5nLiwgImVkaXRvcklEIiwgInBhZ2VJRCIsCi0JICogZXRjLgotCSAqLwotCVN0cmluZyBnZXRJRCgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIgdGhlIElkZW50aWZpYWJsZSBlbGVtZW50IHdhcyBsb2FkZWQKLQkgKi8KLQlpbnQgZ2V0TG9hZE9yZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L0lkZW50aWZpYWJsZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjZjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvSWRlbnRpZmlhYmxlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIElkZW50aWZpYWJsZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX1RIQU4gPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEVTU19USEFOID0gLTE7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFUVVBTCA9IDA7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElkZW50aWZpYWJsZUNvbXBhcmF0b3IgaW5zdGFuY2UgPSBuZXcgSWRlbnRpZmlhYmxlQ29tcGFyYXRvcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJJT1JJVFkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgSWRlbnRpZmlhYmxlQ29tcGFyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlJZGVudGlmaWFibGUgbHZhbHVlID0gbnVsbDsKLQkJSWRlbnRpZmlhYmxlIHJ2YWx1ZSA9IG51bGw7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIElkZW50aWZpYWJsZSkKLQkJCWx2YWx1ZSA9IChJZGVudGlmaWFibGUpIG8xOwotCQlpZiAobzIgaW5zdGFuY2VvZiBJZGVudGlmaWFibGUpCi0JCQlydmFsdWUgPSAoSWRlbnRpZmlhYmxlKSBvMjsKLQotCQlpZiAocnZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gR1JFQVRFUl9USEFOOwotCQlpZiAobHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gTEVTU19USEFOOwotCi0JCWlmICgobHZhbHVlLmdldElEKCkgPT0gbnVsbCAmJiBydmFsdWUuZ2V0SUQoKSA9PSBudWxsKSB8fCAoZ2V0UHJpb3JpdHkobHZhbHVlKSA9PSBnZXRQcmlvcml0eShydmFsdWUpKSkKLQkJCXJldHVybiBjb21wYXJlTG9hZE9yZGVyKGx2YWx1ZSwgcnZhbHVlKTsKLQkJLyogUiAtIEwgaW1wbGllcyAwIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5ICovCi0JCXJldHVybiBnZXRQcmlvcml0eShsdmFsdWUpIC0gZ2V0UHJpb3JpdHkocnZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBJZGVudGlmaWFibGVDb21wYXJhdG9yOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXBhcmVMb2FkT3JkZXIoSWRlbnRpZmlhYmxlIGx2YWx1ZSwgSWRlbnRpZmlhYmxlIHJ2YWx1ZSkgewotCQkvKiBSIC0gTCBpbXBsaWVzIDAgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKi8KLQkJcmV0dXJuIGx2YWx1ZS5nZXRMb2FkT3JkZXIoKSAtIHJ2YWx1ZS5nZXRMb2FkT3JkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KElkZW50aWZpYWJsZSBpZGVudGlmaWFibGUpIHsKLQkJaWYgKGlkZW50aWZpYWJsZS5nZXRJRCgpICE9IG51bGwgJiYgaWRlbnRpZmlhYmxlLmdldElEKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIEZ1bmN0aW9uR3JvdXBSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEZ1bmN0aW9uUHJpb3JpdHkoaWRlbnRpZmlhYmxlLmdldElEKCkpOwotCQlyZXR1cm4gREVGQVVMVF9QUklPUklUWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9lbmFibGVtZW50L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMjcwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL2VuYWJsZW1lbnQvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKgotICogUmVuYW1lIHRoaXMgY2xhc3MgdG8gRW5hYmxlbWVudHNVdGlsCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFV0aWwgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU29ydGVkTWFwIEVNUFRZX1NPUlRFRF9NQVAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoKSk7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTb3J0ZWRTZXQgRU1QVFlfU09SVEVEX1NFVCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChuZXcgVHJlZVNldCgpKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBaRVJPX0xFTkdUSF9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMpIHsKLQkJYXNzZXJ0SW5zdGFuY2Uob2JqZWN0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKE9iamVjdCBvYmplY3QsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCAmJiBhbGxvd051bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQllbHNlIGlmICghYy5pc0luc3RhbmNlKG9iamVjdCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShib29sZWFuIGxlZnQsIGJvb2xlYW4gcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gZmFsc2UgPyAocmlnaHQgPT0gdHJ1ZSA/IC0xIDogMCkgOiAxOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoQ29tcGFyYWJsZSBsZWZ0LCBDb21wYXJhYmxlIHJpZ2h0KSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChsZWZ0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWVsc2UgaWYgKHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIGxlZnQuY29tcGFyZVRvKHJpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKENvbXBhcmFibGVbXSBsZWZ0LCBDb21wYXJhYmxlW10gcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5sZW5ndGg7Ci0JCQlpbnQgciA9IHJpZ2h0Lmxlbmd0aDsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKGxlZnRbaV0sIHJpZ2h0W2ldKTsKLQotCQkJCWlmIChjb21wYXJlVG8gIT0gMCkKLQkJCQkJcmV0dXJuIGNvbXBhcmVUbzsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0IC0gcmlnaHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShMaXN0IGxlZnQsIExpc3QgcmlnaHQpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGxlZnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAocmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQllbHNlIHsKLQkJCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQotCQkJaWYgKGwgIT0gcikKLQkJCQlyZXR1cm4gbCAtIHI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGw7IGkrKykgewotCQkJCWludCBjb21wYXJlVG8gPSBjb21wYXJlKChDb21wYXJhYmxlKSBsZWZ0LmdldChpKSwgKENvbXBhcmFibGUpIHJpZ2h0LmdldChpKSk7Ci0KLQkJCQlpZiAoY29tcGFyZVRvICE9IDApCi0JCQkJCXJldHVybiBjb21wYXJlVG87Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKE1hcCBsZWZ0LCBNYXAgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IGRpZmZlcmVudCwgU2V0IHJpZ2h0T25seSkgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwgfHwgbGVmdE9ubHkgPT0gbnVsbCB8fCBkaWZmZXJlbnQgPT0gbnVsbCB8fCByaWdodE9ubHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGVmdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghcmlnaHQuY29udGFpbnNLZXkoa2V5KSkKLQkJCQlsZWZ0T25seS5hZGQoa2V5KTsKLQkJCWVsc2UgaWYgKCFVdGlsLmVxdWFscyhsZWZ0LmdldChrZXkpLCByaWdodC5nZXQoa2V5KSkpCi0JCQkJZGlmZmVyZW50LmFkZChrZXkpOwotCQl9Ci0KLQkJaXRlcmF0b3IgPSByaWdodC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghbGVmdC5jb250YWluc0tleShrZXkpKQotCQkJCXJpZ2h0T25seS5hZGQoa2V5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaWZmKFNldCBsZWZ0LCBTZXQgcmlnaHQsIFNldCBsZWZ0T25seSwgU2V0IHJpZ2h0T25seSkgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwgfHwgbGVmdE9ubHkgPT0gbnVsbCB8fCByaWdodE9ubHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGVmdC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghcmlnaHQuY29udGFpbnMob2JqZWN0KSkKLQkJCQlsZWZ0T25seS5hZGQob2JqZWN0KTsKLQkJfQotCi0JCWl0ZXJhdG9yID0gcmlnaHQuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoIWxlZnQuY29udGFpbnMob2JqZWN0KSkKLQkJCQlyaWdodE9ubHkuYWRkKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoTGlzdCBsZWZ0LCBMaXN0IHJpZ2h0LCBib29sZWFuIGVxdWFscykgewotCQlpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsID0gbGVmdC5zaXplKCk7Ci0JCWludCByID0gcmlnaHQuc2l6ZSgpOwotCQlpZiAociA+IGwgfHwgIWVxdWFscyAmJiByID09IGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0LmdldChsIC0gaSAtIDEpLCByaWdodC5nZXQociAtIGkgLSAxKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByOyBpKyspCi0JCQlpZiAoIWVxdWFscyhsZWZ0W2wgLSBpIC0gMV0sIHJpZ2h0W3IgLSBpIC0gMV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhib29sZWFuIGxlZnQsIGJvb2xlYW4gcmlnaHQpIHsKLQkJcmV0dXJuIGxlZnQgPT0gcmlnaHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCXJldHVybiBsZWZ0ID09IHJpZ2h0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQlyZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgPT0gbnVsbCA6IGxlZnQuZXF1YWxzKHJpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShib29sZWFuIGIpIHsKLQkJcmV0dXJuIGIgPyBCb29sZWFuLlRSVUUuaGFzaENvZGUoKSA6IEJvb2xlYW4uRkFMU0UuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShpbnQgaSkgewotCQlyZXR1cm4gaTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCA/IG9iamVjdC5oYXNoQ29kZSgpIDogMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2FmZUNvcHkoTGlzdCBsaXN0LCBDbGFzcyBjKSB7Ci0JCXJldHVybiBzYWZlQ29weShsaXN0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNhZmVDb3B5KExpc3QgbGlzdCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCWxpc3QgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3QobGlzdCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJYXNzZXJ0SW5zdGFuY2UoaXRlcmF0b3IubmV4dCgpLCBjLCBhbGxvd051bGxFbGVtZW50cyk7Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgc2FmZUNvcHkoTWFwIG1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KG1hcCwga2V5Q2xhc3MsIHZhbHVlQ2xhc3MsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgc2FmZUNvcHkoTWFwIG1hcCwgQ2xhc3Mga2V5Q2xhc3MsIENsYXNzIHZhbHVlQ2xhc3MsIGJvb2xlYW4gYWxsb3dOdWxsS2V5cywgYm9vbGVhbiBhbGxvd051bGxWYWx1ZXMpIHsKLQkJaWYgKG1hcCA9PSBudWxsIHx8IGtleUNsYXNzID09IG51bGwgfHwgdmFsdWVDbGFzcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJbWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG5ldyBIYXNoTWFwKG1hcCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0S2V5KCksIGtleUNsYXNzLCBhbGxvd051bGxLZXlzKTsKLQkJCWFzc2VydEluc3RhbmNlKGVudHJ5LmdldFZhbHVlKCksIHZhbHVlQ2xhc3MsIGFsbG93TnVsbFZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IHNhZmVDb3B5KFNldCBzZXQsIENsYXNzIGMpIHsKLQkJcmV0dXJuIHNhZmVDb3B5KHNldCwgYywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IHNhZmVDb3B5KFNldCBzZXQsIENsYXNzIGMsIGJvb2xlYW4gYWxsb3dOdWxsRWxlbWVudHMpIHsKLQkJaWYgKHNldCA9PSBudWxsIHx8IGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXNldCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldChzZXQpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJYXNzZXJ0SW5zdGFuY2UoaXRlcmF0b3IubmV4dCgpLCBjLCBhbGxvd051bGxFbGVtZW50cyk7Ci0KLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBzYWZlQ29weShTb3J0ZWRNYXAgc29ydGVkTWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcykgewotCQlyZXR1cm4gc2FmZUNvcHkoc29ydGVkTWFwLCBrZXlDbGFzcywgdmFsdWVDbGFzcywgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBzYWZlQ29weShTb3J0ZWRNYXAgc29ydGVkTWFwLCBDbGFzcyBrZXlDbGFzcywgQ2xhc3MgdmFsdWVDbGFzcywgYm9vbGVhbiBhbGxvd051bGxLZXlzLCBib29sZWFuIGFsbG93TnVsbFZhbHVlcykgewotCQlpZiAoc29ydGVkTWFwID09IG51bGwgfHwga2V5Q2xhc3MgPT0gbnVsbCB8fCB2YWx1ZUNsYXNzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlzb3J0ZWRNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRNYXAobmV3IFRyZWVNYXAoc29ydGVkTWFwKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSwga2V5Q2xhc3MsIGFsbG93TnVsbEtleXMpOwotCQkJYXNzZXJ0SW5zdGFuY2UoZW50cnkuZ2V0VmFsdWUoKSwgdmFsdWVDbGFzcywgYWxsb3dOdWxsVmFsdWVzKTsKLQkJfQotCi0JCXJldHVybiBzb3J0ZWRNYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYykgewotCQlyZXR1cm4gc2FmZUNvcHkoc29ydGVkU2V0LCBjLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgc2FmZUNvcHkoU29ydGVkU2V0IHNvcnRlZFNldCwgQ2xhc3MgYywgYm9vbGVhbiBhbGxvd051bGxFbGVtZW50cykgewotCQlpZiAoc29ydGVkU2V0ID09IG51bGwgfHwgYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0KLQkJc29ydGVkU2V0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KG5ldyBUcmVlU2V0KHNvcnRlZFNldCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNvcnRlZFNldC5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQlhc3NlcnRJbnN0YW5jZShpdGVyYXRvci5uZXh0KCksIGMsIGFsbG93TnVsbEVsZW1lbnRzKTsKLQotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoKExpc3QgbGVmdCwgTGlzdCByaWdodCwgYm9vbGVhbiBlcXVhbHMpIHsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbCA9IGxlZnQuc2l6ZSgpOwotCQlpbnQgciA9IHJpZ2h0LnNpemUoKTsKLQkJaWYgKHIgPiBsIHx8ICFlcXVhbHMgJiYgciA9PSBsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnQuZ2V0KGkpLCByaWdodC5nZXQoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGgoT2JqZWN0W10gbGVmdCwgT2JqZWN0W10gcmlnaHQsIGJvb2xlYW4gZXF1YWxzKSB7Ci0JCWlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGwgPSBsZWZ0Lmxlbmd0aDsKLQkJaW50IHIgPSByaWdodC5sZW5ndGg7Ci0JCWlmIChyID4gbCB8fCAhZXF1YWxzICYmIHIgPT0gbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykKLQkJCWlmICghZXF1YWxzKGxlZnRbaV0sIHJpZ2h0W2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZVN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gVXRpbC50cmFuc2xhdGVTdHJpbmcocmVzb3VyY2VCdW5kbGUsIGtleSwga2V5LCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIFN0cmluZyBrZXksIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gc2lnbmFsLCBib29sZWFuIHRyaW0pIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwgJiYga2V5ICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWZpbmFsIFN0cmluZyB0cmFuc2xhdGVkU3RyaW5nID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0KLQkJCQlpZiAodHJhbnNsYXRlZFN0cmluZyAhPSBudWxsKQotCQkJCQlyZXR1cm4gdHJpbSA/IHRyYW5zbGF0ZWRTdHJpbmcudHJpbSgpIDogdHJhbnNsYXRlZFN0cmluZzsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlTWlzc2luZ1Jlc291cmNlKSB7Ci0JCQkJaWYgKHNpZ25hbCkKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGVNaXNzaW5nUmVzb3VyY2UpOwotCQkJfQotCi0JCXJldHVybiB0cmltID8gc3RyaW5nLnRyaW0oKSA6IHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIFV0aWwoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzU0YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJlT3BzID0gbnVsbDsKLQlwcml2YXRlIEFycmF5TGlzdCBwb3N0T3BzID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NlZEV4dGVuZGVkT3BlcmF0aW9uSG9sZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zZWRFeHRlbmRlZE9wZXJhdGlvbkhvbGRlciBjcmVhdGVFeHRlbmRlZE9wZXJhdGlvbkhvbGRlcihTdHJpbmcgb3BlcmF0aW9uSUQpIHsKLQkJQ29sbGVjdGlvbiBleHRlbnNpb25zID0gKENvbGxlY3Rpb24pIE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5nZXRFeHRlbnNpb25Qb2ludHMoKS5nZXQob3BlcmF0aW9uSUQpOwotCQlpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIgZXh0T3BlcmF0aW9uSG9sZGVyID0gbmV3IENvbXBvc2VkRXh0ZW5kZWRPcGVyYXRpb25Ib2xkZXIoKTsKLQkJT2JqZWN0IHByZU9wID0gbnVsbDsKLQkJT2JqZWN0IHBvc3RPcCA9IG51bGw7Ci0JCU9wZXJhdGlvbkV4dGVuc2lvbiBjdXJyZW50RXh0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJY3VycmVudEV4dCA9IChPcGVyYXRpb25FeHRlbnNpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGN1cnJlbnRFeHQuZ2V0RXh0ZW5zaW9uSWQoKSwgbnVsbCkuaXNFbmFibGVkKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcmVPcCA9IGN1cnJlbnRFeHQuZ2V0UHJlT3BlcmF0aW9uKCk7Ci0JCQkJCWlmIChwcmVPcCAhPSBudWxsKSB7Ci0JCQkJCQlleHRPcGVyYXRpb25Ib2xkZXIuYWRkUHJlT3BlcmF0aW9uKHByZU9wKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCXBvc3RPcCA9IGN1cnJlbnRFeHQuZ2V0UG9zdE9wZXJhdGlvbigpOwotCQkJCQlpZiAocG9zdE9wICE9IG51bGwpIHsKLQkJCQkJCWV4dE9wZXJhdGlvbkhvbGRlci5hZGRQb3N0T3BlcmF0aW9uKHBvc3RPcCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZXh0T3BlcmF0aW9uSG9sZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByZU9wZXJhdGlvbihPYmplY3QgcHJlT3BlcmF0aW9uKSB7Ci0JCWlmIChwcmVPcHMgPT0gbnVsbCkgewotCQkJcHJlT3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXByZU9wcy5hZGQocHJlT3BlcmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3N0T3BlcmF0aW9uKE9iamVjdCBwb3N0T3BlcmF0aW9uKSB7Ci0JCWlmIChwb3N0T3BzID09IG51bGwpIHsKLQkJCXBvc3RPcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcG9zdE9wcy5hZGQocG9zdE9wZXJhdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJlT3BzKCkgewotCQlyZXR1cm4gcHJlT3BzICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUG9zdE9wcygpIHsKLQkJcmV0dXJuIHBvc3RPcHMgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFBvc3RPcHMoKSB7Ci0JCXJldHVybiBwb3N0T3BzOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0UHJlT3BzKCkgewotCQlyZXR1cm4gcHJlT3BzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkYjg1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBTaW1pYWxhciB0byBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzLCBob3dldmVyIHdpdGhvdXQgVUkgZGVwZW5kZW5jaWVzLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkvKioKLQkgKiBSdW5zIHRoaXMgb3BlcmF0aW9uIHdpdGhvdXQgZm9yY2luZyBhIFVJIGRlcGVuZGVuY3kuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlIHJlcXVlc3RzIGZvcgotCSAqICAgICAgICAgICAgY2FuY2VsYXRpb24KLQkgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgcnVuIG1ldGhvZCBtdXN0IHByb3BhZ2F0ZSBhIGNoZWNrZWQgZXhjZXB0aW9uLCBpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUKLQkgKiAgICAgICAgICAgICAgICBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZQotCSAqICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUKLQkgKiAgICAgICAgICAgICAgICBjYWxsaW5nIGNvbnRleHQKLQkgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIHVzaW5nCi0JICogICAgICAgICAgICAgICAgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZwotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lPcGVyYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzZTRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSU9wZXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogUGFzc2VkIHRvIGNvbXBsZXggbWV0aG9kcyB0aGF0IG1heSByZXF1aXJlIHJlcG9ydGluZyBvZiBtZXNzYWdlcywgb3IgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHVzZXI7Ci0gKiBEZWZpbmVkIGFzIGFuIGludGVyZmFjZSBiZWNhdXNlIHRoZSBhY3Rpb25zIG1heSBydW4gaW4gaGVhZGxlc3MgZW52aXJvbm1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbkhhbmRsZXIgewotCWludCBZRVMgPSAwOwotCWludCBZRVNfVE9fQUxMID0gMTsKLQlpbnQgTk8gPSAyOwotCWludCBDQU5DRUwgPSAzOwotCi0JLyoqCi0JICogQSBkZWNpc2lvbiBuZWVkcyB0byBtYWRlIGFzIHRvIHdoZXRoZXIgYW4gYWN0aW9uL29wZXJhdGlvbiBjYW4gY29udGludWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZShTdHJpbmcgbWVzc2FnZSk7Ci0KLQkvKioKLQkgKiBBIGRlY2lzaW9uIG5lZWRzIHRvIG1hZGUgYXMgdG8gd2hldGhlciBhbiBhY3Rpb24vb3BlcmF0aW9uIGNhbiBjb250aW51ZS4gPGNvZGU+aXRlbXM8L2NvZGU+Ci0JICogaXMgYW4gYXJyYXkgb2YgZGV0YWlscyB0aGF0IGFjY29tcGFueSB0aGUgPGNvZGU+bWVzc2FnZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKTsKLQotCS8qKgotCSAqIEEgZGVjaXNpb24gbmVlZHMgdG8gbWFkZSBhcyB0byB3aGV0aGVyIGFuIGFjdGlvbi9vcGVyYXRpb24gY2FuIGNvbnRpbnVlLiBUaGUgYm9vbGVhbiBhcnJheQotCSAqIHdpbGwgcmV0dXJuIHR3byBib29sZWFucy4gVGhlIGZpcnN0IGluZGljYXRlcyB0aGVpciByZXNwb25zZSB0byB0aGUgb3JpZ2luYWwgcXVlc3Rpb24gYW5kIHRoZQotCSAqIHNlY29uZCBpbmRpY2F0ZXMgaWYgdGhleSBzZWxlY3RlZCB0aGUgYXBwbHkgdG8gYWxsIGNoZWNrIGJveC4KLQkgKiAKLQkgKiBSZXR1cm4gdGhlIHJldHVybiBjb2RlIGZvciB0aGUgZGlhbG9nLiAwID0gWWVzLCAxID0gWWVzIHRvIGFsbCwgMiA9IE5vCi0JICovCi0JaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrKFN0cmluZyBtZXNzYWdlKTsKLQotCWludCBjYW5Db250aW51ZVdpdGhBbGxDaGVja0FsbG93Q2FuY2VsKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEFuIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZSBuZWVkcyB0byBiZSBwcmVzZW50ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmZvcm0oU3RyaW5nIG1lc3NhZ2UpOwotCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4Nzg2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZCBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzIGV4dGVuZHMgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1ewotCi0JLyoqCi0JICogQSByZXF1aXJlZCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IHR5cGUuIFRoaXMgaXMgdXNlZCB0bwotCSAqIHNwZWNpZnkgdGhlIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3B0b25hbCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+IHR5cGUuIFNldHMgdGhlIGxvY2FsCi0JICogZmlsZSBzeXN0ZW0gbG9jYXRpb24gZm9yIHRoZSBkZXNjcmliZWQgcHJvamVjdC4gVGhlIHBhdGggbXVzdCBiZSBlaXRoZXIgYW4gYWJzb2x1dGUgZmlsZQotCSAqIHN5c3RlbSBwYXRoLCBvciBhIHJlbGF0aXZlIHBhdGggd2hvc2UgZmlyc3Qgc2VnbWVudCBpcyB0aGUgbmFtZSBvZiBhIGRlZmluZWQgd29ya3NwYWNlIHBhdGgKLQkgKiB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHdvcmtzcGFjZSdzIGRlZmF1bHQgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5QUk9KRUNUX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBBbiBvcHRpb25hbCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmdbXTwvY29kZT4gdHlwZS4gVGhpcyBpcyBhCi0JICogbGlzdCBvZiBhbGwgbmF0dXJlcyB0byBhZGQgdG8gdGhlIHByb2plY3QuIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQVRVUkVTID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTkFUVVJFUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElQcm9qZWN0LiBBbiBub24gc2V0dGFibGUgcHJvcGVydHkuIFRoaXMgaXMgYSBjb252ZW5pZWNlIGZvciBjb25zdHJ1Y3Rpb25nIGdldHRpbmcgdGhlCi0JICogSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJUHJvamVjdERlc2NyaXB0aW9uLiBBbiBub24gc2V0dGFibGUgcHJvcGVydHkuIFRoaXMgaXMgYSBjb252ZW5pZWNlIGZvciBjb25zdHJ1Y3Rpb25nIGEKLQkgKiBwcm9qZWN0IGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfREVTQ1JJUFRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9ERVNDUklQVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL0lQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzNmNkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQotCS8qKgotCSAqIEEgcmVxdWlyZWQgZGF0YU1vZGVsIHByb3BlcnR5TmFtZSBmb3IgYSA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPiB0eXBlLiBUaGlzIGlzIHVzZWQgdG8KLQkgKiBzcGVjaWZ5IHRoZSBwcm9qZWN0IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgQm9vbGVhbiBwcm9wZXJ0eSB1c2VkIGZvciBkZXRlcm1pbmluZyBob3cgdGhlIFBST0pFQ1RfTE9DQVRJT04gaXMgY29tcHV0ZWQuIElmIHRoaXMKLQkgKiBwcm9wZXJ0eSBpcyB0cnVlIHRoZW4gdGhlIFBST0pFQ1RfTE9DQVRJT04gaXMgbnVsbC4gT3RoZXJ3aXNlIHRoZSBQUk9KRUNUX0xPQ0FUSU9OIGlzIHRoZQotCSAqIHZhbHVlIG9mIFVTRVJfREVGSU5FRF9MT0NBVElPTi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfREVGQVVMVF9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VfREVGQVVMVF9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgU3RyaW5nIHByb3BlcnR5IHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIFVTRV9ERUZBVUxUX0xPQ0FUSU9OIHRvIG92ZXJyaWRlIHRoZQotCSAqIERFRkFVTFRfTE9DQVRJT04uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ERUZJTkVEX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRVJfREVGSU5FRF9MT0NBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgU3RyaW5nIHByb3BlcnR5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI1VTRV9ERUZBVUxUX0xPQ0FUSU9OfSBhbmQKLQkgKiB7QGxpbmsgI1BST0pFQ1RfTkFNRX0gdG8gb3ZlcnJpZCB0aGUge0BsaW5rICNQUk9KRUNUX0xPQ0FUSU9OfS4KLQkgKiAKLQkgKiBJZiB7QGxpbmsgI1VTRV9ERUZBVUxUX0xPQ0FUSU9OfSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoaXMgcHJvcGVydHkgaXMgc2V0LCB0aGVuIHRoZQotCSAqIHtAbGluayAjUFJPSkVDVF9MT0NBVElPTn0gaXMgZGVmaW5lZCBieSB7QGxpbmsgI1VTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OfS97QGxpbmsgI1BST0pFQ1RfTkFNRX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiB1bnNldHRhYmxlIHByb3BlcnR5IHdoaWNoIHNwZWNpZmllZCB0aGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgYSBuZXdseSBjcmVhdGVkIHByb2plY3QuIFRoZQotCSAqIHZhbHVlIGlzIGNvbXB1dGVkIGJ5IGFwcGVuZGluZyB0aGUgcHJvamVjdCBuYW1lIHRvIHRoZSB3b3Jrc3BhY2UgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0NBVElPTiA9ICJJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5ERUZBVUxUX0xPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gdW5zZXR0YWJsZSBwcm9wZXJ0eSB1c2VkIHRvIHNwZWNpZnkgdGhlIHByb2plY3QgbG9jYXRpb24uIElmIFVTRV9ERUZBVUxUX0xPQ0FUSU9OIHRoaXMKLQkgKiBwcm9wZXJ0eSBldmFsdWF0ZXMgdG8gVVNFUl9ERUZJTkVEX0xPQ0FUSU9OOyBvdGhlcndpc2UgaXQgaSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0xPQ0FUSU9OID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHRpb25hbCBkYXRhTW9kZWwgcHJvcGVydHlOYW1lIGZvciBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmdbXTwvY29kZT4gdHlwZS4gVGhpcyBpcyBhCi0JICogbGlzdCBvZiBhbGwgbmF0dXJlcyB0byBhZGQgdG8gdGhlIHByb2plY3QuIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQVRVUkVTID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTkFUVVJFUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElQcm9qZWN0LiBBbiBub24gc2V0dGFibGUgcHJvcGVydHkuIFRoaXMgaXMgYSBjb252ZW5pZWNlIGZvciBjb25zdHJ1Y3Rpb25nIGdldHRpbmcgdGhlCi0JICogSVByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUID0gIklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJUHJvamVjdERlc2NyaXB0aW9uLiBBbiBub24gc2V0dGFibGUgcHJvcGVydHkuIFRoaXMgaXMgYSBjb252ZW5pZWNlIGZvciBjb25zdHJ1Y3Rpb25nIGEKLQkgKiBwcm9qZWN0IGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfREVTQ1JJUFRJT04gPSAiSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9ERVNDUklQVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmNkMTZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25FeHRlbnNpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyBvcElEID0gbnVsbDsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgYmFzZUVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVPcGVyYXRpb25DbGFzcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3RPcGVyYXRpb25DbGFzcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbklkOwotCi0JcHVibGljIE9wZXJhdGlvbkV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGlkLCBTdHJpbmcgcHJlT3AsIFN0cmluZyBwb3N0T3ApIHsKLQkJc3VwZXIoKTsKLQkJYmFzZUVsZW1lbnQgPSBlbGVtZW50OwotCQlzZXRVcEV4dGVuc2lvbihpZCwgcHJlT3AsIHBvc3RPcCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFVwRXh0ZW5zaW9uKFN0cmluZyBpZCwgU3RyaW5nIHByZU9wLCBTdHJpbmcgcG9zdE9wKSB7Ci0JCW9wSUQgPSBpZDsKLQkJcHJlT3BlcmF0aW9uQ2xhc3MgPSBwcmVPcDsKLQkJcG9zdE9wZXJhdGlvbkNsYXNzID0gcG9zdE9wOwotCQl0aGlzLmV4dGVuc2lvbklkID0gYmFzZUVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQlpZiAodGhpcy5leHRlbnNpb25JZCA9PSBudWxsKQotCQkJdGhpcy5leHRlbnNpb25JZCA9IGJhc2VFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3BJRCgpIHsKLQkJcmV0dXJuIG9wSUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb3N0T3BlcmF0aW9uQ2xhc3MoKSB7Ci0JCXJldHVybiBwb3N0T3BlcmF0aW9uQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVPcGVyYXRpb25DbGFzcygpIHsKLQkJcmV0dXJuIHByZU9wZXJhdGlvbkNsYXNzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UG9zdE9wZXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBvc3RPcGVyYXRpb25DbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBiYXNlRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5BVFRfUE9TVF9PUCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcmVPcGVyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcmVPcGVyYXRpb25DbGFzcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBiYXNlRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5BVFRfUFJFX09QKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbklkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiBleHRlbnNpb25JZDsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEJhc2VFbGVtZW50KCkgewotCQlyZXR1cm4gYmFzZUVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkV4dGVuc2lvblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWYyNWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25FeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDMsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2hNYXAgb3BFeHRlbnNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSjJFRU9QRVhUID0gIm9wZXJhdGlvbkV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUkVfT1AgPSAicHJlT3BlcmF0aW9uQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BPU1RfT1AgPSAicG9zdE9wZXJhdGlvbkNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlcigpIHsKLQkJc3VwZXIoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgIk9wZXJhdGlvbkV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6IDxvcGVyYXRpb25FeHRlbnNpb24KLQkgKiBwcmVPcGVyYXRpb25DbGFzcz0iY29tLmlibS5ldG9vbHMuLi4uUHJlRGVsZXRlT3BlcmF0aW9uIgotCSAqIHBvc3RPcGVyYXRpb25DbGFzcz0iY29tLmlibS5ldG9vbHMuLi4uUG9zdERlbGV0ZU9wZXJhdGlvbiI+IDwvb3BlcmF0aW9uRXh0ZW5zaW9uPgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9KMkVFT1BFWFQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlTdHJpbmcgcHJlT3AgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJFX09QKTsKLQkJU3RyaW5nIHBvc3RPcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QT1NUX09QKTsKLQkJT3BlcmF0aW9uRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IG5ldyBPcGVyYXRpb25FeHRlbnNpb24oZWxlbWVudCwgaWQsIHByZU9wLCBwb3N0T3ApOwotCQlhZGRFeHRlbnNpb25Qb2ludChleHRlbnNpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbnMKLQkgKiAgICAgICAgICAgIFRoZSBleHRlbnNpb25zIHRvIHNldAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXh0ZW5zaW9uUG9pbnQoT3BlcmF0aW9uRXh0ZW5zaW9uIG5ld0V4dGVuc2lvbikgewotCQlDb2xsZWN0aW9uIHRlbXAgPSBudWxsOwotCQlPYmplY3QgaG9sZGVyID0gb3BFeHRlbnNpb25zLmdldChuZXdFeHRlbnNpb24uZ2V0T3BJRCgpKTsKLQkJaWYgKGhvbGRlciA9PSBudWxsKSB7Ci0JCQl0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdGVtcC5hZGQobmV3RXh0ZW5zaW9uKTsKLQkJCW9wRXh0ZW5zaW9ucy5wdXQobmV3RXh0ZW5zaW9uLmdldE9wSUQoKSwgdGVtcCk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wID0gKENvbGxlY3Rpb24pIGhvbGRlcjsKLQkJCXRlbXAuYWRkKG5ld0V4dGVuc2lvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZ2V0RXh0ZW5zaW9uUG9pbnRzKCkgewotCQlpZihvcEV4dGVuc2lvbnMgPT0gbnVsbCl7Ci0JCQlvcEV4dGVuc2lvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJT3BlcmF0aW9uRXh0ZW5zaW9uUmVhZGVyIG9wRXh0ZW5zaW9uUmVhZGVyID0gbmV3IE9wZXJhdGlvbkV4dGVuc2lvblJlYWRlcigpOwotCQkJb3BFeHRlbnNpb25SZWFkZXIucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIG9wRXh0ZW5zaW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MGE0YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25TdGF0dXMgZXh0ZW5kcyBNdWx0aVN0YXR1cyB7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlzdXBlcihXVFBDb21tb25QbHVnaW4uUExVR0lOX0lELCAwLCBuZXcgSVN0YXR1c1tde30sIG1lc3NhZ2UsIGUpOwotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25TdGF0dXMoSVN0YXR1c1tdIGNoaWxkcmVuKSB7Ci0JCXRoaXMoV1RQQ29tbW9uUGx1Z2luLlBMVUdJTl9JRCwgMCwgY2hpbGRyZW4sICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25TdGF0dXMoU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgSVN0YXR1c1tdIGNoaWxkcmVuLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihwbHVnaW5JZCwgY29kZSwgY2hpbGRyZW4sIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5kZWRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IG9sZFNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkoKTsKLQkJc3VwZXIuYWRkKHN0YXR1cyk7Ci0JCWlmIChvbGRTZXZlcml0eSAhPSBJU3RhdHVzLkVSUk9SICYmIGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJc2V0U2V2ZXJpdHkoSVN0YXR1cy5XQVJOSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIGFzIHB1YmxpYyBpbnN0ZWFkIG9mIHByb3RlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvZGUoaW50IGNvZGUpIHsKLQkJc3VwZXIuc2V0Q29kZShjb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlci5zZXRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGV4cG9zZSBhcyBwdWJsaWMgaW5zdGVhZCBvZiBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgYXMgcHVibGljIGluc3RlYWQgb2YgcHJvdGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCXN1cGVyLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IG5ld1NldiA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAobmV3U2V2ID4gZ2V0U2V2ZXJpdHkoKSkgewotCQkJc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCXNldEV4Y2VwdGlvbihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JCXN1cGVyLmFkZChzdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzdiNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjcsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlCi0gKiBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldyBpbnN0ZWFkLgotICovCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBAc2VlIFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllcywgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BVFVSRVMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0RFU0NSSVBUSU9OKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSkKLQkJCXJldHVybiBnZXREZWZhdWx0TG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0RFU0NSSVBUSU9OKSkKLQkJCXJldHVybiBnZXRQcm9qZWN0RGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSkgewotCQkJSVBhdGggcGF0aCA9IGdldFJvb3RMb2NhdGlvbigpOwotCQkJaWYgKHBhdGguZXF1YWxzKG5ldyBQYXRoKChTdHJpbmcpIHByb3BlcnR5VmFsdWUpKSkgewotCQkJCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQl9Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX0RFU0NSSVBUSU9OLCBnZXRQcm9qZWN0RGVzY3JpcHRpb24oKSk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlJU3RhdHVzIHN0YXQgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCQlpZiAoc3RhdCAhPSBPS19TVEFUVVMpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVCwgZ2V0UHJvamVjdCgpKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfREVTQ1JJUFRJT04sIGdldFByb2plY3REZXNjcmlwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TG9jYXRpb24oKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRSb290TG9jYXRpb24oKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpCi0JCQlwYXRoID0gcGF0aC5hcHBlbmQocHJvamVjdE5hbWUpOwotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRSb290TG9jYXRpb24oKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdERlc2NyaXB0aW9uIGdldFByb2plY3REZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0JCWlmIChnZXREYXRhTW9kZWwoKS5pc1Byb3BlcnR5U2V0KFBST0pFQ1RfTE9DQVRJT04pKSB7Ci0JCQlTdHJpbmcgcHJvamVjdExvY2F0aW9uID0gKFN0cmluZykgZ2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTik7Ci0JCQlpZiAocHJvamVjdExvY2F0aW9uICE9IG51bGwpCi0JCQkJZGVzYy5zZXRMb2NhdGlvbihuZXcgUGF0aChwcm9qZWN0TG9jYXRpb24pKTsKLQkJCWVsc2UKLQkJCQlkZXNjLnNldExvY2F0aW9uKG51bGwpOwotCQl9Ci0JCXJldHVybiBkZXNjOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gKG51bGwgIT0gcHJvamVjdE5hbWUgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZU5hbWUoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlTG9jYXRpb24oKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTE9DQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCVN0cmluZyBwcm9qZWN0TG9jID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9MT0NBVElPTik7Ci0JCQlyZXR1cm4gdmFsaWRhdGVFeGlzdGluZyhwcm9qZWN0TmFtZSwgcHJvamVjdExvYyk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcGFyYW0gcHJvamVjdExvYwotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRXhpc3RpbmcoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcHJvamVjdExvYykgewotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhcHJvamVjdE5hbWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHByb2plY3RMb2MpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCUZpbGUgZG90UHJvamVjdCA9IG5ldyBGaWxlKGZpbGUsICIucHJvamVjdCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGRvdFByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlBST0pFQ1RfRVhJU1RTX0FUX0xPQ0FUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117ZmlsZS50b1N0cmluZygpfSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0SGFuZGxlRnJvbVByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHByb2plY3ROYW1lLCBJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCXJldHVybiAobnVsbCAhPSBwcm9qZWN0TmFtZSAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDAgJiYgc3RhdHVzLmlzT0soKSkgPyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShwcm9qZWN0TmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZVByb2plY3ROYW1lKG5hbWUpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQlpZiAoZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9FWElTVFNfRVJST1IsIG5ldyBPYmplY3RbXXtuYW1lfSkpOwotCi0JCWlmICghV1RQUGx1Z2luLmlzUGxhdGZvcm1DYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCS8vIG5vdyBsb29rIGZvciBhIG1hdGNoaW5nIGNhc2UgdmFyaWFudCBpbiB0aGUgdHJlZQotCQkJSVJlc291cmNlIHZhcmlhbnQgPSAoKFJlc291cmNlKSBnZXRQcm9qZWN0KCkpLmZpbmRFeGlzdGluZ1Jlc291cmNlVmFyaWFudChnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0JCQkJLy8gVE9ETyBGaXggdGhpcyBzdHJpbmcKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCJSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50IGNhc2UuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUxvY2F0aW9uKCkgewotCQlpZiAoZ2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eVNldChQUk9KRUNUX0xPQ0FUSU9OKSkgewotCQkJU3RyaW5nIGxvYyA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jKTsKLQkJCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVQcm9qZWN0TG9jYXRpb24oZ2V0UHJvamVjdCgpLCBwYXRoKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjNlZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldyBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldyB7Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldyhtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1QpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFX0RFRkFVTFRfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChERUZBVUxUX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BVFVSRVMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX0RFU0NSSVBUSU9OKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0xPQ0FUSU9OKSkgewotCQkJaWYgKGdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSBpZiAoaXNQcm9wZXJ0eVNldChVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTikpIHsKLQkJCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pICsgRmlsZS5zZXBhcmF0b3IgKyBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJfQotCQkJcmV0dXJuIGdldFByb3BlcnR5KFVTRVJfREVGSU5FRF9MT0NBVElPTik7Ci0JCX0gZWxzZSBpZiAoREVGQVVMVF9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKFVTRV9ERUZBVUxUX0xPQ0FUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKFVTRVJfREVGSU5FRF9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBVU0VSX0RFRklORURfQkFTRV9MT0NBVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX0RFU0NSSVBUSU9OKSkKLQkJCXJldHVybiBnZXRQcm9qZWN0RGVzY3JpcHRpb24oKTsKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRMb2NhdGlvbigpIHsKLQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwpCi0JCQlwYXRoID0gcGF0aC5hcHBlbmQocHJvamVjdE5hbWUpOwotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfREVTQ1JJUFRJT04pKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewotCQkJSVN0YXR1cyBzdGF0ID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJaWYgKHN0YXQgIT0gT0tfU1RBVFVTKQotCQkJCXJldHVybiB0cnVlOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVCwgZ2V0UHJvamVjdCgpKTsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERFRkFVTFRfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoVVNFX0RFRkFVTFRfTE9DQVRJT04pIHx8IGlzUHJvcGVydHlTZXQoVVNFUl9ERUZJTkVEX0JBU0VfTE9DQVRJT04pKSB7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9MT0NBVElPTiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFX0RFRkFVTFRfTE9DQVRJT04pKSB7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX0xPQ0FUSU9OLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCX0gZWxzZSBpZiAoKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9ERUZJTkVEX0xPQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfREVGSU5FRF9CQVNFX0xPQ0FUSU9OKSkgJiYgIWdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfREVGQVVMVF9MT0NBVElPTikpIHsKLQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTE9DQVRJT04sIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RGVzY3JpcHRpb24gZ2V0UHJvamVjdERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3ROYW1lKTsKLQkJU3RyaW5nIHByb2plY3RMb2NhdGlvbiA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAocHJvamVjdExvY2F0aW9uICE9IG51bGwpCi0JCQlkZXNjLnNldExvY2F0aW9uKG5ldyBQYXRoKHByb2plY3RMb2NhdGlvbikpOwotCQllbHNlCi0JCQlkZXNjLnNldExvY2F0aW9uKG51bGwpOwotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIChudWxsICE9IHByb2plY3ROYW1lICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgPyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCVN0cmluZyBuYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVOYW1lKG5hbWUpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVMb2NhdGlvbigpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSkVDVF9MT0NBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9KRUNUX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCi0JCQlTdHJpbmcgcHJvamVjdExvYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9ERUZBVUxUX0xPQ0FUSU9OKSkgewotCQkJCXByb2plY3RMb2MgPSBnZXREZWZhdWx0TG9jYXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdExvYyA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkYXRlRXhpc3RpbmcocHJvamVjdE5hbWUsIHByb2plY3RMb2MpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHBhcmFtIHByb2plY3RMb2MKLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUV4aXN0aW5nKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHByb2plY3RMb2MpIHsKLQkJaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgIXByb2plY3ROYW1lLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwcm9qZWN0TG9jKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlGaWxlIGRvdFByb2plY3QgPSBuZXcgRmlsZShmaWxlLCAiLnByb2plY3QiKTsvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkb3RQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5QUk9KRUNUX0VYSVNUU19BVF9MT0NBVElPTl9FUlJPUiwgbmV3IE9iamVjdFtde2ZpbGUudG9TdHJpbmcoKX0pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdEhhbmRsZUZyb21Qcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShwcm9qZWN0TmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQlyZXR1cm4gKG51bGwgIT0gcHJvamVjdE5hbWUgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICYmIHN0YXR1cy5pc09LKCkpID8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocHJvamVjdE5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJaWYgKHByb2plY3ROYW1lLmVuZHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiNDEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVQcm9qZWN0TmFtZShuYW1lKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlBST0pFQ1RfRVhJU1RTX1NBTUVOQU1FX0VSUk9SLCBuZXcgT2JqZWN0W117bmFtZX0pKTsKLQkJfQotCQlpZiAoIVdUUFBsdWdpbi5pc1BsYXRmb3JtQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkvLyBub3cgbG9vayBmb3IgYSBtYXRjaGluZyBjYXNlIHZhcmlhbnQgaW4gdGhlIHRyZWUKLQkJCUlSZXNvdXJjZSB2YXJpYW50ID0gKChSZXNvdXJjZSkgcHJvamVjdCkuZmluZEV4aXN0aW5nUmVzb3VyY2VWYXJpYW50KHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI0MiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVMb2NhdGlvbigpIHsKLQkJU3RyaW5nIGxvYyA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTE9DQVRJT04pOwotCQlpZiAobnVsbCAhPSBsb2MpIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvYyk7Ci0JCQlyZXR1cm4gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKGdldFByb2plY3QoKSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDQxY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBAc2VlIFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLCBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV7Ci0KLQlwdWJsaWMgUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSAoSVByb2plY3REZXNjcmlwdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9ERVNDUklQVElPTik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCXByb2plY3QuY3JlYXRlKGRlc2MsIHN1Yk1vbml0b3IpOwotCQkJfQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJcHJvamVjdC5vcGVuKHN1Yk1vbml0b3IpOwotCi0JCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSAoU3RyaW5nW10pIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1RfTkFUVVJFUyk7Ci0JCQlpZiAobnVsbCAhPSBuYXR1cmVJZHMpIHsKLQkJCQlkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZUlkcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL1Byb2plY3RDcmVhdGlvbk9wZXJhdGlvbk5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODM3Y2ZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9Qcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjcsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBpbXBsZW1lbnRzIElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3IHsKLQotCXB1YmxpYyBQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25OZXcoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IChJUHJvamVjdERlc2NyaXB0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUX0RFU0NSSVBUSU9OKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJcHJvamVjdC5jcmVhdGUoZGVzYywgc3ViTW9uaXRvcik7Ci0JCQl9Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQlzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQlwcm9qZWN0Lm9wZW4oc3ViTW9uaXRvcik7Ci0KLQkJCVN0cmluZ1tdIG5hdHVyZUlkcyA9IChTdHJpbmdbXSkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9OQVRVUkVTKTsKLQkJCWlmIChudWxsICE9IG5hdHVyZUlkcykgewotCQkJCWRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9pbnRlcm5hbC9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNThmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VGhlIFdUUCBPcGVyYXRpb24gQVBJIGFsbG93cyBjbGllbnRzIHRvIGRvLi4uZXZlcnl0aGluZyE8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5VbmRlciBDb25zdHJ1Y3Rpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9ImVzY2FwZV9vdXRfdG9fc291cmNlX2ZvbGRlciBsZXZlbC9vdmVydmlldy95b3VyX2ltYWdlLmpwZyI+PC9wPgotPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpPkZpZ3VyZSAxOiBJbWFnZSBkZXNjcmlwdGlvbjwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvb3BlcmF0aW9ucy9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwNTBkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL29wZXJhdGlvbnMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAKLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPnd0cCBvcGVyYXRpb24gYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotICAgICAgICA8YWJzdHJhY3Q+VGhlIFdUUCBPcGVyYXRpb24gQVBJIGFsbG93cyBjbGllbnRzIHRvIGRvLi4uZXZlcnl0aGluZyE8L2Fic3RyYWN0PgotCi0JCTwhLS0gZm9ybWF0dGluZyBoYW5kbGVkIGJ5IFhTTFQgVHJhbnNmb3JtYXRpb24gLS0+Ci0JCTxwPlVuZGVyIENvbnN0cnVjdGlvbi48L3A+Ci0JCTxpbWcgc3JjPSJlc2NhcGVfb3V0X3RvX3NvdXJjZV9mb2xkZXIgbGV2ZWwvb3ZlcnZpZXcveW91cl9pbWFnZS5qcGciIGNhcHRpb24gPSJJbWFnZSBkZXNjcmlwdGlvbiIgLz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ICAgIAotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vbk1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFkZTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTm92IDUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBDb21tb25NZXNzYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9FWElTVFNfRVJST1IgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PVF9FQVIgPSAiMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNPTVBBVEFCTEVfSjJFRV9WRVJTSU9OUyA9ICIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTUVfTU9EVUxFX0FORF9FQVJfTkFNRSA9ICI0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkVfRklMRV9OQU1FX0VNUFRZX0VSUk9SID0gIjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9ET0VTX05PVF9FWElTVF9FUlJPUiA9ICI2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0VSUk9SID0gIjciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0lOVkFMSUQgPSAiOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUSU5BVElPTl9BUkNISVZFX1NIT1VMRF9FTkRfV0lUSCA9ICI5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RJTkFUSU9OX0lOVkFMSUQgPSAiMTAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfUkVBRF9PTkxZID0gIjExIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VYSVNUU19FUlJPUiA9ICIxMiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PVF9FWElTVFNfRVJST1IgPSAiMTMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BFQ19MRVZFTF9OT1RfRk9VTkQgPSAiMTQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FX0VNUFRZID0gIjE1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfQ2xPU0VEID0gIjMxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRVhJU1RTX0FUX0xPQ0FUSU9OX0VSUk9SID0gIjMyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9FTVBUWV9NT0RVTEVfTkFNRSA9ICIzNCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfSU5WQUxJRF9DSEFSUyA9ICIzNSI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQTElDQVRFX0NPTVBPTkVOVF9OQU1FPSIzNiI7Ly8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTk9UX1NVUFBPUlRFRD0iMzciOy8vJE5PTi1OTFMtMSQgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VYSVNUU19FUlJPUiA9ICIzOCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VGT0xERVJfRU1QVFkgPSAiMzkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQ09OVEVOVEZPTERFUl9FTVBUWSA9ICI0MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0VYSVNUU19TQU1FTkFNRV9FUlJPUiA9ICI0MyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX05PTkUgPSAiNDQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2ludGVybmFsL3BsdWdpbi9XVFBDb21tb25QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTRjNzIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvaW50ZXJuYWwvcGx1Z2luL1dUUENvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdUUENvbW1vblBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJmdW5jdGlvbkdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8vCVRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV1RQQ29tbW9uUGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBXVFBDb21tb25QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgid3RwX2NvbW1vbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdUUENvbW1vblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZUVycm9yU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVdhcm5pbmdTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGNyZWF0ZVdhcm5pbmdTdGF0dXMobWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUNhbmNlbFN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gY3JlYXRlQ2FuY2VsU3RhdHVzKG1lc3NhZ2UsIG51bGwpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIC0xLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVDYW5jZWxTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIFBMVUdJTl9JRCwgLTEsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdUUENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbiNnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIFBMVUdJTl9JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvd3RwX2NvbW1vbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL3d0cF9jb21tb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxZmViMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvd3RwX2NvbW1vbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0xPUEgcHJvamVjdCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgbmFtZSBhbmQgbG9jYXRpb24uCi0yPVRoZSBzcGVjaWZpZWQgRUFSIHByb2plY3QgInswfSIgaXMgbm90IGFuIEVBUiBwcm9qZWN0LgotMz1UaGUgRUFSIHByb2plY3QgInswfSIgaGFzIGEgSjJFRVZlcnNpb24gb2YgezF9IHdoaWNoIGlzIG5vdCBjb21wYXRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdmVyc2lvbi4KLTQ9VGhlIEVBUiBwcm9qZWN0IG5hbWUsICJ7MH0iLCBjYW4gbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9qZWN0IG5hbWUuCi01PXswfSBmaWxlIG5hbWUgbXVzdCBiZSBlbnRlcmVkLgotNj1UaGUgezB9IGRvZXMgbm90IGV4aXN0LgotNz1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gIFZpZXcgbG9nIGZpbGVzIGZvciBkZXRhaWxzLgotOD1Qcm9qZWN0IG5hbWUgaXMgaW52YWxpZC4KLTk9RGVzdGluYXRpb24gYXJjaGl2ZSBzaG91bGQgZW5kIHdpdGggezB9LgotMTA9RGVzdGluYXRpb24gYXJjaGl2ZSBpcyBpbnZhbGlkLgotMTE9RGVzdGluYXRpb24gbG9jYXRpb24gaXMgcmVhZCBvbmx5LgotMTI9UmVzb3VyY2UgezB9IGFscmVhZHkgZXhpc3RzLiBJZiB5b3Ugd2lzaCB0byBvdmVyd3JpdGUgc2VsZWN0IHRoZSAiT3ZlcndyaXRlIEV4aXN0aW5nIGZpbGUiIG9wdGlvbi4KLTEzPVByb2plY3QgezB9IGRvZXMgbm90IGV4aXN0LgotMTQ9VGhlIHNlbGVjdGVkIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotMTU9RW50ZXIgYSBwcm9qZWN0IG5hbWUuCi0xNj1TYXZlIHByb2JsZW1zCi0xNz1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuICBTb21lIHJlbGF0ZWQgZmlsZXMgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHNhdmVkLlxuXG5SZWFzb24KLTE4PXswfSBoYXMgYmVlbiBsb2NrZWQuIFBsZWFzZSBlbnN1cmUgdGhlIG9wZXJhdGlvbiBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZy4KLTE5PVRoZSBleHRlbmRlZFJvb3QgaXMgbnVsbC4gTWFrZSBzdXJlIHRoYXQgaXNFeHRlbmRlZCgpIHJldHVybnMgdHJ1ZS4KLTIwPVByb3BlcnR5IG5vdCBsb2NhdGVkOgotMjE9TmVzdGVkIG1vZGVsIG5vdCBsb2NhdGVkOgotMjI9Q2Fubm90IG1vZGlmeSBpZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4KLTIzPVRoZSBpZCBjYW5ub3QgYmUgbnVsbC4KLTI0PUVSUk9SOgotMjU9RXh0ZW5kZWQgT3BlcmF0aW9uIGZhaWx1cmU6IHswfQotMjY9VGhlIEpvYiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0yNz1FeGNlcHRpb24gb2NjdXJyZWQgcnVubmluZyBqb2IuCi0yOD1Hcm91cCBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci0yOT1DbGFzcyBub3QgZm91bmQgZm9yIGF0dHJpYnV0ZSB7MH0gOiB7MX0sIERlY2xhcmluZyBwbHVnaW4gZXh0ZW5zaW9uOiB7Mn0KLTMwPUZ1bmN0aW9uIGdyb3VwIHswfSBjb250YWlucyBubyBwYXR0ZXJuIGJpbmRpbmdzCi0zMT1Qcm9qZWN0IHswfSBpcyBjbG9zZWQuCi0zMj1BIHByb2plY3QgYWxyZWFkeSBleGlzdHMgb24gdGhlIGZpbGUgc3lzdGVtIGF0IHRoaXMgbG9jYXRpb246IHswfS4gIEVpdGhlciB1c2UgIkltcG9ydCBFeGlzdGluZyBQcm9qZWN0cyBpbnRvIFdvcmtzcGFjZSIgdG8gY3JlYXRlIGEgcHJvamVjdCBhdCB0aGlzIGxvY2F0aW9uIG9yIGRlbGV0ZSB0aGUgY29udGVudHMgb2YgezB9IGZyb20gdGhlIGZpbGUgc3lzdGVtLgotMzM9QSBtb2RlbCBpbnN0YW5jZSBtYXkgb25seSBiZSBuZXN0ZWQgb25jZSB1bmRlciBhbm90aGVyIG1vZGVsIGluc3RhbmNlLgotMzQ9TW9kdWxlIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotMzU9SW52YWxpZCBjaGFyYWN0ZXJzLgotMzY9VGhlIG1vZHVsZSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLTM3PVRoZSBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlci4KLTM4PU1vZHVsZSBuYW1lIGlzIGludmFsaWQuCi0zOT1FbnRlciBTb3VyY2UgRm9sZGVyCi00MD1FbnRlciBXZWIgY29udGVudCBGb2xkZXIKLTQxPVByb2plY3QgbmFtZXMgY2Fubm90IGVuZCB3aXRoIHdoaXRlIHNwYWNlLgotNDI9UmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudCBjYXNlLgotNDM9QSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIHdpdGggdGhpcyBuYW1lLgotNDQ9PE5vbmU+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3ZmNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2R1bGVjb3JlLXNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc3NTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotbW9kdWxlY29yZS5qYXIKLWRvYwotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ODE5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9Db21wb25lbnRSZXNvbHZlcj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkY2QxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmE0ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIERlYyAwMiAxNDo1NDo1OSBFU1QgMjAwNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zY2hlbWEvY29tcG9uZW50Q29yZS54c2Q9VVRGOApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzlhN2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6Mzg6MDggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyYmQ0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjQuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuNC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjQuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2RiMzZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI1ZDNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IG1vZHVsZWNvcmUtc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZGFhOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Q29yZS54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRDb3JlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODgyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRDb3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9tb2R1bGVDb3JlIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbW9kdWxlQ29yZSI+DQotCTxlbGVtZW50IG5hbWU9InByb2plY3QtbW9kdWxlcyI+DQotCQk8Y29tcGxleFR5cGU+DQotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLQkJCQk8ZWxlbWVudCBuYW1lPSJ3Yi1tb2R1bGUiPg0KLQkJCQkJPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxlbGVtZW50IG5hbWU9Im1vZHVsZS10eXBlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQk8YXR0cmlidXRlIG5hbWU9Im1vZHVsZS10eXBlLWlkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJ3Yi1yZXNvdXJjZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9InNvdXJjZS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbnQtbW9kdWxlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iaGFuZGxlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRlbmN5LXR5cGUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktbmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj48L2F0dHJpYnV0ZT4NCi0JCQkJCTwvY29tcGxleFR5cGU+DQotCQkJCTwvZWxlbWVudD4NCi0JCQk8L3NlcXVlbmNlPg0KLQkJCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+DQotCQk8L2NvbXBsZXhUeXBlPg0KLQk8L2VsZW1lbnQ+DQotDQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvY29tcG9uZW50Y29yZV9tb2RlbC5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRjb3JlX21vZGVsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4ZDY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRjb3JlX21vZGVsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfcGFja2FnZS5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9jb21wb25lbnRjb3JlX3BhY2thZ2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWMwNGI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL2NvbXBvbmVudGNvcmVfcGFja2FnZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tYXBwaW5nLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21hcHBpbmcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGY2ZTUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21hcHBpbmcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWV0YW1vZGVsX2NvbXBvbmVudHMuanBnIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvbWV0YW1vZGVsX2NvbXBvbmVudHMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGNiODMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21ldGFtb2RlbF9jb21wb25lbnRzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZV9zdHJ1Y3R1cmFsX21vZGVsLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZV9zdHJ1Y3R1cmFsX21vZGVsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmZTI5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tb2R1bGVfc3RydWN0dXJhbF9tb2RlbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy9tb2R1bGVjb3JlLmpwZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZWNvcmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVhOTlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL2phdmFkb2MtaW1hZ2VzL21vZHVsZWNvcmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvamF2YWRvYy1pbWFnZXMvdmlydHVhbF9wYXRoX2FwaS5qcGcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy92aXJ0dWFsX3BhdGhfYXBpLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhM2U5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9qYXZhZG9jLWltYWdlcy92aXJ0dWFsX3BhdGhfYXBpLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL0phdmEuZXB4IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5lcHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmQxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvSmF2YS5lcHgKKysrIC9kZXYvbnVsbApAQCAtMSw2MTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0teHRvb2xzMl91bml2ZXJzYWxfdHlwZV9tYW5hZ2VyLS0+Ci08dW1sOlByb2ZpbGUgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMS4wLjAvVU1MIiB4bWk6aWQ9Il8tWm95d0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhIiBtZXRhbW9kZWxSZWZlcmVuY2U9Il8tWm95d1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWm95eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWm95eFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InByb3BlcnR5SWQiIHZhbHVlPSI4MDkxMzU5NjYiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFzaTFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYXNpMXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hc2kxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZVBhY2thZ2VzIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiB4bWk6aWQ9Il8tYTR2OEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhXzAiIG5zVVJJPSJodHRwOi8vL18tYXNpMkpTa0VkbWphdVNqRzhxTzJBLnByb2ZpbGUudW1sMiIgbnNQcmVmaXg9IkphdmFfMCI+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHY4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX01vZHVsZVNwZWMiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHY4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hc2l4NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHY4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNtSWRlbnRpZmljYXRpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHY5SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvcHlyaWdodE5vdGljZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iXy1hNHY5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1Byb2plY3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHY5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hQjBtWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHY5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHYtSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NTaW5jZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0di1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2xvYmFsSW1wb3J0cyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0di1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2LTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJtXyI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHZfSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNob3dDb2RlZ2VuRGxnIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2X1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb0NsYXNzQ3VzdG9tRGxnIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR2X3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTQ0NQcm9qZWN0TmFtZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dl81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlVGFicyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJpbnQiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbFByZWZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZUphdmFEb2NUYWdzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbEhvbWVTdWZmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdCSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSG9tZVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0JwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVkFKYXZhV29ya2luZ0ZvbGRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0I1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdEVKQlZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdDSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1heE51bUNoYXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSI4MCI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0NwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERURExvY2F0aW9uIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3QzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnQXBwbHkxIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3REpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVJvc2VJRCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdG9wT25FcnJvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0RwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY1ZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NEZWZhdWx0QXV0aG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJPcGVuQnJhY2VNZXRob2RTdHlsZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3RVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRWRpdG9yIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdPNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkJ1aWx0SW4iLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdGSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdBcHBseTIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdGWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdGcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNwYWNpbmdJdGVtcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMyI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdGNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkRURExvY2F0aW9uIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3R0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0daU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ1RleHQzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3R3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZW1vdGVTdWZmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdHNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlZmVyZW5jZUNsYXNzcGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0hKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlbkJyYWNlQ2xhc3NTdHlsZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbFN1ZmZpeCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0hwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVk0iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d1FKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iU3VuIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0U2VydmxldFZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdJSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVByZWZpeGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuU3VmZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3STVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTQ0NDb21tZW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSb290RGlyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnVGV4dDEiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdKcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0o1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQXV0b1N5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdLSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NBdXRob3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdLcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3RTb3VyY2VSb290IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3SzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhQ29tbWVudFN0eWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idm9pZCI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdMWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d0xwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRWZXJzaW9uIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3RTaG93Um9zZUlERGxnIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZW1vdGVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVNwYWNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc1ZhcmlhYmxlUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJzXyI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdNNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NEZWZhdWx0U2luY2UiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdOSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1NlbGVjdGVkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIb21lUHJlZml4IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3TnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbEhvbWVQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d09KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU291cmNlQ29udHJvbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d09aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY051bUFzdGVyaXNrcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMCI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdPcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1hcnlLZXlQcmVmaXgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdPNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1Byb2plY3RFZGl0b3JUeXBlIj4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCdWlsdEluIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdQWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFINjg1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3UHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXaW5kb3dzU2hlbGwiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFINjlwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdRSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGUiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdRWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN1biI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3UXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hQjBwSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d1E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWljcm9zb2Z0IiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3UkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hQjBwNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d1JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSUJNIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3UnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hQjBxcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0d1I1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdTWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1NwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdTNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1RKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdUWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdUcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdUNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdVcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdWSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdXSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdXWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdXcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3VzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3ZjVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdYNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdZSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d1laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdZcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3aHBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDb250YWluZXIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdZNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdaWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdacFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3WjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2FKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdhcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2JKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3YnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdiNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d2k1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4wIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Y0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0d2tKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3Y1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdsNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InB1YmxpYyIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2NwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdjNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdkNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2VKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3ZTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2ZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdmWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d2ZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdmNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3Z0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2daU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0dzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdncFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2c1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0eHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdoSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3aFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3R5WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3aHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdoNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3aUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3Q1SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d2lwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0NTVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d2k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2pKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdqWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDY1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3anBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdqNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDdwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHdrSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX2RlZmF1bHRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2taU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dHpaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3azVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QwSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0d2xaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3QwNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3bDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3bUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d21aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0MTVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdtcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d201U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWjd0MnBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHduSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHduWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVo3dDNaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3bnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iMyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3bjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1aN3Q0SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0d29KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fTW9kdWxlQm9keSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d29aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLVpveXhwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d29wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ21JZGVudGlmaWNhdGlvbiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d281U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29weXJpZ2h0Tm90aWNlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0d3BKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3cFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tYWFPN3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZXBsYWNlRXhpc3RpbmdDb2RlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3FwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTmF0aXZlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3cTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJBYnN0cmFjdCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3JKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3luY2hyb25pemVkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3clpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR3cnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHdyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ic3RlcmVvdHlwZSIgcmVmZXJlbmNlcz0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHdzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQk5hbWVJbkpBUiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3NaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3c3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd0SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbnRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3VwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd1NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3ZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckZvcndhcmQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd2cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd2NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZmVyZW5jZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3d3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3dzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd4SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRmluYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3NXBTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3g1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3lKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQk1QX0V4dGVuZF9DTVAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR3N1pTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDb250YWluZXIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd5cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3eTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHd6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXREYXRlSGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3enBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0d3o1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcwWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcxcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlZlcnNpb24iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0dzhwU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMi4wIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJQZXJzaXN0ZW5jZVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0dzk1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJ1Y3RvcklzIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHdfcFNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InB1YmxpYyIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZE9ubHkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHcycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3MjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0TmFtZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzNKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHczWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHczcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR3NHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUNvZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHc1SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0dzVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHc1cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dzU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQndwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3NlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc2cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQnhaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3NjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dzdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CeUpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0dzdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dzdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjQ1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3OEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3OFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0I1cFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR3OHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dzg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjZwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR3OVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHc5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjdaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIHhtaTppZD0iXy1hNHc5NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHctSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR3LVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0IyWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0dy1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0dy01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CM0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdfSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0d19aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CMzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0d19wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHdfNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4QUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0J6SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eEFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4QXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hT0J6NVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eEE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eEJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYU9CMHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhCWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFPQjFaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4Q0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4Q1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhDcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhESlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbXBGaWVsZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0aWMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhFNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhGcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4RjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4R0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4R1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4R3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGV4dFJlZiIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldElzU2VjdXJlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFA1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJUcmFuc2FjdGlvblR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eFJwU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQ29udGFpbmVyIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4STVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVySW5jbHVkZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4SnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RyaWN0ZnAiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhLSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4S1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4S3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJc1NpbmdsZVRocmVhZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eEs1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhMSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhMWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eExwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yQ29va2llIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHhTNVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjIuMCIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHhVSlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4VjVTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJwdWJsaWMiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhNcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZV9YTUxfREQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE5KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhOWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlhNTEZpbGVQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbnhGYWN0b3J5IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4TjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhPSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZW50cmFudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhPcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkVudmlyb25tZW50UHJvcGVydGllcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eE81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhQSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4UFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUhUTUwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhQcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4UDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4UUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWcFpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhRcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlbGVzcyIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWcUpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhSSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4UlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZxNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4UnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhTSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnhwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4U1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4U3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z5WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4UzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhUSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4VFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z6WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54IiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4VDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1YwSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4VUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVnI1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4VTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4VkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1ZzcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4VnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z0WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4VjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhXSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4V1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z1WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4VzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hZ1Z2SlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eFhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eFhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWdWdjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhYcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhYNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFnVndwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgIDwvZUNsYXNzaWZpZXJzPgotICAgICAgPGVDbGFzc2lmaWVycyB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiB4bWk6aWQ9Il8tYTR4WUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Sb2xlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4WVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tYWFQQ0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkV3JpdGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eGJKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iUmVhZCAmYW1wOyBXcml0ZSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5pdGlhbFZhbHVlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4WkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcm9wZXJ0eVR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eGM1U2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTm90IEEgUHJvcGVydHkiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhaWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eFpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhaNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVm9sYXRpbGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhhWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzTmF2aWdhYmxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhhcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lckNsYXNzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4YkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZCAmYW1wOyBXcml0ZSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4YnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBFNVNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZCBPbmx5IiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4Y0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBGcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eGNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iV3JpdGUgT25seSIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQR1pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eGM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhkSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik5vdCBBIFByb3BlcnR5Ij4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhkWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUEhaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4ZHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaW1wbGUiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHhkNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLWFhUElKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4ZUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCb3VuZCIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tYWFQSTVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHhlcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cmFpbmVkIiB2YWx1ZT0iMyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4ZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1hYVBKcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0eGZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eGZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJzdGVyZW90eXBlIiByZWZlcmVuY2VzPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4ZjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhnSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4Z1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhoWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckhlYWRlcnMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhocFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhpcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4aTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhrSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhrWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGtwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhrNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlNlc3Npb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh0SlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGxKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4bHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eGw1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVHJhbnNhY3Rpb25UeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHh1NVNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkNvbnRhaW5lciIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzcGF0Y2hlckluY2x1ZGUiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEhlYWRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG01U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhuSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0cmljdGZwIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4blpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG5wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eG41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4b1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4b3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhvNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvckNvb2tpZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4d0pTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIyLjAiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhwWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9Il8tYTR4eFpTa0VkbWphdVNqRzhxTzJBIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eHpKU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0icHVibGljIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVfWE1MX0REIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ254RmFjdG9yeSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4clpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWVudHJhbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4cjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHhzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eHNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVIVE1MIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4czVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eHRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NXM1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHh1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NXRwU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4dVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWZ1bCIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1dVpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eHU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4dlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUxSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1MTVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eHdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4d1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1MjVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh3NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1M3BTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eHhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQiPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4eDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTV2WlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eHlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1d0pTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh5cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciIgdmFsdWU9IjIiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1dzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfLWE0eHpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4elpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eHpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1eDVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHh6NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCIgdmFsdWU9IjEiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1eXBTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iXy1hNHgwWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHgwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NXpaU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4MDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iMyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4MUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTUwSlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgeG1pOmlkPSJfLWE0eDFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4MXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InN0ZXJlb3R5cGUiIHJlZmVyZW5jZXM9Il8tWnU1WVpTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4MTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkV3JpdGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfLWE0eDNwU2tFZG1qYXVTakc4cU8yQSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iUmVhZCAmYW1wOyBXcml0ZSIvPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfLWE0eDJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlUeXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iXy1hNHg1WlNrRWRtamF1U2pHOHFPMkEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ik5vdCBBIFByb3BlcnR5Ii8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4MlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgycFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4MjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJUcmFuc2llbnQiIGxvd2VyQm91bmQ9IjEiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIHhtaTppZD0iXy1hNHgzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlZvbGF0aWxlIiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il8tYTR4M1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbmRpdmlkdWFsQ2hhbmdlTWd0IiBsb3dlckJvdW5kPSIxIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4M3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVSZWFkV3JpdGVfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4MzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkICZhbXA7IFdyaXRlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWNKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiIHZhbHVlPSIxIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWM1U2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5IiB2YWx1ZT0iMiI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4NUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTVkcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICAgIDxlQ2xhc3NpZmllcnMgeG1pOnR5cGU9ImVjb3JlOkVFbnVtIiB4bWk6aWQ9Il8tYTR4NVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVCZWFuUHJvcGVydHlfU2V0Ij4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4NXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3QgQSBQcm9wZXJ0eSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4NTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTVlcFNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eDZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2ltcGxlIiB2YWx1ZT0iMSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYTR4NlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImVudW1lcmF0aW9uTGl0ZXJhbCIgcmVmZXJlbmNlcz0iXy1adTVmWlNrRWRtamF1U2pHOHFPMkEiLz4KLSAgICAgICAgPC9lTGl0ZXJhbHM+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfLWE0eDZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQm91bmQiIHZhbHVlPSIyIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hNHg2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0iZW51bWVyYXRpb25MaXRlcmFsIiByZWZlcmVuY2VzPSJfLVp1NWdKU2tFZG1qYXVTakc4cU8yQSIvPgotICAgICAgICA8L2VMaXRlcmFscz4KLSAgICAgICAgPGVMaXRlcmFscyB4bWk6aWQ9Il8tYTR4N0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb25zdHJhaW5lZCIgdmFsdWU9IjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWE0eDdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHJlZmVyZW5jZXM9Il8tWnU1ZzVTa0VkbWphdVNqRzhxTzJBIi8+Ci0gICAgICAgIDwvZUxpdGVyYWxzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZXE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLnZlcnNpb25zIj4KLSAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplckpTa0VkbWphdVNqRzhxTzJBIiBrZXk9IjAiIHZhbHVlPSIxLjAiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iXy1ab3l3WlNrRWRtamF1U2pHOHFPMkEiIHZpc2liaWxpdHk9InByaXZhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOU1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOU1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbThxYkE2ODZFZGlFaDc1WUpfM244ZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iXy1ab3l3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOU1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOU01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19FZlJab0s4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfLVpveXc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5TkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5TlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL0phdmFQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX1JqbXlvSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tWm95eHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Nb2R1bGVCb2R5Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1ab3l4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1ab3l5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVpveXlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOU5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1ab3l5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVpveXk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWm95ejVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENvbXBvbmVudCIgYXNzb2NpYXRpb249Il8tWm95ekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOU41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5T0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205VkpqSzg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWm95MEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbUlkZW50aWZpY2F0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOU9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5T3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVpveTBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOU81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlQSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVpveTBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29weXJpZ2h0Tm90aWNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVp1NVlKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWm95ekpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb21wb25lbnRfZGVmYXVsdF9fTW9kdWxlQm9keSIgbWVtYmVyRW5kPSJfLVpveXpaU2tFZG1qYXVTakc4cU8yQSBfLVpveXo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVpveXpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX01vZHVsZUJvZHkiIHR5cGU9Il8tWm95eHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1ab3l6SlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5UTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlSSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1ab3l6cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlSWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tWnU1WVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19BdHRyaWJ1dGUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NVlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NVk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1WkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5UjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NVpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1WnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVhcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkRW51bWVyYXRpb25MaXRlcmFsIiBhc3NvY2lhdGlvbj0iXy1adTVaNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5U0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlTWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmdhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVicFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJvcGVydHkiIGFzc29jaWF0aW9uPSJfLVp1NWE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlTcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOUMxbGE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZFdyaXRlIiB0eXBlPSJfLVp1NWI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlUSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1adTVoNVNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NWNKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlUNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlUeXBlIiB0eXBlPSJfLVp1NWVaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlVSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1adTVpWlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVp1NWVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTlVNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NWlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVpNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlWcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVqSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkZpbmFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5V1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVqWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlXcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5VzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVqcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlRyYW5zaWVudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlYSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWnU1ajVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5WHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1a0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJWb2xhdGlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlZSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWnU1a1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5WXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOVk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1a3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOVpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTVrNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlacFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5WjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NVo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRW51bWVyYXRpb25MaXRlcmFsX2RlZmF1bHRfX0F0dHJpYnV0ZSIgbWVtYmVyRW5kPSJfLVp1NWFKU2tFZG1qYXVTakc4cU8yQSBfLVp1NWFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5YUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5YVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NWFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0F0dHJpYnV0ZSIgdHlwZT0iXy1adTVZWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVp1NVo1U2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlhcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVp1NWFaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTliWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NWE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJvcGVydHlfZGVmYXVsdF9fQXR0cmlidXRlIiBtZW1iZXJFbmQ9Il8tWnU1YkpTa0VkbWphdVNqRzhxTzJBIF8tWnU1YnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iRTlicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iRTliNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1YkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQXR0cmlidXRlIiB0eXBlPSJfLVp1NVlaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1YTVTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5Y1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1YlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkU5Y3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTViNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJFOWRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVjSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWQgJmFtcDsgV3JpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1Y1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkU5ZDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1YzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkIE9ubHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1ZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjgyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJFOWVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1ZHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJXcml0ZSBPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVlSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI4MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NWVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NWVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTm90IEEgUHJvcGVydHkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1ZTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjcxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1ZlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaW1wbGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1ZnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjcyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEMkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1Z0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCb3VuZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVnWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1Z3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEMlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQycFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVnNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cmFpbmVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NWhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVsWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTVscFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NWw1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTVtSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NW1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1blpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEFjdG9yIiBhc3NvY2lhdGlvbj0iXy1adTVtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTluZGNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTVvWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ2xhc3MiIGFzc29jaWF0aW9uPSJfLVp1NW5wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQ0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tODh1eHE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NXBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRFbnVtZXJhdGlvbiIgYXNzb2NpYXRpb249Il8tWnU1b3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJlYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1cVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEludGVyZmFjZSIgYXNzb2NpYXRpb249Il8tWnU1cHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205VkpvcTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1clpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJFNpZ25hbCIgYXNzb2NpYXRpb249Il8tWnU1cXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205Vkp6YTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1c1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJFByaW1pdGl2ZVR5cGUiIGFzc29jaWF0aW9uPSJfLVp1NXJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQ2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRDZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSc2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVp1NTRwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxENzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTU1SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQ4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEOFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTU1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVp1NTVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRDlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEOXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQ5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVp1NTZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRC1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEQtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEQtcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRC01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWnU1NnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxEX0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRF9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWnU1NjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRF9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxEXzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1adTU3SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1adTU3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVp1NTdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVCWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVp1NTc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9ySGVhZGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5FSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFQ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5FWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5FcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVESlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5FNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVEcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuRkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFRUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuRlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5GcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVGSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5GNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFRjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbkdKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVHWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFR3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVHNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuR3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFSEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuRzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuSEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFSUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5IcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVKSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFSlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5INVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFSnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbklKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUtKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVLWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbklaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVLcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRUs1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5JcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVMSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5JNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRUxwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5KSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVNSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5KWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRU1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFTTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5KcFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRU5aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuSjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFTnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVONVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbktKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRU9KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVPWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbktaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFT3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVPNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbktwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVQWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbks1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblR5cGUiIHR5cGU9Il8tWnU1c3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVBwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFUDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVoxbkxKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1czVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFUXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVRNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbkxwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVSWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbkw1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVScFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuTUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFU0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVTcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuTXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJUcmFuc2FjdGlvblR5cGUiIHR5cGU9Il8tWnU1MDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVoxbk5KU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1MUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVySW5jbHVkZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVVcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuTnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuTjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFVnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVWNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuT0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFV0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRVdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuT1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFVzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbk9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVYWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbk81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVYNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVZWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblBaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RyaWN0ZnAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVZNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblBwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRVpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVaWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFWnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVaNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblFKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVhWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVhcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5RcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEViSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFYlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5RNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5SSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5SWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFYzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5ScFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5SNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuU0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuU1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVlNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVmWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yQ29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFZjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVnWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblRaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgdHlwZT0iXy1adTUycFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFZ3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVnNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuVHBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTUyNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVoSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFaFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5UNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgdHlwZT0iXy1adTV2SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFaHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tWjFuVUpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1adTV2WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVpSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFaVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5VWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIHR5cGU9Il8tWnU1eHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFaTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLVoxblVwU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tWnU1eDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFakpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuVTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVqcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuVkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFa0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRWtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuVlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZV9YTUxfREQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFa3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVrNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxblZwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVsSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5WNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRWxwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFbDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxbldKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRW1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVtWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbldaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVtNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuV3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFbkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRW5aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuVzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbnhGYWN0b3J5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRW5wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFbjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVoxblhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRW9KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVvWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRW9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFbzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aMW5YcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVwSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFcFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5YNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZW50cmFudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXA1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuWUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFcUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuWVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5ZcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5ZNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkVudmlyb25tZW50UHJvcGVydGllcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aMW5aSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVzSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFc1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5aWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEVzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjFuWnBTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxblo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuYUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjFuYVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUhUTUwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVoxbmFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVoxbmE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFdnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjFuYkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFd0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVtcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFjdG9yX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVtNVNrRWRtamF1U2pHOHFPMkEgXy1adTVuWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1bXBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFeFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1bkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1bnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWnU1bjVTa0VkbWphdVNqRzhxTzJBIF8tWnU1b1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1bjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVp1NW5wU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEV5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRXk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVp1NW9KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRXpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEV6WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NW9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRW51bWVyYXRpb25fRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVp1NW81U2tFZG1qYXVTakc4cU8yQSBfLVp1NXBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFenBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVp1NW81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tWnU1bEpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1adTVvcFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFMEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1adTVwSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFMDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1adTVwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkludGVyZmFjZV9EZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWnU1cDVTa0VkbWphdVNqRzhxTzJBIF8tWnU1cVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWnU1cDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1adTVsSlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVp1NXBwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVp1NXFKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEUyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVp1NXFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2lnbmFsX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVxNVNrRWRtamF1U2pHOHFPMkEgXy1adTVyWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1cXBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFM1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1ckpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFM3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWnU1cnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltaXRpdmVUeXBlX0RlZmF1bHRfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1adTVyNVNrRWRtamF1U2pHOHFPMkEgXy1adTVzWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1adTVyNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLVp1NWxKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWnU1cnBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFNDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWnU1c0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTVzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRTVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTVzNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1dEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU2SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV1SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFNnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTV1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFN0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTV2SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1dlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFOEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTV3SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1d1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NXdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEU4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRTg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFOUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEU5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1adTV4cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfU2VydmxldF9fQ2xhc3NDdG9yX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFOXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFOTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXg1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHVibGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUtSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRS1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJvdGVjdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NXk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTV6SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEUtcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRS01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NXpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icHJpdmF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1adTV6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWnU1ejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxFX0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEVfWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTUwSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InBhY2thZ2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY1Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRV9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxFXzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWnU1MDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGQUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NTFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTUxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZBNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1adTUxNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1MkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZCSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVp1NTJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZCNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWnU1MjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIyLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWnU1M0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVp1NTNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZDSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVp1NTNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMS54Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVp1NTM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1adTU0SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGQ3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVoxbmJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVoxbmI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjFuY0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGREpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVoxbmNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjFuY3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aMW5kcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLVoxbmM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZEWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dHNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tWjFuZDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGRUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0dFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1aN3RzcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZFcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3R1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1aN3R0cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZGSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3R2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1aN3R1cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZGcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3R3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tWjd0dnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGR0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0OFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGR1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZHcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd0OHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGRzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0ODVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Z2V0SW5mbyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZIWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3Q5SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZINVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGSUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3Q5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZJWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRklwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd0OXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGSTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0OTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZKWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRkpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd0LUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGSjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRktKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0LVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRktaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGS3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3QtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZLNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGTEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3QtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZMcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dF9KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRkw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZNSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dF9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZNcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd0X3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGTTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRk5KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd0XzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRk5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGTnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUFKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRk41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZPSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUFaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRlbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRk9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGT3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRk81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZQSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGUHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3VCSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZQNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGUUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VCWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGUXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZSSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZScFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tWjd1Q0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGUjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1Q1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZTWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1aN3VDcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZTNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGVEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VDNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGVHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1aN3VESlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGVUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1aN3VEWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZVcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLVo3dURwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZWSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZWWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tWjd1RUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGVjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRldKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tWjd1RVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRldaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGV3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLVo3dUVwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZYSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLVo3dUU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGWFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZYcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRlg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZZSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGWVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZZcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFVwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZZNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGWkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBVNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZaWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRlpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGWjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZhWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwVnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGYTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJMRmJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwVjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1aN3R3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGYlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZicFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUIwV0pTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1aN3R3NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZiNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGY0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBXWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGY1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZjcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMFdwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZkSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMFc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGlzYWJsZUF1dG9TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBYSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZkNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBYWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBYcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZlNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBYNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1aN3Q0NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYkxGZlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iTEZmcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUIwWUpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1aN3Q1SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iTEZmNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZ0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBZWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJMRmdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYkxGZ3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBZcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktjSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBZNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktjcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2M1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBaSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktkSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBaWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLZHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwWnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLZUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2VaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwWjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwYUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLZkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2ZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2Y1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwYXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLZ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2daU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktncFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2c1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwYkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2haU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwYlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2hwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLaDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2lKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktpWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGI1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLaXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktpNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGNKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2pKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktqWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLanBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktqNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS2tKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktrWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktrcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2s1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBkSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktsSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLbFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBkWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktscFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS2w1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwZHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLbUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS21aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLbXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkttNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwZUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLbkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS25aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwZVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLVo3dDZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktucFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS241U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBlcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dDY1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS29KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktvWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLVo3dHpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktvcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS281U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hQjBmSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLVo3dHpaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3BKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1aN3QxcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLcHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktwNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYUIwZnBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1aN3QxNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLcVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBmNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3FwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLcTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBnSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLclpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBnWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3I1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwZ3BTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktzWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGc1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLc3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwaEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLdEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3RaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwaFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3Q1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBocFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBoNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUIwaUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLdkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSS3ZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwaVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLdnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFCMGlwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3dKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLdzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBqSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkt4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLeFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBqWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3hwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLeDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGpwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3lKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGo1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3lwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFCMGtKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3pKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkt6WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFCMGtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSS3pwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hQjBrcFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLMEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzBaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwazVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkswcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzA1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBsSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUksxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLMVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUksxcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUIwbHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLMkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUIwbDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUksycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hQjBtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkszSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLM1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVoxbmM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aMW5kSlNrRWRtamF1U2pHOHFPMkEgXy1aMW5kcFNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aMW5kSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVoxbmM1U2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzRaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVoxbmRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVoxbmQ1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NfZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aMW5lSlNrRWRtamF1U2pHOHFPMkEgXy1aN3RzWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aMW5lSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVoxbmQ1U2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks1cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHNKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVo3dHNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRW51bWVyYXRpb25fZGVmYXVsdF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1aN3RzNVNrRWRtamF1U2pHOHFPMkEgXy1aN3R0WlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1aN3RzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19DbGFzcyIgdHlwZT0iXy1aMW5iWlNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLVo3dHNwU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSzdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLVo3dHRKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSzdwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLVo3dHRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX2RlZmF1bHRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWjd0dDVTa0VkbWphdVNqRzhxTzJBIF8tWjd0dVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWjd0dDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQ2xhc3MiIHR5cGU9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1aN3R0cFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLOHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUks4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1aN3R1SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUks5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLOVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1aN3R1cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpZ25hbF9kZWZhdWx0X19DbGFzcyIgbWVtYmVyRW5kPSJfLVo3dHU1U2tFZG1qYXVTakc4cU8yQSBfLVo3dHZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLOXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLOTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLVo3dHU1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX0NsYXNzIiB0eXBlPSJfLVoxbmJaU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tWjd0dXBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSSy1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJLLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tWjd0dkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLLXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSSy01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tWjd0dnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJQcmltaXRpdmVUeXBlX2RlZmF1bHRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tWjd0djVTa0VkbWphdVNqRzhxTzJBIF8tWjd0d1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUktfSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktfWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tWjd0djVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kZGVmYXVsdF9fQ2xhc3MiIHR5cGU9Il8tWjFuYlpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1aN3R2cFNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJLX3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUktfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1aN3R3SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxBSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dHdwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3R3NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0eEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dHhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxCSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVsZXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dHg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3R5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMQnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxCNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3R5WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRlZnVsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dHlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3R5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMQ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxDWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1aN3R6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMQ3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dHpaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3R6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0ejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTERKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0MEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3QwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMRHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxENVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3QwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3QxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0MVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMRVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tWjd0MXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxFcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxFNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0MTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0MkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMRlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0MnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0MjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMRjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tWjd0M1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3QzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxHSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3Q0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0NHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMR3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxHNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1aN3Q0NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMSFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxINVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3Q1NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tWjd0NkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLVo3dDZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxJSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTElaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLVo3dDZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMSTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLVo3dDY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLVo3dDdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1aN3Q3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMSkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1aN3Q3cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1aN3Q3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tWjd0OEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTEpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMSjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hQjBtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX1Byb2plY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFCMG1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFCMG01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUIwbkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMS0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFCMG5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUIwbnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hQjBvcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkTW9kZWwiIGFzc29jaWF0aW9uPSJfLWFCMG41U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxLWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTEtwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kYmE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFINi1aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVXNlckRlZmluZVRhZ0FwcGx5MyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxLNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTExKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDYtcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxMWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDYtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NTaW5jZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxMNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg2X0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMTVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg2X1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHbG9iYWxJbXBvcnRzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMTkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFINl9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxOcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFINl81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0UmV0dXJuTGluZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxONVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTE9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3QUpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTE9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxPcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0FaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW5zdGFuY2VWYXJpYWJsZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxPNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdBcFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJtXyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxQcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0E1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2hvd0NvZGVnZW5EbGciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0JKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0JaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTm9DbGFzc0N1c3RvbURsZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxRNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3QnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3QjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTQ0NQcm9qZWN0TmFtZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxSNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdDSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxTWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdDWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVRhYnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMUzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxUSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0NwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0M1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFQ1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMVUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0RKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9ImludCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxVcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0RaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTG9jYWxQcmVmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxWSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxXSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbEhvbWVTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMVzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxYSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnVGV4dDIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxZSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3RkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMWVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTFlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3RlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIb21lU3VmZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMWkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0ZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTFpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxacFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0Y1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVkFKYXZhV29ya2luZ0ZvbGRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxaNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdHSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxhWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMYXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdHWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRFSkJWZXJzaW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMYkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0dwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxicFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0c1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWF4TnVtQ2hhcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxjSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4Szg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFIN0hKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9IjgwIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMY1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3SFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnTmFtZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMYzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxkSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3SHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3SDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RFRETG9jYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxlSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3SUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTGVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3SVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnQXBwbHkxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0lwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxmcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0k1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVSb3NlSUQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMZjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxnSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0pKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxnWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMZ3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdKWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0b3BPbkVycm9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMaEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdKcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxoWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMaHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdKNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NWZXJzaW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMaUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdLSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxpWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMaXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdLWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NEZWZhdWx0QXV0aG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMakpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN0twU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxqcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN0s1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iT3BlbkJyYWNlTWV0aG9kU3R5bGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMajVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxrSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN0xKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxrWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMa3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdMWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFzdGVyaXNrQ29tbWVudFN0eWxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTGs1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdMcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxsWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdMNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1hcnlLZXlTdWZmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxtSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3TUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3TVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFZGl0b3IiIHR5cGU9Il8tYUg2OHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTG01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMbkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFIN01wU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYUg2ODVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMblpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTG5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3TTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnQXBwbHkyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTG41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMb0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN05KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTG9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxvcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN05aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMbzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN05wU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMcHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNwYWNpbmdJdGVtcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYUg3T0pTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0iMyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN09aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRFRETG9jYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMcTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3T3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMclpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3TzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMcjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkxzSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1BKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxzWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMc3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdQWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxzNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdQcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdQNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVN1ZmZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdRSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx1WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdRWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlZmVyZW5jZUNsYXNzcGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdRcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMdnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdRNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik9wZW5CcmFjZUNsYXNzU3R5bGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMdjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx3SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1JKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx3WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMd3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdSWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkxvY2FsU3VmZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMeEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1JwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx4cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1I1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVk0iIHR5cGU9Il8tYUIwbzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTHg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMeUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFIN1NKU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYUIwcEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3U1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0U2VydmxldFZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMeTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkx6SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3U3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMelpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTHpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3UzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VQcmVmaXhlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkx6NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3VEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3VFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuU3VmZml4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1RwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1Q1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhblByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdVSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwyWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMMnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdVWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ0NvbW1lbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMMjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwzSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1VwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUm9vdERpciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwzNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdWSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdWWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdUZXh0MSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdWcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw1WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdWNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZXJEZWZpbmVUYWdOYW1lMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTDZKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdXSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMNnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdXWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkF1dG9TeW5jIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMN0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdXcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw3WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMN3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdXNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NBdXRob3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMNzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1hKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw4cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1haU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUm9zZURlZmF1bHRDb21tZW50U3R5bGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMODVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkw5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFIN1hwU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkw5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMOXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdYNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1Byb2plY3RTb3VyY2VSb290Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTDk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlJMLUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFIN1lKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJSTC1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iUkwtcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFIN1laU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YUNvbW1lbnRTdHlsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkwtNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTF9KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYUg3WXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlJMX1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJSTF9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iUkxfNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdaSlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ2b2lkIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJVc2VyRGVmaW5lVGFnTmFtZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJGSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3WnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3WjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSRjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJHSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYUg3YUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSR1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYUg3YVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3RTaG93Um9zZUlERGxnIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hSDdhcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJIWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdhNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlbW90ZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJINVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUklKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hSDdiSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJJWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSSXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hSDdiWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlVzZVNwYWNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJJNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9Ca0pTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJKcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQmtaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NWYXJpYWJsZVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJKNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUktKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JrcFNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJzXyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUktaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJLcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQms1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSmF2YWRvY0RlZmF1bHRTaW5jZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJLNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUkxKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JsSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJMWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JsWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNDQ1NlbGVjdGVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUkw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0JscFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJNWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSTXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JsNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkhvbWVQcmVmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJOSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9CbUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk5wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CbVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJMb2NhbEhvbWVQcmVmaXgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJPSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9CbXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhST1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUk9wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CbTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbGFzc1BhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSTzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJQSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9CbkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CblpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTb3VyY2VDb250cm9sIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlA1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSUUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0JucFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJRWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSUXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JuNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkphdmFkb2NOdW1Bc3Rlcmlza3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJSSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4Szg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQm9KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJScFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQm9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUHJpbWFyeUtleVByZWZpeCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJSNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JvcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJTWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSU3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFCMG41U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTW9kZWxfZGVmYXVsdF9fUHJvamVjdCIgbWVtYmVyRW5kPSJfLWFCMG9KU2tFZG1qYXVTakc4cU8yQSBfLWFCMG9wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSUzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSVEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFCMG9KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX1Byb2plY3QiIHR5cGU9Il8tYUIwbVpTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hQjBuNVNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSVFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJUcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hQjBvWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJUNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSVUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFCMG81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUHJvamVjdFZNVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSVVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSVXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFCMHBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3VuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFCMHBaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hQjBwcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMDAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSVTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJWSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hQjBwNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1pY3Jvc29mdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hQjBxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYUIwcVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSVnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYUIwcXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJJQk0iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUg2OEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFINjhaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJWNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUldKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFINjhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUldaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUldwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hSDY4NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJ1aWx0SW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYUg2OUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFINjlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjEwMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJXNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFINjlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iV2luZG93c1NoZWxsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFINjk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hSDYtSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIxMDEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJYcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9FSkJfX0NsYXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0JwSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0JwWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQnBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0JwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQnFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CckpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEFjdG9yIiBhc3NvY2lhdGlvbj0iXy1hT0JxWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSWUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJZWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTluZGNhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JzSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQ2xhc3MiIGFzc29jaWF0aW9uPSJfLWFPQnJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUlk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tODh1eHE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQnRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRFbnVtZXJhdGlvbiIgYXNzb2NpYXRpb249Il8tYU9Cc1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJlYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CdUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEludGVyZmFjZSIgYXNzb2NpYXRpb249Il8tYU9CdFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUlpwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSWjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205VkpvcTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CdkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJFNpZ25hbCIgYXNzb2NpYXRpb249Il8tYU9CdVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmFKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSYVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205Vkp6YTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9Cd0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJFByaW1pdGl2ZVR5cGUiIGFzc29jaWF0aW9uPSJfLWFPQnZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJhcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOWJSc2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQjhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCTmFtZUluSkFSIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSYlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQjhaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmJwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJiNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQjhwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSY1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0I4NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJjcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSYzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0I5SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRnZXRJbmZvIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQjlaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJkNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQjlwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJlWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQjk1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJlNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQi1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEludEhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJmSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9CLVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSZnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9CLXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0ItNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJncFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSZzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0JfSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNtcEZpZWxkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSaFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQl9aU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUmhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJoNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQl9wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9ySGVhZGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJpSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0JfNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJpcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSaTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NBSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJqSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0NBWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJqcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSajVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NBcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJrSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DQTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSa3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUms1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DQkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJsSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUmxaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0NCWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJscFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NCcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUm1KU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSbVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFPQ0I1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUm1wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJtNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0NKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJuWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU9DQ1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSbnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm41U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DQ3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVyRm9yd2FyZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJvSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYU9DQzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSb3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUm81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DREpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhScFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NEWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhScDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NEcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhScUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJxWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0Q1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJxNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0VKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVmZXJlbmNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJySlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hT0NFWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhScjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NFcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRDb250ZXh0UmVmIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSc1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NFNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJzcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSczVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hT0NGSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSdFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hT0NGWlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DRnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SXNTZWN1cmUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0Y1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0dKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGaW5hbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSdkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0daU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFPQ0dwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblR5cGUiIHR5cGU9Il8tYU9Cd1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUndKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSd1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFPQ0c1U2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYU9Cd3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSd3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYU9DSEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNhYmxlQXV0b1N5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSeEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ4WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFPQ0haU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUnhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJ4NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSU1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJTVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSeXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJTXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCTVBfRXh0ZW5kX0NNUCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFJ6SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUnpaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJTTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSenBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUno1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJTkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJUcmFuc2FjdGlvblR5cGUiIHR5cGU9Il8tYU9CNHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjBKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSMFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFVSU5aU2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYU9CNDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjA1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJTnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEaXNwYXRjaGVySW5jbHVkZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFIxSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJTjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjE1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJT0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIyWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJT1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSMnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjI1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJT3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSM1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFVSU81U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjNwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFIzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldERhdGVIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI0WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVBwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RyaWN0ZnAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI1WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVA1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI1NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVFKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2Vzc2lvblN5bmMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSNkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI2WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVFaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCU2VjdXJpdHlSb2xlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI3SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjdaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hVUlRNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSNzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlSSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IklzU2luZ2xlVGhyZWFkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUjhKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSOFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hVUlSWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFI4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhSODVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hVUlScFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSOUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFI5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYVVJUjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSOXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUjk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJU0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFItSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUi1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYVVJU1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSLXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYUi01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYVVJU3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SGVhZGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhSX0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJfWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFVSVM1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYUl9wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFJfNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVRKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iTWV0aG9kRm9yQ29va2llIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0FKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTQVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFVSVRaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0FwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNBNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFVSVRwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCVmVyc2lvbiIgdHlwZT0iXy1hT0I2WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNCWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYVVJVDVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0I2cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNCcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTQjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8wSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlBlcnNpc3RlbmNlVHlwZSIgdHlwZT0iXy1hT0IySlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTQ0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNDWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYWFPMFpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hT0IyWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNDcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTQzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8wcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnN0cnVjdG9ySXMiIHR5cGU9Il8tYU9CeTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0RKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJfLWFhTzA1U2tFZG1qYXVTakc4cU8yQSIgaW5zdGFuY2U9Il8tYU9CekpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTRHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0Q1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPMUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkT25seSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNFSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0VaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPMVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTRXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0U1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPMXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZV9YTUxfREQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhTzE1U2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNGcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTRjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU8ySlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXROYW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0dKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTR1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0dwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNHNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCWE1MRmlsZVBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNIWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPMjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTSHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0g1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPM0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJDbnhGYWN0b3J5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0lKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFhTzNaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0lwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU0pKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYU8zNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNKcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTSjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU80SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlJlZW50cmFudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNLSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0taU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPNFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTS3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0s1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPNHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNMSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU0xaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU80NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNMcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU81SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkVudmlyb25tZW50UHJvcGVydGllcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNNSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU01aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hYU81WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNNcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTTTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYU81cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlQ29kZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNOSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU05aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPNTVTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU05wU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNONVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzZKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTT0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNPWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPNlpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTT3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU081U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPNnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUhUTUwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNQWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhTzY1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1BwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNQNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNRWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWFPN1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1E1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0JxWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkFjdG9yX0RlZmF1bHRfRUpCX19DbGFzcyIgbWVtYmVyRW5kPSJfLWFPQnFwU2tFZG1qYXVTakc4cU8yQSBfLWFPQnJKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTUkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTUlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFPQnFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJERlZmF1bHRfRUpCX19DbGFzcyIgdHlwZT0iXy1hT0JvNVNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFPQnFaU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNScFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1I1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFPQnE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNTWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFPQnJaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ2xhc3NfRGVmYXVsdF9FSkJfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYU9CcnBTa0VkbWphdVNqRzhxTzJBIF8tYU9Cc0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNTcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNTNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYU9CcnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9FSkJfX0NsYXNzIiB0eXBlPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYU9CclpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1RKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9CcjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1Q1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYU9Cc1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0JzcFNrRWRtamF1U2pHOHFPMkEgXy1hT0J0SlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1VKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1VaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0JzcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0JzWlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTVXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNVNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0JzNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0J0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkludGVyZmFjZV9EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0J0cFNrRWRtamF1U2pHOHFPMkEgXy1hT0J1SlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1ZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1Y1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0J0cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0J0WlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTV0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNXWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0J0NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNXcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTVzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0J1WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpZ25hbF9EZWZhdWx0X0VKQl9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hT0J1cFNrRWRtamF1U2pHOHFPMkEgXy1hT0J2SlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1hKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1haU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hT0J1cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiREZWZhdWx0X0VKQl9fQ2xhc3MiIHR5cGU9Il8tYU9CbzVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hT0J1WlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNYNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hT0J1NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNZSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hT0J2WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfRGVmYXVsdF9FSkJfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYU9CdnBTa0VkbWphdVNqRzhxTzJBIF8tYU9Cd0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNZcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNZNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYU9CdnBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kRGVmYXVsdF9FSkJfX0NsYXNzIiB0eXBlPSJfLWFPQm81U2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYU9CdlpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU1pKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTWlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYU9CdjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTWnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU1o1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hT0J3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRlZmF1bHRfRUpCX19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQndwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CeEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2FwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTYTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CeFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CeHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQng1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNiSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2JaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQnlKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CeVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQnlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNicFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2I1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFPQnk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2NKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2NaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0J6SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InB1YmxpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0J6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CenBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTY3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNjNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0J6NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByb3RlY3RlZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0IwSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CMFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iWFNkWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IwcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9InByaXZhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CMDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjY0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJYU2RwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTZDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CMVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwYWNrYWdlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjFwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IxNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iWFNlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJYU2VaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFPQjJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYlhTZXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYlhTZTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjJaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0IycFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CMjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYc1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CM0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJCZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0IzcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYc3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFhzNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0IzNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNvbnRhaW5lciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0I0SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CNFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHRKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYdFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CNHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh0cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh0NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYU9CNDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYU9CNUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFPQjVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh1SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjVwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0I1NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CNkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHVwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYdTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYU9CNlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJEZWZhdWx0X0VKQl9fQ2xhc3NFSkJWZXJzaW9uX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYdlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFPQjZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iMi4wIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFPQjY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hT0I3SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSIyMzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYdnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh2NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hT0I3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjEueCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hT0I3cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYU9CNzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYd1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hYU83cFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX09wZXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFPNzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFPOEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhdGVnb3J5TmFtZSIgdmFsdWU9IkphdmEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYU84WlNrRWRtamF1U2pHOHFPMkEiIGtleT0ic3VwcHJlc3NlZCIgdmFsdWU9InRydWUiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWFPOHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYU84NVNrRWRtamF1U2pHOHFPMkEiIGtleT0idGFnZ2VkVmFsdWVTZXQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTzk1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRPcGVyYXRpb24iIGFzc29jaWF0aW9uPSJfLWFhTzlKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHhKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOUMyamE4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTy1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVwbGFjZUV4aXN0aW5nQ29kZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh4WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHhwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPLVpTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhTy1wU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRmluYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYeVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhTy01U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWHk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFh6SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhT19KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVGdWxseVF1YWxpZmllZFJldHVybiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFh6WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWHpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPX1pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYejVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDBKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFPX3BTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFPXzVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQQUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOYXRpdmUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhUEFaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhUEFwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWJzdHJhY3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYMlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgycFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFhUEE1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFgzSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFhUEJKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3luY2hyb25pemVkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDNaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYM3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hYVBCWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgzNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hYVBCcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlN0YXRpYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWFQQjVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYNDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hYU85SlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik9wZXJhdGlvbl9kZWZhdWx0X19PcGVyYXRpb24iIG1lbWJlckVuZD0iXy1hYU85WlNrRWRtamF1U2pHOHFPMkEgXy1hYU85NVNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWDVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hYU85WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19PcGVyYXRpb24iIHR5cGU9Il8tYWFPN3BTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hYU85SlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYNTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hYU85cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg2WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYNnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tYWFQQ0pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Sb2xlIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYVBDWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBDcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUEM1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYVBESlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFhUERaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWFQRVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJFByb3BlcnR5IiBhc3NvY2lhdGlvbj0iXy1hYVBEcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYN0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlDMWxhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZjcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRXcml0ZSIgdHlwZT0iXy1hYVBFcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYN3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg3NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYWdWYzVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hYVBFNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg4SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYOFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZkSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluaXRpYWxWYWx1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg4cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWDg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1ZkWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFg5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYOVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZkcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByb3BlcnR5VHlwZSIgdHlwZT0iXy1hYVBISlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYOXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFg5NVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYWdWZDVTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hYVBIWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgtSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRYLVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZlSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFgtcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWC01U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZVpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRYX0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWF9aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZXBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFhfcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWF81U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWZTVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUFaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWZkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJUcmFuc2llbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlBNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVmZaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUJKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlCWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iVm9sYXRpbGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlCNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVmY1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUNKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlDWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmdKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNOYXZpZ2FibGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZQ3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlDNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVmdaU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlESlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZRFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZncFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkluZGl2aWR1YWxDaGFuZ2VNZ3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlENVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVmc1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUVKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlFWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVmhKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29udGFpbmVyQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlFNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWaFpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZRkpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hYVBEcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByb3BlcnR5X2RlZmF1bHRfX1JvbGUiIG1lbWJlckVuZD0iXy1hYVBENVNrRWRtamF1U2pHOHFPMkEgXy1hYVBFWlNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hYVBENVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRkZWZhdWx0X19Sb2xlIiB0eXBlPSJfLWFhUENKU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYWFQRHBTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZR1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYWFQRUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZR3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hYVBFcFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX1JvbGVSZWFkV3JpdGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlISlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlIWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQRTVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJSZWFkICZhbXA7IFdyaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBGWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI4MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUEZwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iUmVhZCBPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEY1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBHSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI4MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlJSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUlaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUEdaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iV3JpdGUgT25seSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYVBHcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQRzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iODMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZSXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlJNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hYVBISlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImRlZmF1bHRfX1JvbGVCZWFuUHJvcGVydHlfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlKSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWFQSFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJOb3QgQSBQcm9wZXJ0eSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYVBIcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQSDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZSnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlKNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBJSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNpbXBsZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hYVBJWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWFQSXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNzIiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZS0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlLWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hYVBJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJvdW5kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFhUEpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hYVBKWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI3MyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlLcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWUs1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFhUEpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RyYWluZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVmNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9Ijc0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWUxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZTFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikh0dHBfU2VydmxldF9fQ2xhc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVmg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVmlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXRlZ29yeU5hbWUiIHZhbHVlPSJKYXZhIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWaVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9InN1cHByZXNzZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZTHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVmlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWaTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9InRhZ2dlZFZhbHVlU2V0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZqNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkQWN0b3IiIGFzc29jaWF0aW9uPSJfLWFnVmpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlMNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWU1KU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0icGF0aG1hcDovL1VNTDJfTUVUQU1PREVMUy9VTUwyLm1ldGFtb2RlbC51bWwyI19tOW5kY2E4NkVkaUVoNzVZSl8zbjhnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVms1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iYmFzZSRDbGFzcyIgYXNzb2NpYXRpb249Il8tYWdWa0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWU1aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZTXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX204OHV4cTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWbDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJEVudW1lcmF0aW9uIiBhc3NvY2lhdGlvbj0iXy1hZ1ZsSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlOSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTliUmVhODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZtNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkSW50ZXJmYWNlIiBhc3NvY2lhdGlvbj0iXy1hZ1ZtSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlOcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSm9xODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZuNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkU2lnbmFsIiBhc3NvY2lhdGlvbj0iXy1hZ1ZuSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlPSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01FVEFNT0RFTFMvVU1MMi5tZXRhbW9kZWwudW1sMiNfbTlWSnphODZFZGlFaDc1WUpfM244ZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1ZvNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImJhc2UkUHJpbWl0aXZlVHlwZSIgYXNzb2NpYXRpb249Il8tYWdWb0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWU9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZT3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205YlJzYTg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJOYW1lSW5KQVIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZTzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlQSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWMUpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlRSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjFwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlRcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldGdldEluZm8iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlSSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWMkpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZUlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMlpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJGaW5hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlSNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWMnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZU1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWMjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW50SGVhZGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZVEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1YzSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlUWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZVHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1YzWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlVSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjNwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlVcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjM1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCQ21wRmllbGQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlWSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0Q29udGVudFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZVjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlXSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZV1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWVdwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JIZWFkZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVc1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZWEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVjVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlYcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGljIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVg1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZWUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1Y1cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlZWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZWXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y1NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZWkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFnVjZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWVpaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlacFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFNlY3VyaXR5Um9sZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZWjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlhSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYWdWNnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZYVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWNjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlhNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hZ1Y3SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFliWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZYnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y3WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJGb3J3YXJkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWI1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZY0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hZ1Y3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFljWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZY3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hZ1Y3NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZYzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlkSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFnVjhKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWRaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlkcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFnVjhaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvb2tpZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlkNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYWdWOHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYWdWODVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJSZWZlcmVuY2VzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZZkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFtY0VKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlmcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0VaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldENvbnRleHRSZWYiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlnSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0VwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlncFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY0U1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZZzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFloSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY0ZKU2tFZG1qYXVTakc4cU8yQSIgdmFsdWU9InRydWUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFloWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZaHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNGWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRJc1NlY3VyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFloNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jRnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZaVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jRjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJHZW5lcmF0ZUZpbmFsaXplciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlpNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jR0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZalpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jR1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uVHlwZSIgdHlwZT0iXy1hZ1ZwSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZajVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlrSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYW1jR3BTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hZ1ZwWlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlrWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZa3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNHNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc2FibGVBdXRvU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlrNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWxKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jSEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWWxwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jSFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWWw1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNIcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFltWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNINVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkJNUF9FeHRlbmRfQ01QIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNJSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFluWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZbnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNJWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQlRyYW5zYWN0aW9uVHlwZSIgdHlwZT0iXy1hZ1Z4WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZbjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlvSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYW1jSXBTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hZ1Z4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlvWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZb3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNJNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkRpc3BhdGNoZXJJbmNsdWRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWW81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNKSlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlwWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZcHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNKWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZcDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jSnBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZcVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jSjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0WE1MRmlsZVBhdGgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZcTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlySlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jS0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZclpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jS1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0RGF0ZUhlYWRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlyNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jS3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZc1pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXNwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jSzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdHJpY3RmcCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFlzNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZXNzaW9uU3luYyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jTHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXVwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJTZWN1cml0eVJvbGVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXU1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZdkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFtY01KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXZaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl2cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY01aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSXNTaW5nbGVUaHJlYWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl3SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY01wU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXdaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl3cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY001U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZdzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFtY05KU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWXhaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFl4cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY05aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl4NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hbWNOcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl5WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZeXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNONVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlNlcnZsZXRIZWFkZXJOYW1lcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFl5NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYW1jT0pTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZelpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWXpwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jT1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJNZXRob2RGb3JDb29raWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZejVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYW1jT3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYW1jTzVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJWZXJzaW9uIiB0eXBlPSJfLWFnVnpKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkwNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTFKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNQSlNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnpaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkxcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1BaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUGVyc2lzdGVuY2VUeXBlIiB0eXBlPSJfLWFnVnJwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkxNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTJKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iXy1hbWNQcFNrRWRtamF1U2pHOHFPMkEiIGluc3RhbmNlPSJfLWFnVnI1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTJaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkycFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFtY1A1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29uc3RydWN0b3JJcyIgdHlwZT0iXy1hZ1Z1SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZMjVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFkzSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Il8tYW1jUUpTa0VkbWphdVNqRzhxTzJBIiBpbnN0YW5jZT0iXy1hZ1Z1WlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFkzWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZM3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNRWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlJlYWRPbmx5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTM1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hbWNRcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk0WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZNHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hbWNRNVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlX1hNTF9ERCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk0NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYXNpc0pTa0VkbWphdVNqRzhxTzJBIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTVaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk1cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXNaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU2VydmxldE5hbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZNTVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk2SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpc3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZNlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpczVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFSkJYTUxGaWxlUGF0aCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk2NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWTdKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2l0SlNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFk3WlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZN3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l0WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkVKQkNueEZhY3RvcnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZNzVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk4SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYXNpdHBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZOFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWThwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpdDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRZODVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk5SlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYZkJVSzg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfLWFzaXVKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTlaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFk5cFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXVaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCUmVlbnRyYW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWTk1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZLUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2l1cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFktWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZLXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l1NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ik1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWS01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRZX0pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXZKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWV9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFlfcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXZaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWV81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQUpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaXZwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkFaU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iZFpBcFNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaXY1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iR2VuZXJhdGVDb2RlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJkWkE1U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGZCVUs4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXy1hc2l3SlNrRWRtamF1U2pHOHFPMkEiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaQlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkJwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpd1pTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpCNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkNKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2l3cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpDWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaQ3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXy1hc2l3NVNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkdlbmVyYXRlSFRNTCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpDNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkRKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhmQlVLODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8tYXNpeEpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmRaRFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkRwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpeFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpENVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJkWkVKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXy1hc2l4cFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iZFpFWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmRaRXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVmpKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQWN0b3JfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVmpaU2tFZG1qYXVTakc4cU8yQSBfLWFnVmo1U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplVUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVmpaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZqSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplVXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVVNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZqcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVWSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplVlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZrSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IkNsYXNzX0h0dHBfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hZ1ZrWlNrRWRtamF1U2pHOHFPMkEgXy1hZ1ZrNVNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVZwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hZ1ZrWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRIdHRwX1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYWdWa0pTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplV1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYWdWa3BTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplV3BTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWbEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJFbnVtZXJhdGlvbl9IdHRwX1NlcnZsZXRfX0NsYXNzIiBtZW1iZXJFbmQ9Il8tYWdWbFpTa0VkbWphdVNqRzhxTzJBIF8tYWdWbDVTa0VkbWphdVNqRzhxTzJBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVYSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVYWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8tYWdWbFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJleHRlbnNpb24kSHR0cF9TZXJ2bGV0X19DbGFzcyIgdHlwZT0iXy1hZ1ZocFNrRWRtamF1U2pHOHFPMkEiIGFzc29jaWF0aW9uPSJfLWFnVmxKU2tFZG1qYXVTakc4cU8yQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVYcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVg1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLWFnVmxwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVZWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9sb3dlclZhbHVlPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfLWFnVm1KU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSW50ZXJmYWNlX0h0dHBfU2VydmxldF9fQ2xhc3MiIG1lbWJlckVuZD0iXy1hZ1ZtWlNrRWRtamF1U2pHOHFPMkEgXy1hZ1ZtNVNrRWRtamF1U2pHOHFPMkEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVlwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iXy1hZ1ZtWlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9ImV4dGVuc2lvbiRIdHRwX1NlcnZsZXRfX0NsYXNzIiB0eXBlPSJfLWFnVmhwU2tFZG1qYXVTakc4cU8yQSIgYXNzb2NpYXRpb249Il8tYWdWbUpTa0VkbWphdVNqRzhxTzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZVpKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplWlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tYWdWbXBTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplWnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZVo1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2xvd2VyVmFsdWU+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYWdWbkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTaWduYWxfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVm5aU2tFZG1qYXVTakc4cU8yQSBfLWFnVm41U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplYUpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplYVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVm5aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZuSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplYXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVhNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZucFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamViSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplYlpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXy1hZ1ZvSlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IlByaW1pdGl2ZVR5cGVfSHR0cF9TZXJ2bGV0X19DbGFzcyIgbWVtYmVyRW5kPSJfLWFnVm9aU2tFZG1qYXVTakc4cU8yQSBfLWFnVm81U2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplYnBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplYjVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFnVm9aU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJEh0dHBfU2VydmxldF9fQ2xhc3MiIHR5cGU9Il8tYWdWaHBTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hZ1ZvSlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplY0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVjWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hZ1ZvcFNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVjcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplYzVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFnVnBKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplZEpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZFpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnBaU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZwcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWcDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjAwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWRwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWcUpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJTdGF0ZWxlc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWcVpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnFwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVlSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWVaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnE1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iU3RhdGVmdWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWckpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnJaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIwMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVlcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFnVnJwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWZKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWZaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1ZyNVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWc0pTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnNaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVmcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWY1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnNwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1ZzNVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWdEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjIxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWdKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplZ1pTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWdFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWdHBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnQ1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIyMiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVncFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWc1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfLWFnVnVKU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVoSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVoWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWdVpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwdWJsaWMiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWdXBTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnU1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWhwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplaDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWdkpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcm90ZWN0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWdlpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnZwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjYzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWlKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplaVpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWdjVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJwcml2YXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWFnVndKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJyb3NlUHJvcGVydGllcyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hZ1Z3WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2FyZGluYWwiIHZhbHVlPSI2NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVpcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWk1U2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVndwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0icGFja2FnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z3NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWeEpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iNjUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplakpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVqWlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkTGl0ZXJhbD4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXy1hZ1Z4WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9Ikh0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVqcFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVqNVNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWeHBTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb250YWluZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWeDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVnlKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIxMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVrSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWtaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfLWFnVnlaU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQmVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z5cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWeTVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjEyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWtwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplazVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8tYWdWekpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJIdHRwX1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWxKU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZWxaU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXy1hZ1Z6WlNrRWRtamF1U2pHOHFPMkEiIG5hbWU9IjIuMCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hZ1Z6cFNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0icm9zZVByb3BlcnRpZXMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYWdWejVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImNhcmRpbmFsIiB2YWx1ZT0iMjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZWxwU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbDVTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8tYWdWMEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSIxLngiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYWdWMFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InJvc2VQcm9wZXJ0aWVzIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFnVjBwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJjYXJkaW5hbCIgdmFsdWU9IjIzMSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVtSlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZW1aU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvb3duZWRMaXRlcmFsPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8tYXNpeDVTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJkZWZhdWx0X19Nb2R1bGVTcGVjIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hc2l5SlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1hc2l5WlNrRWRtamF1U2pHOHFPMkEiIGtleT0iY2F0ZWdvcnlOYW1lIiB2YWx1ZT0iSmF2YSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFzaXlwU2tFZG1qYXVTakc4cU8yQSIga2V5PSJzdXBwcmVzc2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWJqZW1wU2tFZG1qYXVTakc4cU8yQSIga2V5PSJhZGRlZEluVmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1hc2l5NVNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfLWFzaXpKU2tFZG1qYXVTakc4cU8yQSIga2V5PSJ0YWdnZWRWYWx1ZVNldCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpMEpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJiYXNlJENvbXBvbmVudCIgYXNzb2NpYXRpb249Il8tYXNpelpTa0VkbWphdVNqRzhxTzJBIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW01U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbkpTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJwYXRobWFwOi8vVU1MMl9NRVRBTU9ERUxTL1VNTDIubWV0YW1vZGVsLnVtbDIjX205VkpqSzg2RWRpRWg3NVlKXzNuOGciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tYXNpMFpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDbUlkZW50aWZpY2F0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW5aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplbnBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaTBwU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW41U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVvSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWFzaTA1U2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iQ29weXJpZ2h0Tm90aWNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW9aU2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplb3BTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLWFzaTFKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfLWJqZW81U2tFZG1qYXVTakc4cU8yQSIgc291cmNlPSJ1bWwyLmV4dGVuc2lvbnMiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVwSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il8tYXNpelpTa0VkbWphdVNqRzhxTzJBIiBuYW1lPSJDb21wb25lbnRfZGVmYXVsdF9fTW9kdWxlU3BlYyIgbWVtYmVyRW5kPSJfLWFzaXpwU2tFZG1qYXVTakc4cU8yQSBfLWFzaTBKU2tFZG1qYXVTakc4cU8yQSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplcFpTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplcHBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfLWFzaXpwU2tFZG1qYXVTakc4cU8yQSIgbmFtZT0iZXh0ZW5zaW9uJGRlZmF1bHRfX01vZHVsZVNwZWMiIHR5cGU9Il8tYXNpeDVTa0VkbWphdVNqRzhxTzJBIiBhc3NvY2lhdGlvbj0iXy1hc2l6WlNrRWRtamF1U2pHOHFPMkEiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il8tYmplcDVTa0VkbWphdVNqRzhxTzJBIiBzb3VyY2U9InVtbDIuZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iXy1iamVxSlNrRWRtamF1U2pHOHFPMkEiIGtleT0iYWRkZWRJblZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXy1hc2l6NVNrRWRtamF1U2pHOHFPMkEiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iXy1iamVxWlNrRWRtamF1U2pHOHFPMkEiIHNvdXJjZT0idW1sMi5leHRlbnNpb25zIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il8tYmplcXBTa0VkbWphdVNqRzhxTzJBIiBrZXk9ImFkZGVkSW5WZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvbG93ZXJWYWx1ZT4KLSAgICA8L293bmVkRW5kPgotICA8L293bmVkTWVtYmVyPgotPC91bWw6UHJvZmlsZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL0phdmEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL0phdmEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYjVkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9KYXZhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI01vbiBNYXIgMTQgMTE6MjA6MjcgRVNUIDIwMDUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJSZWZlcmVuY2VzPUVKQlJlZmVyZW5jZXMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NEZWZhdWx0VmVyc2lvbj1KYXZhZG9jRGVmYXVsdFZlcnNpb24KLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcj1HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXM9U2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdEVkaXRvclR5cGVfX1dpbmRvd3NTaGVsbD1XaW5kb3dzU2hlbGwKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25TeW5jPUVKQlNlc3Npb25TeW5jCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0Vk1UeXBlX19TdW49U3VuCi1KYXZhX19kZWZhdWx0X19Sb2xlPWRlZmF1bHQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGVfX01pY3Jvc29mdD1NaWNyb3NvZnQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzPU1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TQ0NDb21tZW50PVNDQ0NvbW1lbnQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCUGVyc2lzdGVuY2VUeXBlPUVKQlBlcnNpc3RlbmNlVHlwZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19Jc1NpbmdsZVRocmVhZD1Jc1NpbmdsZVRocmVhZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUhUTUw9R2VuZXJhdGVIVE1MCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TdG9wT25FcnJvcj1TdG9wT25FcnJvcgotSmF2YV9fZGVmYXVsdF9fUm9sZVJlYWRXcml0ZV9TZXRfX1JlYWRcIE9ubHk9UmVhZCBPbmx5Ci1KYXZhX19kZWZhdWx0X19DbGFzc0N0b3JfU2V0X19wdWJsaWM9cHVibGljCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQkNtcEZpZWxkPUVKQkNtcEZpZWxkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JIZWFkZXJzPU1ldGhvZEZvckhlYWRlcnMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uX19TdGF0aWM9U3RhdGljCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXQ9Q3Rvcl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCUmVmZXJlbmNlcz1FSkJSZWZlcmVuY2VzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRJbnRIZWFkZXI9U2VydmxldEludEhlYWRlcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0Rpc3BhdGNoZXJGb3J3YXJkPURpc3BhdGNoZXJGb3J3YXJkCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzQ3Rvcl9TZXRfX3ByaXZhdGU9cHJpdmF0ZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fU0NDUHJvamVjdE5hbWU9U0NDUHJvamVjdE5hbWUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb29raWU9U2VydmxldENvb2tpZQotSmF2YV9fZGVmYXVsdF9fUm9sZV9fUHJvcGVydHlUeXBlPVByb3BlcnR5VHlwZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0VKQk5hbWVJbkpBUj1FSkJOYW1lSW5KQVIKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fTWV0aG9kRm9yQ29va2llPU1ldGhvZEZvckNvb2tpZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQ29udGFpbmVyPUNvbnRhaW5lcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldENvb2tpZT1TZXJ2bGV0Q29va2llCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCQ21wRmllbGQ9RUpCQ21wRmllbGQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1N0cmljdGZwPVN0cmljdGZwCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb249ZGVmYXVsdAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlU3BhY2VzPVVzZVNwYWNlcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0Rpc3BhdGNoZXJJbmNsdWRlPURpc3BhdGNoZXJJbmNsdWRlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldE5hbWU9U2VydmxldE5hbWUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJc1NlY3VyZT1TZXJ2bGV0SXNTZWN1cmUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRGlzcGF0Y2hlckZvcndhcmQ9RGlzcGF0Y2hlckZvcndhcmQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlNlc3Npb25UeXBlPUVKQlNlc3Npb25UeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCVHJhbnNhY3Rpb25UeXBlPUVKQlRyYW5zYWN0aW9uVHlwZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCVmVyc2lvbj1FSkJWZXJzaW9uCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0WE1MRmlsZVBhdGg9U2VydmxldFhNTEZpbGVQYXRoCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXQ9RUpCVmVyc2lvbl9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1ByaW1hcnlLZXlTdWZmaXg9UHJpbWFyeUtleVN1ZmZpeAotSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uX19HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuPUdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19SZW1vdGVTdWZmaXg9UmVtb3RlU3VmZml4Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX1ZvbGF0aWxlPVZvbGF0aWxlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SW5pdFBhcmFtZXRlcj1TZXJ2bGV0SW5pdFBhcmFtZXRlcgotSmF2YV9fZGVmYXVsdF9fUm9sZVJlYWRXcml0ZV9TZXRfX1dyaXRlXCBPbmx5PVdyaXRlIE9ubHkKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1ZBSmF2YVdvcmtpbmdGb2xkZXI9VkFKYXZhV29ya2luZ0ZvbGRlcgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wcml2YXRlPXByaXZhdGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQkVudmlyb25tZW50UHJvcGVydGllcz1FSkJFbnZpcm9ubWVudFByb3BlcnRpZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVSZWFkV3JpdGVfU2V0PVJlYWQvV3JpdGVfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXRfX1dyaXRlXCBPbmx5PVdyaXRlIE9ubHkKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0JlYW5TdWZmaXg9QmVhblN1ZmZpeAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXI9U2VydmxldEhlYWRlcgotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldF9fQ29uc3RyYWluZWQ9Q29uc3RyYWluZWQKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJWZXJzaW9uPUVKQlZlcnNpb24KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19NZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcz1NZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0dlbmVyYXRlRmluYWxpemVyPUdlbmVyYXRlRmluYWxpemVyCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1JlcGxhY2VFeGlzdGluZ0NvZGU9UmVwbGFjZUV4aXN0aW5nQ29kZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJOYW1lSW5KQVI9RUpCTmFtZUluSkFSCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldENvb2tpZT1TZXJ2bGV0Q29va2llCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0PUVKQlNlc3Npb25UeXBlX1NldAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fU0NDUHJvamVjdFNvdXJjZVJvb3Q9U0NDUHJvamVjdFNvdXJjZVJvb3QKLUphdmFfX2RlZmF1bHRfX09wZXJhdGlvbl9fQWJzdHJhY3Q9QWJzdHJhY3QKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXQ9RUpCU2Vzc2lvblR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19Jc1NpbmdsZVRocmVhZD1Jc1NpbmdsZVRocmVhZAotSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXRfX0JvdW5kPUJvdW5kCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0JNUF9FeHRlbmRfQ01QPUJNUF9FeHRlbmRfQ01QCi1KYXZhX19kZWZhdWx0X19Sb2xlX19SZWFkV3JpdGU9UmVhZC9Xcml0ZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fRGVmYXVsdFNlcnZsZXRWZXJzaW9uPURlZmF1bHRTZXJ2bGV0VmVyc2lvbgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX1N0cmljdGZwPVN0cmljdGZwCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Mb2NhbFByZWZpeD1Mb2NhbFByZWZpeAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NDdG9yX1NldF9fcHJpdmF0ZT1wcml2YXRlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldERhdGVIZWFkZXI9U2VydmxldERhdGVIZWFkZXIKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldENvb2tpZT1TZXJ2bGV0Q29va2llCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19EZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZT1EZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wdWJsaWM9cHVibGljCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldF9fcHVibGljPXB1YmxpYwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEhlYWRlck5hbWVzPVNlcnZsZXRIZWFkZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUm9vdERpcj1Sb290RGlyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCUmVlbnRyYW50PUVKQlJlZW50cmFudAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTm90U2hvd1Jvc2VJRERsZz1Ob3RTaG93Um9zZUlERGxnCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Ib21lU3VmZml4PUhvbWVTdWZmaXgKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCUGVyc2lzdGVuY2VUeXBlPUVKQlBlcnNpc3RlbmNlVHlwZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRJc1NlY3VyZT1TZXJ2bGV0SXNTZWN1cmUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3M9RGVmYXVsdF9TZXJ2bGV0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXREYXRlSGVhZGVyPVNlcnZsZXREYXRlSGVhZGVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Mb2NhbEhvbWVQcmVmaXg9TG9jYWxIb21lUHJlZml4Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19EaXNwYXRjaGVyRm9yd2FyZD1EaXNwYXRjaGVyRm9yd2FyZAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0Rpc2FibGVBdXRvU3luYz1EaXNhYmxlQXV0b1N5bmMKLUphdmFfX2RlZmF1bHRfX01vZHVsZVNwZWM9ZGVmYXVsdAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQ29udGFpbmVyPUNvbnRhaW5lcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlckRlZmluZVRhZ0FwcGx5Mz1Vc2VyRGVmaW5lVGFnQXBwbHkzCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVfX0luZGl2aWR1YWxDaGFuZ2VNZ3Q9SW5kaXZpZHVhbENoYW5nZU1ndAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnQXBwbHkyPVVzZXJEZWZpbmVUYWdBcHBseTIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0Rpc3BhdGNoZXJJbmNsdWRlPURpc3BhdGNoZXJJbmNsdWRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnQXBwbHkxPVVzZXJEZWZpbmVUYWdBcHBseTEKLUphdmFfX2RlZmF1bHRfX01vZHVsZVNwZWNfX0NtSWRlbnRpZmljYXRpb249Q21JZGVudGlmaWNhdGlvbgotSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXQ9QmVhblByb3BlcnR5X1NldAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRGlzcGF0Y2hlckluY2x1ZGU9RGlzcGF0Y2hlckluY2x1ZGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0dsb2JhbEltcG9ydHM9R2xvYmFsSW1wb3J0cwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX01ldGhvZEZvckhlYWRlcnM9TWV0aG9kRm9ySGVhZGVycwotSmF2YV9fZGVmYXVsdF9fUm9sZV9fQ29udGFpbmVyQ2xhc3M9Q29udGFpbmVyQ2xhc3MKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0JlYW5QcmVmaXg9QmVhblByZWZpeAotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19SZWFkV3JpdGU9UmVhZC9Xcml0ZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcj1TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZVByZWZpeGVzPVVzZVByZWZpeGVzCi1KYXZhX19kZWZhdWx0X19BdHRyaWJ1dGVSZWFkV3JpdGVfU2V0X19SZWFkXCAmXCBXcml0ZT1SZWFkICYgV3JpdGUKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyPUdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXRfX3Byb3RlY3RlZD1wcm90ZWN0ZWQKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZVJlYWRXcml0ZV9TZXRfX1JlYWRcIE9ubHk9UmVhZCBPbmx5Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcz1NZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJSZWVudHJhbnQ9RUpCUmVlbnRyYW50Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJTZWN1cml0eVJvbGVzPUVKQlNlY3VyaXR5Um9sZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0ZpbmFsPUZpbmFsCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX05hdGl2ZT1OYXRpdmUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJTZXNzaW9uU3luYz1FSkJTZXNzaW9uU3luYwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yQ29va2llPU1ldGhvZEZvckNvb2tpZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0PUN0b3JfU2V0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXROYW1lPVNlcnZsZXROYW1lCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJQZXJzaXN0ZW5jZVR5cGU9RUpCUGVyc2lzdGVuY2VUeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZUhUTUw9R2VuZXJhdGVIVE1MCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXI9U2VydmxldFJlcXVlc3REaXNwYXRjaGVyCi1KYXZhX19kZWZhdWx0X19Sb2xlX19GaW5hbD1GaW5hbAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wcm90ZWN0ZWQ9cHJvdGVjdGVkCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX0VKQkVudmlyb25tZW50UHJvcGVydGllcz1FSkJFbnZpcm9ubWVudFByb3BlcnRpZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fRmluYWw9RmluYWwKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVmdWw9U3RhdGVmdWwKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlRmluYWxpemVyPUdlbmVyYXRlRmluYWxpemVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TcGFjaW5nSXRlbXM9U3BhY2luZ0l0ZW1zCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCQ254RmFjdG9yeT1FSkJDbnhGYWN0b3J5Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19FSkJEVERMb2NhdGlvbj1FSkJEVERMb2NhdGlvbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQ9RUpCVHJhbnNhY3Rpb25UeXBlX1NldAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wdWJsaWM9cHVibGljCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXQ9RUpCVHJhbnNhY3Rpb25UeXBlX1NldAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fU291cmNlQ29udHJvbD1Tb3VyY2VDb250cm9sCi1KYXZhX19kZWZhdWx0X19PcGVyYXRpb25fX0ZpbmFsPUZpbmFsCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJUcmFuc2FjdGlvblR5cGU9RUpCVHJhbnNhY3Rpb25UeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fR2VuZXJhdGVIVE1MPUdlbmVyYXRlSFRNTAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fU2VydmxldERURExvY2F0aW9uPVNlcnZsZXREVERMb2NhdGlvbgotSmF2YV9fZGVmYXVsdF9fUm9sZV9fSW5pdGlhbFZhbHVlPUluaXRpYWxWYWx1ZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0PUVKQlZlcnNpb25fU2V0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRIZWFkZXJOYW1lcz1TZXJ2bGV0SGVhZGVyTmFtZXMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJTZXNzaW9uVHlwZT1FSkJTZXNzaW9uVHlwZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldERhdGVIZWFkZXI9U2VydmxldERhdGVIZWFkZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0RlZmF1bHRFSkJWZXJzaW9uPURlZmF1bHRFSkJWZXJzaW9uCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0U2VjdXJpdHlSb2xlcz1TZXJ2bGV0U2VjdXJpdHlSb2xlcwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQXV0b1N5bmM9QXV0b1N5bmMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0NsYXNzUGF0aD1DbGFzc1BhdGgKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0U2VjdXJpdHlSb2xlcz1TZXJ2bGV0U2VjdXJpdHlSb2xlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldERhdGVIZWFkZXI9U2VydmxldERhdGVIZWFkZXIKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NDdG9yX1NldF9fcGFja2FnZT1wYWNrYWdlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzIuMD0yLjAKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0PUVKQlNlc3Npb25UeXBlX1NldAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVDb2RlPUdlbmVyYXRlQ29kZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTm9DbGFzc0N1c3RvbURsZz1Ob0NsYXNzQ3VzdG9tRGxnCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TdGF0aWM9U3RhdGljCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lSmF2YURvY1RhZ3M9VXNlckRlZmluZUphdmFEb2NUYWdzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3M9RGVmYXVsdF9FSkIKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0WE1MRmlsZVBhdGg9U2VydmxldFhNTEZpbGVQYXRoCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlcj1TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdD1kZWZhdWx0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXM9U2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRDb250ZXh0UmVmPVNlcnZsZXRDb250ZXh0UmVmCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZV9YTUxfREQ9R2VuZXJhdGVfWE1MX0RECi1KYXZhX19kZWZhdWx0X19Sb2xlX19Jc05hdmlnYWJsZT1Jc05hdmlnYWJsZQotSmF2YV9fZGVmYXVsdF9fUm9sZUJlYW5Qcm9wZXJ0eV9TZXRfX05vdFwgQVwgUHJvcGVydHk9Tm90IEEgUHJvcGVydHkKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRmluYWw9RmluYWwKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQ29udGFpbmVyPUNvbnRhaW5lcgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLUphdmFfX2RlZmF1bHRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQmVhbj1CZWFuCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRDb250ZXh0UmVmPVNlcnZsZXRDb250ZXh0UmVmCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRDb250ZW50VHlwZT1TZXJ2bGV0Q29udGVudFR5cGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NEZWZhdWx0U2luY2U9SmF2YWRvY0RlZmF1bHRTaW5jZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY1NpbmNlPUphdmFkb2NTaW5jZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRTZWN1cml0eVJvbGVzPVNlcnZsZXRTZWN1cml0eVJvbGVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldF9fQ29udGFpbmVyPUNvbnRhaW5lcgotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fU0NDU2VsZWN0ZWQ9U0NDU2VsZWN0ZWQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlZlcnNpb249RUpCVmVyc2lvbgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZUhUTUw9R2VuZXJhdGVIVE1MCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3Rvcj1HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSW5zdGFuY2VWYXJpYWJsZVByZWZpeD1JbnN0YW5jZVZhcmlhYmxlUHJlZml4Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWZ1bD1TdGF0ZWZ1bAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wcm90ZWN0ZWQ9cHJvdGVjdGVkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyTmFtZXM9U2VydmxldEhlYWRlck5hbWVzCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzPU1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldGdldEluZm89U2VydmxldGdldEluZm8KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0NvbnN0cnVjdG9ySXM9Q29uc3RydWN0b3JJcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVfWE1MX0REPUdlbmVyYXRlX1hNTF9ERAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19NZXRob2RGb3JIZWFkZXJzPU1ldGhvZEZvckhlYWRlcnMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0Rpc2FibGVBdXRvU3luYz1EaXNhYmxlQXV0b1N5bmMKLUphdmFfX2RlZmF1bHRfX1JvbGVCZWFuUHJvcGVydHlfU2V0X19Db25zdHJhaW5lZD1Db25zdHJhaW5lZAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCUmVlbnRyYW50PUVKQlJlZW50cmFudAotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wcm90ZWN0ZWQ9cHJvdGVjdGVkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SW50SGVhZGVyPVNlcnZsZXRJbnRIZWFkZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0NvbnN0cnVjdG9ySXM9Q29uc3RydWN0b3JJcwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCVmVyc2lvbl9TZXRfXzIuMD0yLjAKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fU2VydmxldElzU2VjdXJlPVNlcnZsZXRJc1NlY3VyZQotSmF2YV9fZGVmYXVsdF9fTW9kdWxlQm9keV9fQ21JZGVudGlmaWNhdGlvbj1DbUlkZW50aWZpY2F0aW9uCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZT1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZQotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19HZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXM9R2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlRyYW5zYWN0aW9uVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCUmVmZXJlbmNlcz1FSkJSZWZlcmVuY2VzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19TaG93Q29kZWdlbkRsZz1TaG93Q29kZWdlbkRsZwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUHJpbWFyeUtleVByZWZpeD1QcmltYXJ5S2V5UHJlZml4Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCWE1MRmlsZVBhdGg9RUpCWE1MRmlsZVBhdGgKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1JlbW90ZVByZWZpeD1SZW1vdGVQcmVmaXgKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NOdW1Bc3Rlcmlza3M9SmF2YWRvY051bUFzdGVyaXNrcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fTWV0aG9kRm9yQ29va2llPU1ldGhvZEZvckNvb2tpZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1JlYWRPbmx5PVJlYWRPbmx5Ci1KYXZhX19kZWZhdWx0X19Sb2xlX19UcmFuc2llbnQ9VHJhbnNpZW50Ci1KYXZhX19kZWZhdWx0X19Sb2xlQmVhblByb3BlcnR5X1NldF9fU2ltcGxlPVNpbXBsZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TdGF0aWM9U3RhdGljCi1KYXZhX19kZWZhdWx0X19DbGFzc19fR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcj1HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19WTT1WTQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFNlY3VyaXR5Um9sZXM9U2VydmxldFNlY3VyaXR5Um9sZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMS54PTEueAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fVXNlVGFicz1Vc2VUYWJzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcz1TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1N0YXRpYz1TdGF0aWMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCVHJhbnNhY3Rpb25UeXBlPUVKQlRyYW5zYWN0aW9uVHlwZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQ2xhc3NWYXJpYWJsZVByZWZpeD1DbGFzc1ZhcmlhYmxlUHJlZml4Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19FSkJTZWN1cml0eVJvbGVzPUVKQlNlY3VyaXR5Um9sZXMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZW50VHlwZT1TZXJ2bGV0Q29udGVudFR5cGUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdUZXh0Mz1Vc2VyRGVmaW5lVGFnVGV4dDMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdUZXh0Mj1Vc2VyRGVmaW5lVGFnVGV4dDIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX1VzZXJEZWZpbmVUYWdUZXh0MT1Vc2VyRGVmaW5lVGFnVGV4dDEKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcj1HZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0Vk1UeXBlX19JQk09SUJNCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldD1FSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ci1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJTZWN1cml0eVJvbGVzPUVKQlNlY3VyaXR5Um9sZXMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0phdmFkb2NEZWZhdWx0QXV0aG9yPUphdmFkb2NEZWZhdWx0QXV0aG9yCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXQ9RUpCUGVyc2lzdGVuY2VUeXBlX1NldAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fQk1QX0V4dGVuZF9DTVA9Qk1QX0V4dGVuZF9DTVAKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlBlcnNpc3RlbmNlVHlwZT1FSkJQZXJzaXN0ZW5jZVR5cGUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3Rvcj1HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVsZXNzPVN0YXRlbGVzcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJTZXNzaW9uVHlwZV9TZXRfX1N0YXRlZnVsPVN0YXRlZnVsCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVsZXNzPVN0YXRlbGVzcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVGaW5hbGl6ZXI9R2VuZXJhdGVGaW5hbGl6ZXIKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NDdG9yX1NldF9fcGFja2FnZT1wYWNrYWdlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Sb3NlRGVmYXVsdENvbW1lbnRTdHlsZT1Sb3NlRGVmYXVsdENvbW1lbnRTdHlsZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3Rvcj1HZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyPUdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJWZXJzaW9uPUVKQlZlcnNpb24KLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXI9R2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aD1TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJOYW1lSW5KQVI9RUpCTmFtZUluSkFSCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Q29udGV4dFJlZj1TZXJ2bGV0Q29udGV4dFJlZgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0PUVKQlNlc3Npb25UeXBlX1NldAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlBlcnNpc3RlbmNlVHlwZV9TZXRfX0JlYW49QmVhbgotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMS54PTEueAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fUmVmZXJlbmNlQ2xhc3NwYXRoPVJlZmVyZW5jZUNsYXNzcGF0aAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Sb2xlX19JbmRpdmlkdWFsQ2hhbmdlTWd0PUluZGl2aWR1YWxDaGFuZ2VNZ3QKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRDb250ZXh0UmVmPVNlcnZsZXRDb250ZXh0UmVmCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJOYW1lSW5KQVI9RUpCTmFtZUluSkFSCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycz1NZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTWF4TnVtQ2hhcnM9TWF4TnVtQ2hhcnMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZV9fVHJhbnNpZW50PVRyYW5zaWVudAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXM9U2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFJlcXVlc3REaXNwYXRjaGVyPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fUmVhZE9ubHk9UmVhZE9ubHkKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0hvbWVQcmVmaXg9SG9tZVByZWZpeAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19Db25zdHJ1Y3RvcklzPUNvbnN0cnVjdG9ySXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldF9fQ29udGFpbmVyPUNvbnRhaW5lcgotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCVHJhbnNhY3Rpb25UeXBlPUVKQlRyYW5zYWN0aW9uVHlwZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRIZWFkZXI9U2VydmxldEhlYWRlcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19SZWFkT25seT1SZWFkT25seQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc0N0b3JfU2V0X19wYWNrYWdlPXBhY2thZ2UKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJWZXJzaW9uX1NldF9fMi4wPTIuMAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldD1FSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzPVNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzCi1KYXZhX19kZWZhdWx0X19DbGFzc19fRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzPUVKQkVudmlyb25tZW50UHJvcGVydGllcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEhlYWRlcj1TZXJ2bGV0SGVhZGVyCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Z2V0SW5mbz1TZXJ2bGV0Z2V0SW5mbwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0Z2V0SW5mbz1TZXJ2bGV0Z2V0SW5mbwotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fTG9jYWxTdWZmaXg9TG9jYWxTdWZmaXgKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX09wZW5CcmFjZU1ldGhvZFN0eWxlPU9wZW5CcmFjZU1ldGhvZFN0eWxlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19FSkJDbXBGaWVsZD1FSkJDbXBGaWVsZAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX01ldGhvZEZvckNvb2tpZT1NZXRob2RGb3JDb29raWUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19CZWFuPUJlYW4KLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVsZXNzPVN0YXRlbGVzcwotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldE5hbWU9U2VydmxldE5hbWUKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RFZGl0b3JUeXBlPUVkaXRvclR5cGUKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyPUdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplcgotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fR2VuZXJhdGVDb2RlPUdlbmVyYXRlQ29kZQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fR2VuZXJhdGVSb3NlSUQ9R2VuZXJhdGVSb3NlSUQKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQlhNTEZpbGVQYXRoPUVKQlhNTEZpbGVQYXRoCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0PUVKQlRyYW5zYWN0aW9uVHlwZV9TZXQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCWE1MRmlsZVBhdGg9RUpCWE1MRmlsZVBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQkVudmlyb25tZW50UHJvcGVydGllcz1FSkJFbnZpcm9ubWVudFByb3BlcnRpZXMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0xvY2FsSG9tZVN1ZmZpeD1Mb2NhbEhvbWVTdWZmaXgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0Rpc2FibGVBdXRvU3luYz1EaXNhYmxlQXV0b1N5bmMKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJUcmFuc2FjdGlvblR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnTmFtZTM9VXNlckRlZmluZVRhZ05hbWUzCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnTmFtZTI9VXNlckRlZmluZVRhZ05hbWUyCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19Vc2VyRGVmaW5lVGFnTmFtZTE9VXNlckRlZmluZVRhZ05hbWUxCi1KYXZhX19kZWZhdWx0X19DbGFzc0VKQlZlcnNpb25fU2V0PUVKQlZlcnNpb25fU2V0Ci1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcz1TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzPUh0dHBfU2VydmxldAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFhNTEZpbGVQYXRoPVNlcnZsZXRYTUxGaWxlUGF0aAotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzQ3Rvcl9TZXQ9Q3Rvcl9TZXQKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0VkaXRvcj1FZGl0b3IKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX09wZW5CcmFjZUNsYXNzU3R5bGU9T3BlbkJyYWNlQ2xhc3NTdHlsZQotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldF9fQm91bmQ9Qm91bmQKLUphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXQ9Q3Rvcl9TZXQKLUphdmFfX2RlZmF1bHRfX01vZHVsZVNwZWNfX0NvcHlyaWdodE5vdGljZT1Db3B5cmlnaHROb3RpY2UKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZT1kZWZhdWx0Ci1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldD1SZWFkL1dyaXRlX1NldAotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fSmF2YWRvY1ZlcnNpb249SmF2YWRvY1ZlcnNpb24KLUphdmFfX2RlZmF1bHRfX1Byb2plY3RWTVR5cGU9Vk1UeXBlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldEludEhlYWRlcj1TZXJ2bGV0SW50SGVhZGVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCUGVyc2lzdGVuY2VUeXBlX1NldD1FSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ci1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoPVNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1JlYWRPbmx5PVJlYWRPbmx5Ci1KYXZhX19kZWZhdWx0X19Sb2xlUmVhZFdyaXRlX1NldF9fUmVhZFwgJlwgV3JpdGU9UmVhZCAmIFdyaXRlCi1KYXZhX19kZWZhdWx0X19Nb2R1bGVCb2R5PWRlZmF1bHQKLUphdmFfX2RlZmF1bHRfX0NsYXNzQ3Rvcl9TZXRfX3BhY2thZ2U9cGFja2FnZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0lzU2luZ2xlVGhyZWFkPUlzU2luZ2xlVGhyZWFkCi1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19HZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lPUdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19HZW5lcmF0ZUNvZGU9R2VuZXJhdGVDb2RlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnM9TWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMKLUphdmFfX2RlZmF1bHRfX0NsYXNzPWRlZmF1bHQKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0N0b3JfU2V0X19wcml2YXRlPXByaXZhdGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yPUdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0SXNTZWN1cmU9U2VydmxldElzU2VjdXJlCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX2RlZmF1bHRfX1JvbGVfX1ZvbGF0aWxlPVZvbGF0aWxlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJTZXNzaW9uU3luYz1FSkJTZXNzaW9uU3luYwotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJTZWN1cml0eVJvbGVzPUVKQlNlY3VyaXR5Um9sZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fRUpCU2Vzc2lvblN5bmM9RUpCU2Vzc2lvblN5bmMKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0FzdGVyaXNrQ29tbWVudFN0eWxlPUFzdGVyaXNrQ29tbWVudFN0eWxlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCU2Vzc2lvblR5cGVfU2V0X19TdGF0ZWZ1bD1TdGF0ZWZ1bAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU2VydmxldEludEhlYWRlcj1TZXJ2bGV0SW50SGVhZGVyCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzRUpCVHJhbnNhY3Rpb25UeXBlX1NldD1FSkJUcmFuc2FjdGlvblR5cGVfU2V0Ci1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX01ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzPU1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19GaW5hbD1GaW5hbAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCUmVlbnRyYW50PUVKQlJlZW50cmFudAotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlZlcnNpb25fU2V0X18xLng9MS54Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhQ29tbWVudFN0eWxlPUphdmFDb21tZW50U3R5bGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQlJlZmVyZW5jZXM9RUpCUmVmZXJlbmNlcwotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldF9fU2ltcGxlPVNpbXBsZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGU9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGUKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0dlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXI9R2VuZXJhdGVTdGF0aWNJbml0aWFsaXplcgotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19TZXJ2bGV0SGVhZGVyPVNlcnZsZXRIZWFkZXIKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc0VKQlZlcnNpb25fU2V0PUVKQlZlcnNpb25fU2V0Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19EZWZhdWx0QXR0cmlidXRlRGF0YVR5cGU9RGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlCi1KYXZhX19IdHRwX1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Z2V0SW5mbz1TZXJ2bGV0Z2V0SW5mbwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRUpCQ21wRmllbGQ9RUpCQ21wRmllbGQKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0SGVhZGVyTmFtZXM9U2VydmxldEhlYWRlck5hbWVzCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0TmFtZT1TZXJ2bGV0TmFtZQotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXM9U2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMKLUphdmFfX2RlZmF1bHRfX0F0dHJpYnV0ZUJlYW5Qcm9wZXJ0eV9TZXQ9QmVhblByb3BlcnR5X1NldAotSmF2YV9fZGVmYXVsdF9fT3BlcmF0aW9uX19TeW5jaHJvbml6ZWQ9U3luY2hyb25pemVkCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0Q29udGVudFR5cGU9U2VydmxldENvbnRlbnRUeXBlCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19FSkJTZXNzaW9uVHlwZT1FSkJTZXNzaW9uVHlwZQotSmF2YV9fRGVmYXVsdF9FSkJfX0NsYXNzX19FSkJTZXNzaW9uVHlwZT1FSkJTZXNzaW9uVHlwZQotSmF2YV9fZGVmYXVsdF9fTW9kdWxlQm9keV9fQ29weXJpZ2h0Tm90aWNlPUNvcHlyaWdodE5vdGljZQotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0ZpbmFsPUZpbmFsCi1KYXZhX19EZWZhdWx0X1NlcnZsZXRfX0NsYXNzX19TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzPVNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMKLUphdmFfX0RlZmF1bHRfRUpCX19DbGFzc19fR2VuZXJhdGVDb2RlPUdlbmVyYXRlQ29kZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fRUpCWE1MRmlsZVBhdGg9RUpCWE1MRmlsZVBhdGgKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RfX0dlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jPUdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlcj1TZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIKLUphdmFfX2RlZmF1bHRfX1Byb2plY3RFZGl0b3JUeXBlX19CdWlsdEluPUJ1aWx0SW4KLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX1NlcnZsZXRJbml0UGFyYW1ldGVyPVNlcnZsZXRJbml0UGFyYW1ldGVyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fR2VuZXJhdGVfWE1MX0REPUdlbmVyYXRlX1hNTF9ERAotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0Rpc2FibGVBdXRvU3luYz1EaXNhYmxlQXV0b1N5bmMKLUphdmFfX2RlZmF1bHRfX0NsYXNzX19TZXJ2bGV0SW5pdFBhcmFtZXRlcj1TZXJ2bGV0SW5pdFBhcmFtZXRlcgotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlQmVhblByb3BlcnR5X1NldF9fTm90XCBBXCBQcm9wZXJ0eT1Ob3QgQSBQcm9wZXJ0eQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc19fU3RyaWN0ZnA9U3RyaWN0ZnAKLUphdmFfX0RlZmF1bHRfU2VydmxldF9fQ2xhc3NfX0VKQkNueEZhY3Rvcnk9RUpCQ254RmFjdG9yeQotSmF2YV9fZGVmYXVsdF9fUHJvamVjdF9fQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzPUNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0NvbnN0cnVjdG9ySXM9Q29uc3RydWN0b3JJcwotSmF2YV9fZGVmYXVsdF9fUm9sZV9fR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzPUdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcwotSmF2YV9fRGVmYXVsdF9TZXJ2bGV0X19DbGFzc19fRGlzcGF0Y2hlckZvcndhcmQ9RGlzcGF0Y2hlckZvcndhcmQKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NfX0VKQkNueEZhY3Rvcnk9RUpCQ254RmFjdG9yeQotSmF2YV9fZGVmYXVsdF9fQXR0cmlidXRlX19Qcm9wZXJ0eVR5cGU9UHJvcGVydHlUeXBlCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1N0cmljdGZwPVN0cmljdGZwCi1KYXZhX19EZWZhdWx0X0VKQl9fQ2xhc3NfX1NlcnZsZXRYTUxGaWxlUGF0aD1TZXJ2bGV0WE1MRmlsZVBhdGgKLUphdmFfX0h0dHBfU2VydmxldF9fQ2xhc3NFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0X19Db250YWluZXI9Q29udGFpbmVyCi1KYXZhX19kZWZhdWx0X19DbGFzc19fU2VydmxldENvbnRlbnRUeXBlPVNlcnZsZXRDb250ZW50VHlwZQotSmF2YV9fSHR0cF9TZXJ2bGV0X19DbGFzc0VKQlNlc3Npb25UeXBlX1NldF9fU3RhdGVsZXNzPVN0YXRlbGVzcwotSmF2YV9fZGVmYXVsdF9fQ2xhc3NfX0JNUF9FeHRlbmRfQ01QPUJNUF9FeHRlbmRfQ01QCi09Ci1KYXZhX19kZWZhdWx0X19Qcm9qZWN0X19KYXZhZG9jQXV0aG9yPUphdmFkb2NBdXRob3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL1ZpcnR1YWxQYXRoQVBJLmVteCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL1ZpcnR1YWxQYXRoQVBJLmVteApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlMDIzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2RlbC9WaXJ0dWFsUGF0aEFQSS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6TW9kZWwgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9Ob3RhdGlvbiIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMS4wLjAvVU1MIiB4bWxuczp1bWxub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMC9VbWxub3RhdGlvbiIgeG1pOmlkPSJfWFAya2NMcXZFZG1Ud0xjTGtwQUhQdyIgbmFtZT0iVmlydHVhbFBhdGhBUEkiIGFwcGxpZWRQcm9maWxlPSJfWFNpRkFMcXZFZG1Ud0xjTGtwQUhQdyBfWFVQOFFMcXZFZG1Ud0xjTGtwQUhQdyBfWFUwa0FMcXZFZG1Ud0xjTGtwQUhQdyBfWFdvaDRMcXZFZG1Ud0xjTGtwQUhQdyBfWFpzYzhMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFAya2NicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfWFAya2NycXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9YUDJrY3JxdkVkbVR3TGNMa3BBSFB3IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeFBtc0xzYUVkbXJtY2lsMUJ4MDR3IF9zeFBtdUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4YnpfYnNhRWRtcm1jaWwxQngwNHcgX3N4aDZrcnNhRWRtcm1jaWwxQngwNHcgX3N4b0JPTHNhRWRtcm1jaWwxQngwNHcgX3N4ME9jTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc01HU1FMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc01HU1Fic2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNR1NRcnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTUdTUTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc01HU1JMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NNM0hRTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc00zSFFic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zTTlONExzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NNOU40YnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc005TjRyc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc005TjQ3c2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc0xuS0Vic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc0xuS0Vyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMzE4IiB5PSIyNTQ0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdVTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZUVkZ2VzPSJfc3hWdFVic2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0RWRnZXM9Il9zeHVIMExzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdVN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfc2tFR1ZMc2FFZG1ybWNpbDFCeDA0dyIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdWYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdWcnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdWN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdXTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2tFR1dic2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrRUdXcnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc2tFR1c3c2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NrS004THNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NrS004YnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfc2tFR1Vic2FFZG1ybWNpbDFCeDA0dyIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9za0VHVXJzYUVkbXJtY2lsMUJ4MDR3IiB4PSI4MjY4IiB5PSIxNDYyOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3Uwc0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2VFZGdlcz0iX3N4VnRXTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldEVkZ2VzPSJfc3h1SDRMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwczdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NrdTB0THNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdHJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NrdTB1YnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdXJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NrdTB1N3NhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9za3UwdkxzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9za3UwdmJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NrdTBzYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVmZXJlbmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc2t1MHNyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMjAwMzQiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc2wtSzBMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbC1LMDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NsLUsxTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NsLUsxYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NtRVJjTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NtRVJjYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc21FUmNyc2FFZG1ybWNpbDFCeDA0dyIgZmlsdGVyaW5nPSJNYW51YWwiPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJ2aXpyZWY6Ly8vI2pmaWVsZF52Y29yZS50YXJnZXQ9dW1sMi5Qcm9wZXJ0eV5uYW1lPW5hbWVbanNyY3R5cGVebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9dG9TdHJpbmdbanNyY3R5cGVebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9aGFzaENvZGVbanNyY3R5cGVebmFtZT1Db21wb25lbnRIYW5kbGVbamN1Xm5hbWU9Q29tcG9uZW50SGFuZGxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9zdHlsZXM+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc21FUmM3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zbUVSZExzYUVkbXJtY2lsMUJ4MDR3IiBmaWx0ZXJpbmc9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6T3BlcmF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ptZXRob2RedmNvcmUudGFyZ2V0PXVtbDIuT3BlcmF0aW9uXm5hbWU9Q29tcG9uZW50SGFuZGxlXnNpZ249KFFJUHJvamVjdCUzYlFTdHJpbmclM2IpVltqc3JjdHlwZV5uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zbUVSZGJzYUVkbXJtY2lsMUJ4MDR3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zbUVSZHJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudEhhbmRsZVtqY3VebmFtZT1Db21wb25lbnRIYW5kbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc25PSUFMc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NuT0lBYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3NsLUswYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50SGFuZGxlW2pjdV5uYW1lPUNvbXBvbmVudEhhbmRsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NsLUswcnNhRWRtcm1jaWwxQngwNHciIHg9IjEzNjc0IiB5PSIyNTQ0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxTFZZTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZUVkZ2VzPSJfc3hiel9ic2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0RWRnZXM9Il9zeG9CTUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxTFZZN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zcUxWWkxzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FMVlpic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcUxWWnJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxUmNBTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3FSY0Fic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zcVJjQXJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zcVJjQTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxUmNCTHNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NxUmNCYnNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NxUmNCcnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9zcUxWWWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc3FMVllyc2FFZG1ybWNpbDFCeDA0dyIgeD0iMTU5MCIgeT0iMTQ2MjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeGg2a3JzYUVkbXJtY2lsMUJ4MDR3IF9zeG9CTUxzYUVkbXJtY2lsMUJ4MDR3IF9zeG9CT0xzYUVkbXJtY2lsMUJ4MDR3IF9zeHVIMExzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4UG11THNhRWRtcm1jaWwxQngwNHcgX3N4VnRVYnNhRWRtcm1jaWwxQngwNHcgX3N4ME9lTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHdMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zcTJEd2JzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHdyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHc3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHhMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHhic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zcTJEeHJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHg3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zcTJEeUxzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3EyRHlic2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3EyRHlyc2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9zcXY5SWJzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NxdjlJcnNhRWRtcm1jaWwxQngwNHciIHg9Ijg1ODYiIHk9IjI1NDQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFlMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeHVIMkxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBZN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3NzZDBaTHNhRWRtcm1jaWwxQngwNHciIHdpZHRoPSI1MzAiIGhlaWdodD0iNTMwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwWmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMFpyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBaN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zc2QwYUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NzZDBhYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3NkMGFyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zc2QwYTdzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3NzZDBiTHNhRWRtcm1jaWwxQngwNHciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX3NzZDBiYnNhRWRtcm1jaWwxQngwNHciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDbGFzc2lmaWVyU3R5bGUiIHhtaTppZD0iX3NzZDBZYnNhRWRtcm1jaWwxQngwNHciIHNob3dTdGVyZW90eXBlPSJMYWJlbCIgdXNlQ2xhc3NpZmllclNoYXBlPSJ0cnVlIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NzZDBZcnNhRWRtcm1jaWwxQngwNHciIHg9IjIwMDM0IiB5PSIxMDgxMiIgd2lkdGg9IjQ4NzEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWNMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlRWRnZXM9Il9zeHVINExzYUVkbXJtY2lsMUJ4MDR3IF9zeDBPY0xzYUVkbXJtY2lsMUJ4MDR3IF9zeDBPZUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXRFZGdlcz0iX3N4UG1zTHNhRWRtcm1jaWwxQngwNHcgX3N4VnRXTHNhRWRtcm1jaWwxQngwNHcgX3N4dUgyTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWM3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9zdFBRZExzYUVkbXJtY2lsMUJ4MDR3IiB3aWR0aD0iNTMwIiBoZWlnaHQ9IjUzMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWRic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWRyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWQ3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RQUWVMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zdFBRZWJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RWWEVMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9zdFZYRWJzYUVkbXJtY2lsMUJ4MDR3Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3RWWEVyc2FFZG1ybWNpbDFCeDA0dyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfc3RWWEU3c2FFZG1ybWNpbDFCeDA0dyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ2xhc3NpZmllclN0eWxlIiB4bWk6aWQ9Il9zdFBRY2JzYUVkbXJtY2lsMUJ4MDR3IiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiIHVzZUNsYXNzaWZpZXJTaGFwZT0idHJ1ZSIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3N0UFFjcnNhRWRtcm1jaWwxQngwNHciIHg9IjEzNjc0IiB5PSI5MjIyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9YUDJrYzdxdkVkbVR3TGNMa3BBSFB3Ii8+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hQbXNMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc3RQUWNMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtczdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtdGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hQbXQ3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG10cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeFBtdExzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeFBtc2JzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hQbXNyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbMzI1NCwgNDQ0NSwgLTk3NjMsIDEwMDVdJFs2NzczLCA0NDQ1LCAtNjI0NCwgMTAwNV0kWzY3NzMsIDQzOTMsIC02MjQ0LCA5NTNdJFsxMDcxNiwgNDM5MywgLTIzMDEsIDk1M10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hQbXVMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtdTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeFBtdmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hWdFVMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4UG12cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeFBtdkxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeFBtdWJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hQbXVyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbMzI1NCwgLTMxNDgsIC0zOTk2LCAtNTI5XSRbNTMxOCwgLTMxNDgsIC0xOTMyLCAtNTI5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFZ0VWJzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9za0VHVUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zcXY5SUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4VnRWTHNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4VnRWcnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4VnRWN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGb2xkZXJbamN1Xm5hbWU9SVZpcnR1YWxGb2xkZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hWdFZic2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hWdFVyc2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hWdFU3c2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbMTMyLCAtMTA4NSwgLTI2NSwgMTA3OTVdJFsxMzIsIC04Njc4LCAtMjY1LCAzMjAyXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeFZ0V0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9za3Uwc0xzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4Yno4THNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4Yno4cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4Yno5THNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4Yno4N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hiejhic2FFZG1ybWNpbDFCeDA0dyIgeD0iLTk4IiB5PSIzMzgiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4VnRXYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4VnRXcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0zMTc1LCA1ODMsIDM3NTgsIC02MDMyXSRbLTQxODEsIDU4MywgMjc1MiwgLTYwMzJdJFstNDE4MSwgNDU1MSwgMjc1MiwgLTIwNjRdJFstNDY1NywgNDU1MSwgMjI3NiwgLTIwNjRdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4YnpfYnNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NxTFZZTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NMbktFTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hiMEFMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNmtMc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNmtic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeGIwQWJzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeGJ6X3JzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeGJ6XzdzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9Ils3NDEsIC0xMDU4LCAtMjE0MywgMTUyMTRdJFs3NDEsIC0xMDQ3OCwgLTIxNDMsIDU3OTRdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4aDZrcnNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NxdjlJTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NMbktFTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNmxic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hoNmw3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4aDZtYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeGg2bUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hoNmxyc2FFZG1ybWNpbDFCeDA0dyIgeD0iODEiIHk9Ii0xMDcwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeGg2azdzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3hoNmxMc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbMTQ4MSwgLTMxNzUsIDIzODEsIDc0ODhdJFsxNDgxLCAtNDg2OSwgMjM4MSwgNTc5NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hvQk1Mc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc3FMVllMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CTTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CTmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4b0JON3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZpbGVbamN1Xm5hbWU9SVZpcnR1YWxGaWxlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hvQk5yc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRmlsZVtqY3VebmFtZT1JVmlydHVhbEZpbGUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3hvQk5Mc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3hvQk1ic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxGaWxlW2pjdV5uYW1lPUlWaXJ0dWFsRmlsZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeG9CTXJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlstMTU4NywgMzIwMiwgNTM3MiwgLTY3NzNdJFstMTU4NywgNDE1NCwgNTM3MiwgLTU4MjFdJFstMjkxMCwgNDE1NCwgNDA0OSwgLTU4MjFdJFstMjkxMCwgOTk0OCwgNDA0OSwgLTI3XSRbLTQ5NzQsIDk5NDgsIDE5ODUsIC0yN10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3hvQk9Mc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc0xuS0VMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CTzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeG9CUGJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3hvQlByc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpHZW5lcmFsaXphdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqZ2VuXnZjb3JlLnRhcmdldD11bWwyLkdlbmVyYWxpemF0aW9uW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4b0JQTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4b0JPYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeG9CT3JzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlstODAsIC0zMTc1LCA4MjAsIDc0ODhdJFstODAsIC00ODY5LCA4MjAsIDU3OTRdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX3N4dUgwTHNhRWRtcm1jaWwxQngwNHciIHNvdXJjZT0iX3NxdjlJTHNhRWRtcm1jaWwxQngwNHciIHRhcmdldD0iX3NrRUdVTHNhRWRtcm1jaWwxQngwNHciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDA3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDFic2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDE3c2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDFyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbnRhaW5lcltqY3VebmFtZT1JVmlydHVhbENvbnRhaW5lci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsRm9sZGVyW2pjdV5uYW1lPUlWaXJ0dWFsRm9sZGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zeHVIMUxzYUVkbXJtY2lsMUJ4MDR3IiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9zeHVIMGJzYUVkbXJtY2lsMUJ4MDR3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbEZvbGRlcltqY3VebmFtZT1JVmlydHVhbEZvbGRlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeHVIMHJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlstOTc5LCAzMjAyLCAtOTAwLCAtNjc3M10kWy05NzksIDg4OTAsIC05MDAsIC0xMDg1XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeHVIMkxzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zc2QwWUxzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUgyN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUgzYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeHVIMzdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlGbGV4aWJsZVByb2plY3RbamN1Xm5hbWU9SUZsZXhpYmxlUHJvamVjdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3h1SDNyc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SUZsZXhpYmxlUHJvamVjdFtqY3VebmFtZT1JRmxleGlibGVQcm9qZWN0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4dUgzTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4dUgyYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JRmxleGlibGVQcm9qZWN0W2pjdV5uYW1lPUlGbGV4aWJsZVByb2plY3QuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeHVIMnJzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlstMSwgMzIwMSwgLTc2OCwgLTQxNTVdJFs3NjcsIDQ3ODksIDAsIC0yNTY3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeHVINExzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9za3Uwc0xzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUg0N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUg1YnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUg1N3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4dUg1cnNhRWRtcm1jaWwxQngwNHciIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlZmVyZW5jZVtqY3VebmFtZT1JVmlydHVhbFJlZmVyZW5jZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfc3h1SDVMc2FFZG1ybWNpbDFCeDA0dyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfc3h1SDRic2FFZG1ybWNpbDFCeDA0dyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZWZlcmVuY2VbamN1Xm5hbWU9SVZpcnR1YWxSZWZlcmVuY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfc3h1SDRyc2FFZG1ybWNpbDFCeDA0dyIgcG9pbnRzPSJbMjI3NiwgLTEzNDksIC00NjU3LCA1MjY2XSRbMzEyNSwgLTEzNDksIC0zODA4LCA1MjY2XSRbMzEyNSwgLTU1MDMsIC0zODA4LCAxMTEyXSRbMzEyNSwgLTU1MzAsIC0zODA4LCAxMDg1XSRbMzc1OCwgLTU1MzAsIC0zMTc1LCAxMDg1XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9zeDBPY0xzYUVkbXJtY2lsMUJ4MDR3IiBzb3VyY2U9Il9zdFBRY0xzYUVkbXJtY2lsMUJ4MDR3IiB0YXJnZXQ9Il9zTG5LRUxzYUVkbXJtY2lsMUJ4MDR3Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9jN3NhRWRtcm1jaWwxQngwNHciIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3N4ME9kYnNhRWRtcm1jaWwxQngwNHciIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDBPZDdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxSZXNvdXJjZVtqY3VebmFtZT1JVmlydHVhbFJlc291cmNlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfc3gwT2Ryc2FFZG1ybWNpbDFCeDA0dyIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb21wb25lbnRbamN1Xm5hbWU9SVZpcnR1YWxDb21wb25lbnQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JVmlydHVhbFJlc291cmNlW2pjdV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2UuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4ME9kTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4ME9jYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsUmVzb3VyY2VbamN1Xm5hbWU9SVZpcnR1YWxSZXNvdXJjZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zeDBPY3JzYUVkbXJtY2lsMUJ4MDR3IiBwb2ludHM9IlstMjI3NSwgMTc5OSwgMTA3NDIsIDUyMzldJFstOTc2MywgMTc5OSwgMzI1NCwgNTIzOV0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfc3gwT2VMc2FFZG1ybWNpbDFCeDA0dyIgc291cmNlPSJfc3RQUWNMc2FFZG1ybWNpbDFCeDA0dyIgdGFyZ2V0PSJfc3F2OUlMc2FFZG1ybWNpbDFCeDA0dyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDBPZTdzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDBPZmJzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9zeDZWRUxzYUVkbXJtY2lsMUJ4MDR3IiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6R2VuZXJhbGl6YXRpb24iIGhyZWY9InZpenJlZjovLy8jamdlbl52Y29yZS50YXJnZXQ9dW1sMi5HZW5lcmFsaXphdGlvbltqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50W2pjdV5uYW1lPUlWaXJ0dWFsQ29tcG9uZW50LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SVZpcnR1YWxDb250YWluZXJbamN1Xm5hbWU9SVZpcnR1YWxDb250YWluZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXNbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3N4ME9mTHNhRWRtcm1jaWwxQngwNHciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3N4ME9lYnNhRWRtcm1jaWwxQngwNHciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkdlbmVyYWxpemF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2pnZW5edmNvcmUudGFyZ2V0PXVtbDIuR2VuZXJhbGl6YXRpb25banNyY3R5cGVebmFtZT1JVmlydHVhbENvbXBvbmVudFtqY3VebmFtZT1JVmlydHVhbENvbXBvbmVudC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlc1tqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyW2pjdV5uYW1lPUlWaXJ0dWFsQ29udGFpbmVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3N4ME9lcnNhRWRtcm1jaWwxQngwNHciIHBvaW50cz0iWy0yMjc1LCAtMTIxNywgMzQ5MiwgNDg0Ml0kWy00NzA5LCAtMTIxNywgMTA1OCwgNDg0Ml0kWy00NzA5LCAtMjg1NywgMTA1OCwgMzIwMl0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9YU2lGQUxxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1hTaUZBYnF2RWRtVHdMY0xrcEFIUHciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9YU2lGQXJxdkVkbVR3TGNMa3BBSFB3IiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hVUDhRTHF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFVQOFFicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hVb1d3THF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9YVTBrQUxxdkVkbVR3TGNMa3BBSFB3Ij4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1hVMGtBYnF2RWRtVHdMY0xrcEFIUHciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9YVTBrQXJxdkVkbVR3TGNMa3BBSFB3IiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hXb2g0THF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFdvaDRicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hXb2g0cnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX1hac2M4THF2RWRtVHdMY0xrcEFIUHciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfWFpzYzhicXZFZG1Ud0xjTGtwQUhQdyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX1hac2M4cnF2RWRtVHdMY0xrcEFIUHciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfWGlTWVFMcXZFZG1Ud0xjTGtwQUhQdyI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfRWZSWm9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il9XWnZIUUxzY0VkbXJtY2lsMUJ4MDR3IiBuYW1lPSJFbnVtZXJhdGlvbjEiLz4KLTwvdW1sOk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmUuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2FmYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImNvbXBvbmVudGNvcmUiCi0gICAgbnNVUkk9ImNvbXBvbmVudGNvcmUueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrYmVuY2hDb21wb25lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbXBvbmVudFJlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9Db21wb25lbnRSZXNvdXJjZS9jb21wb25lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tcG9uZW50VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0NvbXBvbmVudFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZWRDb21wb25lbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZWRDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJvcGVydHkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFSZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9uZW50UmVzb3VyY2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2VQYXRoIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icnVudGltZVBhdGgiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JUGF0aCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdXNpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbXBvbmVudCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtiZW5jaENvbXBvbmVudCIgZU9wcG9zaXRlPSIjLy9Xb3JrYmVuY2hDb21wb25lbnQvcmVzb3VyY2VzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVHlwZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IklQYXRoIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0ia2V5d29yZHMiPgotICAgICAgPGRldGFpbHMga2V5PSJkYXRhdHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb25lbnRUeXBlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tcG9uZW50VHlwZUlkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJvcGVydHkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFSZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWZlcmVuY2VkQ29tcG9uZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVVJJIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJ1bnRpbWVQYXRoIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSVBhdGgiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EZXBlbmRlbmN5VHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZXBlbmRlbnRPYmplY3QiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXJjaGl2ZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZGF0YXR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZXBlbmRlbmN5VHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ1c2VzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb25zdW1lcyIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvamVjdENvbXBvbmVudHMiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbXBvbmVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya2JlbmNoQ29tcG9uZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmUuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lbXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYzQ4YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTx1bWw6TW9kZWwgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpEZWZhdWx0XzA9Imh0dHA6Ly8vRGVmYXVsdF8wLnByb2ZpbGUudW1sMiIgeG1sbnM6RWNvcmVfMD0iaHR0cDovLy9FY29yZV8wLnByb2ZpbGUudW1sMiIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvTm90YXRpb24iIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzEuMC4wL1VNTCIgeG1sbnM6dW1sbm90YXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbS94dG9vbHMvMS41LjAvVW1sbm90YXRpb24iIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovLy9EZWZhdWx0XzAucHJvZmlsZS51bWwyIHBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYkE3UGM5V0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0LyUzQ0VQYWNrYWdlJTNFIGh0dHA6Ly8vRWNvcmVfMC5wcm9maWxlLnVtbDIgcGF0aG1hcDovL1VNTDJfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwyI192OVZVc0s4N0VkaTVRcFllWV95SXBnIiB4bWk6aWQ9IjNBMEIyNDc0MDI1RiIgbmFtZT0iY29tcG9uZW50Y29yZSIgYXBwbGllZFByb2ZpbGU9Il9rTURHNFpUWUVkbXkyb25IWUtsQUJnIF9rTURHNUpUWUVkbXkyb25IWUtsQUJnIF9rTURHNTVUWUVkbXkyb25IWUtsQUJnIF9rTURHNnBUWUVkbXkyb25IWUtsQUJnIF9rTURHN1pUWUVkbXkyb25IWUtsQUJnIF9rTUpOZzVUWUVkbXkyb25IWUtsQUJnIF9rTnEzZ1pUWUVkbXkyb25IWUtsQUJnIF9IMHllOEpUdkVkbUROWTZsbkdBZzVBIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTUpOaHBUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJFY29yZV8wOkVjb3JlX19FUGFja2FnZSIgeG1pOmlkPSJfeERaTXdKVFlFZG15Mm9uSFlLbEFCZyIgbnNVUkk9ImNvbXBvbmVudGNvcmUueG1pIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIgcHJlZml4PSJDb21wb25lbnRDb3JlIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tOcTNoSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXBwbGllZFN0ZXJlb3R5cGVzIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VQYWNrYWdlIiB4bWk6aWQ9Il9rTnEzaFpUWUVkbXkyb25IWUtsQUJnIiBuc1VSST0ibW9kdWxlY29yZS54bWkiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBwcmVmaXg9Ik1vZHVsZUNvcmUiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa09WbDlKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0EwQjI0NzQwMjVGNDFFM0RGMDYwMjEwIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNERjA2MDIxMCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkNvbXBvbmVudENvcmUiPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tQMzI4SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5vdGUiIHNvdXJjZUVkZ2VzPSJfa1FpbFlwVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUDk5a0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJEaWFncmFtTmFtZSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1A5OWtaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfa1AzMjhaVFlFZG15Mm9uSFlLbEFCZyIgZGVzY3JpcHRpb249IlRoZSBSZWZlcmVuY2VkQ29tcG9uZW50IGhhbmRsZSBtdXN0IGJlIHJlc29sdmFibGUgdG8gYSBXb3JrYmVuY2hDb21wb25lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgcnVudGltZVBhdGggc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgUmVmZXJlbmNlZENvbXBvbmVudCBpbiB0aGUgcnVudGltZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRhaW5pbmcgV29ya2JlbmNoQ29tcG9uZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7VGhlIGRlcGVuZGVuY3lUeXBlIHNwZWNpZmllcyBob3cgdGhlIFJlZmVyZW5jZWRDb21wb25lbnQgaXMgYXNzZW1ibGVkIHdpdGhpbiB0aGUgY29udGFpbmluZyBXb3JrYmVuY2hDb21wb25lbnQuIiBmaWxsQ29sb3I9IjEzMzY5MzQzIiBsaW5lQ29sb3I9IjY3MzcxNTEiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1AzMjhwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTkzOTgiIHk9IjYzNiIgd2lkdGg9IjY5MzQiIGhlaWdodD0iNDM0MyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFTlpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRU9KVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVPWlRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSI3OTQxIiBoZWlnaHQ9IjIwNDgiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVPcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVPNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVQSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVQWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVBwVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVA1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFUUpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVOcFRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVONVRZRWRteTJvbkhZS2xBQmciIHg9IjEyMjg1IiB5PSIxNTQ3MiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFUVpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXRFZGdlcz0iX2tRS0s3cFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVJKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjY3MDAzOSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVSWlRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSI0ODU5IiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVScFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVSNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVTSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNjcwMDM5Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVNaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVNwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFUzVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVEpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFVFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVHBUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVQ1VFlFZG15Mm9uSFlLbEFCZyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUUVFUXBUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUUVFUTVUWUVkbXkyb25IWUtsQUJnIiB4PSI1OTY5IiB5PSIxNjA5OSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2VFZGdlcz0iX0I0YkkwSlRjRWRteTJvbkhZS2xBQmcgX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfa1FXWUhwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFVTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFENTEwM0UyIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FFRVZKVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjYwMjgiIGhlaWdodD0iMTk5OCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVZaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVZwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVY1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFV0pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFV1pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVXcFRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVXNVRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRRUVYSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVYWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFWHBUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRRUVVWlRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRRUVVcFRZRWRteTJvbkhZS2xBQmciIHg9IjExNDQ4IiB5PSIxMTEzMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFWDVUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2VFZGdlcz0iX2tRV1lQcFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRVlwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NkRCMDI1MSI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2tRRUVZNVRZRWRteTJvbkhZS2xBQmciIHdpZHRoPSIzNzQyIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVaSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVaWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRRUVacFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY2REIwMjUxIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRVo1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FFRWFKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFYVpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFYXBUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUVFYTVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUVFYkpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FFRWJaVFlFZG15Mm9uSFlLbEFCZyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9rUUVFWUpUWUVkbXkyb25IWUtsQUJnIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dTdGVyZW90eXBlPSJJbWFnZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9rUUVFWVpUWUVkbXkyb25IWUtsQUJnIiB4PSIxNjUxIiB5PSI0ODcyIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0swSlRZRWRteTJvbkhZS2xBQmciIHRhcmdldEVkZ2VzPSJfa1FjZXdwVFlFZG15Mm9uSFlLbEFCZyBfa1FpbFlwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfa1FLSzFKVFlFZG15Mm9uSFlLbEFCZyIgd2lkdGg9IjYxNDYiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzFaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzFwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzE1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLMkpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLMlpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0sycFRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0syNVRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0szSlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0szWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjZDMjRCMDIzRCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUUtLM3BUWUVkbXkyb25IWUtsQUJnIiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX2tRS0swWlRZRWRteTJvbkhZS2xBQmciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd1N0ZXJlb3R5cGU9IkltYWdlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2tRS0swcFRZRWRteTJvbkhZS2xBQmciIHg9IjEyNDAyIiB5PSI0MTM0Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciIHNvdXJjZUVkZ2VzPSJfa1FLSzdwVFlFZG15Mm9uSFlLbEFCZyBfa1FXWUhwVFlFZG15Mm9uSFlLbEFCZyBfa1FjZXdwVFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9rUVdZUHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s0cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY1ODAxRkEiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUUtLNDVUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxOTk4Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLNXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNERjU4MDFGQSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0s1NVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRS0s2SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzZaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzZwVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FLSzY1VFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FLSzdKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRS0s3WlRZRWRteTJvbkhZS2xBQmciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FLSzRKVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FLSzRaVFlFZG15Mm9uSFlLbEFCZyIgeD0iNTk1MiIgeT0iNzkxMSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVkpUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRaWxWNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9rUWlsV0pUWUVkbXkyb25IWUtsQUJnIiB3aWR0aD0iMzA4MSIgaGVpZ2h0PSIyNDcyIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsV1pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsV3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJLaW5kIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsVzVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsWEpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJFbnVtZXJhdGlvbkNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfa1FpbFhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFhwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWlsWDVUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWlsWUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDM5NEY1MDE4NSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRaWxZWlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfa1FpbFZaVFlFZG15Mm9uSFlLbEFCZyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93U3RlcmVvdHlwZT0iSW1hZ2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfa1FpbFZwVFlFZG15Mm9uSFlLbEFCZyIgeD0iMTk3MTYiIHk9IjczMTQiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFFKVGJFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0RWRnZXM9Il9CNGJJMEpUY0VkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUTVUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzVCVWxSSlRiRWRteTJvbkhZS2xBQmciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxSWlRiRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il81QlVsUnBUYkVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFI1VGJFZG15Mm9uSFlLbEFCZyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFNKVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFNaVGJFZG15Mm9uSFlLbEFCZyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFNwVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfNUJVbFM1VGJFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50IiBlbGVtZW50PSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzVCVWxUSlRiRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzVCVWxUWlRiRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCIgZWxlbWVudD0iXzVCQ1JZSlRiRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfNUJVbFRwVGJFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il81QlVsUVpUYkVkbXkyb25IWUtsQUJnIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNUJVbFFwVGJFZG15Mm9uSFlLbEFCZyIgeD0iMTkwODAiIHk9IjExMTMwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lRN1JrS1MzRWRtdFE0VGNrdjVTMlEiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllNS1MzRWRtdFE0VGNrdjVTMlEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSVJCWU1hUzNFZG10UTRUY2t2NVMyUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU1xUzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllNNlMzRWRtdFE0VGNrdjVTMlEiIHR5cGU9IktpbmQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZTktTM0VkbXRRNFRja3Y1UzJRIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU5hUzNFZG10UTRUY2t2NVMyUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0lSQllOcVMzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0lSQllONlMzRWRtdFE0VGNrdjVTMlEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCIgZWxlbWVudD0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZT0tTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JUkJZT2FTM0VkbXRRNFRja3Y1UzJRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUmVhbGl6YXRpb25MaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWU9xUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWU82UzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iUmVxdWlyZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWVBLUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWVBhUzNFZG10UTRUY2t2NVMyUSIgdHlwZT0iUHJvdmlkZWRJbnRlcmZhY2VMaXN0Q29tcGFydG1lbnQiIGVsZW1lbnQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSVJCWVBxUzNFZG10UTRUY2t2NVMyUSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVJCWVA2UzNFZG10UTRUY2t2NVMyUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50IiBlbGVtZW50PSJfSVFRak1LUzNFZG10UTRUY2t2NVMyUSI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JUkJZUUtTM0VkbXRRNFRja3Y1UzJRIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbXBvbmVudFN0eWxlIiB4bWk6aWQ9Il9JUTdSa2FTM0VkbXRRNFRja3Y1UzJRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVE3UmtxUzNFZG10UTRUY2t2NVMyUSIgeD0iMTkwNTAiIHk9IjE2MDA3Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9rT1ZsOXBUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfa1FLSzdwVFlFZG15Mm9uSFlLbEFCZyIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTRCMDFFMyIgc291cmNlPSJfa1FLSzM1VFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0PSJfa1FFRVFaVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUUtLOFpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0QjAxRTMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSY0pUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIi8+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJjWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUUtLOHBUWUVkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVFSY3BUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmRKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUYiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRUVJjNVRZRWRteTJvbkhZS2xBQmciIHg9Ii0yNTkiIHk9Ii0yNjQiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRUVJkWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FRUmQ1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVFSZHBUWUVkbXkyb25IWUtsQUJnIiB4PSIyMTgiIHk9Ii0xMTY0Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRXBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZRVpUWUVkbXkyb25IWUtsQUJnIiB4PSIzNDUiIHk9Ii0yNjMiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lFNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZRlpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUZKVFlFZG15Mm9uSFlLbEFCZyIgeD0iNjYzIiB5PSItMTAxNyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUZwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lHSlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFGIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZR1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lGNVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lHcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lISlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFM0UxNEQwMzFEIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZSFpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lHNVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRS0s3NVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUUtLOEpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlstMzMsIDk5OSwgLTQ0MCwgLTczOTldJFstMzMsIDcxODgsIC00NDAsIC0xMjEwXSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9rUVdZSHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIiBzb3VyY2U9Il9rUUtLMzVUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lJWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lJNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUpKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5ODAyQzIiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lJcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lKWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUo1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lKcFRZRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUtKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWUtwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZS1pUWUVkbXkyb25IWUtsQUJnIiB5PSItMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZSzVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZTFpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUVdZTEpUWUVkbXkyb25IWUtsQUJnIiB4PSItMTAiIHk9Ii0zMDEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lMcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUVdZTUpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FXWUw1VFlFZG15Mm9uSFlLbEFCZyIgeD0iNDk0IiB5PSItMTU3MSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWU1aVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lNNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQzIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZTkpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lNcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lOWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lONVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFFQzFEOTkwMjQxIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUVdZT0pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lOcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRV1lINVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUVdZSUpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlsyMDQwLCAzMzAsIC01NjgxLCAtMjkyMV0kWzc3MzAsIDMzMCwgOCwgLTI5MjFdJFs3NzMwLCAyMjUyLCA4LCAtOTk5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9rUVdZUHBUWUVkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBzb3VyY2U9Il9rUUVFWDVUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUtLMzVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lRWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIwMDBFOCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lRNVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlN0ZXJlb3R5cGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FXWVJKVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMDAwRTgiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lRcFRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRV1lSWlRZRWRteTJvbkhZS2xBQmciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXNKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTMiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRV1lScFRZRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXNaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXM1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNlc3BUWUVkbXkyb25IWUtsQUJnIiB5PSItMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldEpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldHBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9rUWNldFpUWUVkbXkyb25IWUtsQUJnIiB4PSItMTU2OCIgeT0iNTE2Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNldDVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXVaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V1SlRZRWRteTJvbkhZS2xBQmciIHg9Ii02MDIiIHk9IjgzNCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXVwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V2SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTEzIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWNldlpUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V1NVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V2cFRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V3SlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rUWNld1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V2NVRZRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRV1lQNVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9rUVdZUUpUWUVkbXkyb25IWUtsQUJnIiBwb2ludHM9IlstNzcwLCA3ODcsIC01MjQwLCAtMjQ2M10kWy03NzAsIDI3MzQsIC01MjQwLCAtNTE2XSRbMjQyOSwgMjczNCwgLTIwNDAsIC01MTZdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRY2V3cFRZRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiIHNvdXJjZT0iX2tRS0szNVRZRWRteTJvbkhZS2xBQmciIHRhcmdldD0iX2tRS0swSlRZRWRteTJvbkhZS2xBQmciPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXhaVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXg1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleUpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE1MDJFMiIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXhwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZXlaVFlFZG15Mm9uSFlLbEFCZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNleTVUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI4MSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZXlwVFlFZG15Mm9uSFlLbEFCZyIgeT0iMzk3Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlekpUWUVkbXkyb25IWUtsQUJnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlenBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1JvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2V6WlRZRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2V6NVRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2tRY2UwWlRZRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2UwSlRZRWRteTJvbkhZS2xBQmciIHg9IjQxNiIgeT0iNTkzIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMHBUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZTFKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGUiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2tRY2UwNVRZRWRteTJvbkhZS2xBQmciIHg9Ii02IiB5PSIyNDI2Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9rUWNlMVpUWUVkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FjZTE1VFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyODEiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRY2UySlRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FjZTFwVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFVKVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjdGIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfa1FpbFVwVFlFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX2tRaWxVNVRZRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfa1FpbFVaVFlFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfa1FjZXc1VFlFZG15Mm9uSFlLbEFCZyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRY2V4SlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWzI0MDgsIDI4LCAtNDc2MiwgMzU3M10kWzY0NTYsIDI4LCAtNzE0LCAzNTczXSRbNjQ1NiwgLTI0MzQsIC03MTQsIDExMTFdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2tRaWxZcFRZRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9rUDMyOEpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUtLMEpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2tRaWxZNVRZRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2tRaWxaSlRZRWRteTJvbkhZS2xBQmciIHBvaW50cz0iWy0zNDkzLCAtNzksIDM4NjMsIC0yNDg3XSRbLTUwODAsIC03OSwgMjI3NiwgLTI0ODddJFstNTA4MCwgMTI5NywgMjI3NiwgLTExMTFdIi8+Ci0gICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9rUWlsWlpUWUVkbXkyb25IWUtsQUJnIiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2tRaWxacFRZRWRteTJvbkhZS2xBQmciIGlkPSJhbmNob3I1MCIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il9CNGJJMEpUY0VkbXkyb25IWUtsQUJnIiBlbGVtZW50PSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJfa1FFRVVKVFlFZG15Mm9uSFlLbEFCZyIgdGFyZ2V0PSJfNUJVbFFKVGJFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMDVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lTGFiZWwiIGVsZW1lbnQ9Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTFaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iU3RlcmVvdHlwZSIgZWxlbWVudD0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTFwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iTmFtZSIgZWxlbWVudD0iX0Izd2FjSlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0YkkxSlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkxNVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTJaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il9CM3dhY3BUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJMkpUY0VkbXkyb25IWUtsQUJnIiB5PSIzOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkycFRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkzSlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlRvUm9sZSIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0YkkyNVRjRWRteTJvbkhZS2xBQmciIHk9Ii0zOTciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0YkkzWlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJMzVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5IiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTNwVGNFZG15Mm9uSFlLbEFCZyIgeD0iLTEyODAiIHk9IjU3NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTRKVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNHBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZSIgZWxlbWVudD0iX0Izd2FjWlRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0I0Ykk0WlRjRWRteTJvbkhZS2xBQmciIHg9Ii00ODYiIHk9Ijg5MyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTQ1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9CNGJJNVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCIgZWxlbWVudD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0I0Ykk1cFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQjRiSTVKVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQjRiSTU1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0I0Ykk2WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfQjRiSTZwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9CNGJJNkpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9CNGJJMFpUY0VkbXkyb25IWUtsQUJnIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQjRiSTBwVGNFZG15Mm9uSFlLbEFCZyIgcG9pbnRzPSJbMjA2NCwgMjcsIC00Mjg2LCAyN10kWzQ5NzQsIDI3LCAtMTM3NiwgMjddIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iX2JOaHY0SlRjRWRteTJvbkhZS2xBQmciIGVsZW1lbnQ9Il9iTkRPd0pUY0VkbXkyb25IWUtsQUJnIiBzb3VyY2U9Il9rUUVFVUpUWUVkbXkyb25IWUtsQUJnIiB0YXJnZXQ9Il9rUUVFTlpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY0NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9Ik5hbWVMYWJlbCIgZWxlbWVudD0iX2JORE93SlRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NVpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJTdGVyZW90eXBlIiBlbGVtZW50PSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NXBUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJOYW1lIiBlbGVtZW50PSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjVKVGNFZG15Mm9uSFlLbEFCZyIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjU1VGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2NlpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb011bHRpcGxpY2l0eSIgZWxlbWVudD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHY2SlRjRWRteTJvbkhZS2xBQmciIHk9IjM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjZwVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd3BUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjdKVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iVG9Sb2xlIiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjY1VGNFZG15Mm9uSFlLbEFCZyIgeT0iLTM5NyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odjdaVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY3NVRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2N3BUY0VkbXkyb25IWUtsQUJnIiB4PSItMjU3IiB5PSItMzUzIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2OEpUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY4cFRjRWRteTJvbkhZS2xBQmciIHR5cGU9IkZyb21Sb2xlIiBlbGVtZW50PSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYk5odjhaVGNFZG15Mm9uSFlLbEFCZyIgeD0iNjEiIHk9Ii0xNzgyIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2ODVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2JOaHY5WlRjRWRteTJvbkhZS2xBQmciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50IiBlbGVtZW50PSJfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfYk5odjlwVGNFZG15Mm9uSFlLbEFCZyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iTmh2OUpUY0VkbXkyb25IWUtsQUJnIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9iTmh2OTVUY0VkbXkyb25IWUtsQUJnIiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYk5odi1aVGNFZG15Mm9uSFlLbEFCZyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiIGVsZW1lbnQ9Il9iTkRPd1pUY0VkbXkyb25IWUtsQUJnIj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9iTmh2LXBUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2JOaHYtSlRjRWRteTJvbkhZS2xBQmciIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2JOaHY0WlRjRWRteTJvbkhZS2xBQmciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9iTmh2NHBUY0VkbXkyb25IWUtsQUJnIiBwb2ludHM9Ils1LCA0MiwgLTE4LCAtMTExXSRbNSwgMTIzLCAtMTgsIC0zMF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTURHNFpUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNREc0cFRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTURHNDVUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc1SlRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzVaVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc1cFRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTURHNTVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNREc2SlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTURHNlpUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc2cFRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzY1VFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc3SlRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2tNREc3WlRZRWRteTJvbkhZS2xBQmciPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa01ERzdwVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tNREc3NVRZRWRteTJvbkhZS2xBQmciIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfa01ERzhKVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfRWZSWm9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9rTUpOZzVUWUVkbXkyb25IWUtsQUJnIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2tNSk5oSlRZRWRteTJvbkhZS2xBQmciIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTUpOaFpUWUVkbXkyb25IWUtsQUJnIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9ST1NFX1BST0ZJTEVTL1Jvc2UuZXB4I184eVBtZ0VPNEVkbVpGWms3empaLWVBP1Jvc2UiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9ST1NFX1BST0ZJTEVTL1Jvc2UuZXB4I184eVBtZ0VPNEVkbVpGWms3empaLWVBP1Jvc2UiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfa05xM2daVFlFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTnEzZ3BUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImF0dHJpYnV0ZXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfa05xM2c1VFlFZG15Mm9uSFlLbEFCZyIga2V5PSJ2ZXJzaW9uIiB2YWx1ZT0iMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbDIjX3NpUHQ0Szg3RWRpNVFwWWVZX3lJcGciLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sMiNfc2lQdDRLODdFZGk1UXBZZVlfeUlwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9IMHllOEpUdkVkbUROWTZsbkdBZzVBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0gweWU4WlR2RWRtRE5ZNmxuR0FnNUEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9IMHllOHBUdkVkbUROWTZsbkdBZzVBIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9IkphdmEuZXB4I18tWm95d0pTa0VkbWphdVNqRzhxTzJBP0phdmEiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9IkphdmEuZXB4I18tWm95d0pTa0VkbWphdVNqRzhxTzJBP0phdmEiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBuYW1lPSJXb3JrYmVuY2hDb21wb25lbnQiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDcxRDAyMDgiIG5hbWU9Im5hbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRCIgbmFtZT0icmVzb3VyY2VzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNjcwMDM5IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw0WlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDRKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MSIgbmFtZT0iY29tcG9uZW50VHlwZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiI+Ci0gICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9rT1ZsNkpUWUVkbXkyb25IWUtsQUJnIiB2YWx1ZT0iMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDU1VFlFZG15Mm9uSFlLbEFCZyIgdmFsdWU9IjEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNjAyN0YiIG5hbWU9InJlZmVyZW5jZWRDb21wb25lbnRzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFGNkMyNEIwMjNEIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw4cFRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUUzREY2NzAwMzkiIG5hbWU9IkNvbXBvbmVudFJlc291cmNlIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGOTcwMTI4IiBuYW1lPSJzb3VyY2VQYXRoIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUVDNjQwMDI1QiIgbmFtZT0icnVudGltZVBhdGgiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMjZEQTAyN0EiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0RGOUUwMTFFIiBuYW1lPSJleGNsdXNpb25zIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tOM0V4cFRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa04zRXhaVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiIgbmFtZT0iY29tcG9uZW50IiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw1SlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSIxIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9rT1ZsNDVUWUVkbXkyb25IWUtsQUJnIiB2YWx1ZT0iMSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2p3NUdRS1YtRWRtb1llTy1XUjlhRGciIG5hbWU9InJlc291cmNlVHlwZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDUxMDNFMiIgbmFtZT0iQ29tcG9uZW50VHlwZSI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMyMTM0MDM1NyIgbmFtZT0iY29tcG9uZW50VHlwZUlkIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9VRGtnRUpUYkVkbXkyb25IWUtsQUJnIiBuYW1lPSJ2ZXJzaW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9CM3dhY1pUY0VkbXkyb25IWUtsQUJnIiBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJfNUJDUllKVGJFZG15Mm9uSFlLbEFCZyIgYXNzb2NpYXRpb249Il9CM3dhY0pUY0VkbXkyb25IWUtsQUJnIiBhZ2dyZWdhdGlvbj0ic2hhcmVkIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0Izd2FkSlRjRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQjN3YWM1VGNFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2JORE93WlRjRWRteTJvbkhZS2xBQmciIG5hbWU9Im1ldGFkYXRhUmVzb3VyY2VzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIiBhc3NvY2lhdGlvbj0iX2JORE93SlRjRWRteTJvbkhZS2xBQmciIGFnZ3JlZ2F0aW9uPSJzaGFyZWQiPgotICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYk5ET3hKVGNFZG15Mm9uSFlLbEFCZyIgdmFsdWU9Ii0xIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iTkRPdzVUY0VkbXkyb25IWUtsQUJnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9vd25lZE1lbWJlcj4KLSAgPG93bmVkTWVtYmVyIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzI2REEwMjdBIiBuYW1lPSJJUGF0aCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMWnBUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgICA8Y29udGVudHMgeG1pOnR5cGU9IkVjb3JlXzA6RWNvcmVfX0VEYXRhVHlwZSIgeG1pOmlkPSJfa045TFo1VFlFZG15Mm9uSFlLbEFCZyIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa045TGFKVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJrZXl3b3JkcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9rTjlMYVpUWUVkbXkyb25IWUtsQUJnIiBrZXk9ImRhdGF0eXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjZEQjAyNTEiIG5hbWU9IlByb2plY3RDb21wb25lbnRzIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3RkQwMjNBIiBuYW1lPSJwcm9qZWN0TmFtZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX0xJQlJBUklFUy9VTUwyUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwyI19JWGxIOGE4NkVkaWVhWWd4dFZXTjhRIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjEwMTExIiBuYW1lPSJjb21wb25lbnRzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIj4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2tPVmw3WlRZRWRteTJvbkhZS2xBQmciIHZhbHVlPSItMSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfa09WbDdKVFlFZG15Mm9uSFlLbEFCZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MUY2QzI0QjAyM0QiIG5hbWU9IlJlZmVyZW5jZWRDb21wb25lbnQiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDVGMDAxQzkiIG5hbWU9ImhhbmRsZSIgdHlwZT0iX0lRUWpNS1MzRWRtdFE0VGNrdjVTMlEiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMTQ1RkEwMDE1IiBuYW1lPSJydW50aW1lUGF0aCIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRUMyNkRBMDI3QSIvPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTI0MzAxNkUiIG5hbWU9ImRlcGVuZGVuY3lUeXBlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ii8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAzOTRGNTAxODUiIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2tOOUxjWlRZRWRteTJvbkhZS2xBQmciIGJvZHk9InVzZXM9MCYjeEE7Y29uc3VtZXM9MSYjeEE7IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0EwQjI0NzQwMjVGNDIwMzk0RjUwMTg1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa09KWW9KVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhcHBsaWVkU3RlcmVvdHlwZXMiPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9IkRlZmF1bHRfMDpEZWZhdWx0X19Eb2N1bWVudGF0aW9uIiB4bWk6aWQ9Il9rT0pZb1pUWUVkbXkyb25IWUtsQUJnIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQyMDM5OTM4MDE4RCIgbmFtZT0idXNlcyIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMzlBNkUwMTM5IiBuYW1lPSJjb25zdW1lcyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFM0UxNEIwMUUzIiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUUzRTE0RDAzMUQgXzNBMEIyNDc0MDI1RjQxRTNFMTREMDMxRiIvPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFFQzFEOTgwMkMyIiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ5OTAyNDEgXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRUMxRDk5MDI0MyIgbmFtZT0iX3dvcmtiZW5jaE1vZHVsZSIgdHlwZT0iXzNBMEIyNDc0MDI1RjQxRTNERjU4MDFGQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBMEIyNDc0MDI1RjQxRUMxRDk4MDJDMiIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4IiBtZW1iZXJFbmQ9Il8zQTBCMjQ3NDAyNUY0MUY1NjcyMTAxMTEgXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iXzNBMEIyNDc0MDI1RjQxRjU2NzIxMDExMyIgbmFtZT0iX3Byb2plY3RNb2R1bGVzIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFGNTY2REIwMjUxIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDFGNTY3MjAwMEU4Ii8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQTBCMjQ3NDAyNUY0MjAxNDZBNTAyRTIiIG1lbWJlckVuZD0iXzNBMEIyNDc0MDI1RjQyMDE0NkE2MDI3RiBfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIj4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTYwMjgxIiBuYW1lPSJfd29ya2JlbmNoTW9kdWxlIiB0eXBlPSJfM0EwQjI0NzQwMjVGNDFFM0RGNTgwMUZBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0EwQjI0NzQwMjVGNDIwMTQ2QTUwMkUyIi8+Ci0gIDwvb3duZWRNZW1iZXI+Ci0gIDxvd25lZE1lbWJlciB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il81QkNSWUpUYkVkbXkyb25IWUtsQUJnIiBuYW1lPSJQcm9wZXJ0eSI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzdYbzhZSlRiRWRteTJvbkhZS2xBQmciIG5hbWU9Im5hbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfSVhsSDhhODZFZGllYVlneHRWV044USIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzhlT0o4SlRiRWRteTJvbkhZS2xBQmciIG5hbWU9InZhbHVlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTElCUkFSSUVTL1VNTDJQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbDIjX0lYbEg4YTg2RWRpZWFZZ3h0VldOOFEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIgbWVtYmVyRW5kPSJfQjN3YWNaVGNFZG15Mm9uSFlLbEFCZyBfQjN3YWNwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX0Izd2FjcFRjRWRteTJvbkhZS2xBQmciIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiIGFzc29jaWF0aW9uPSJfQjN3YWNKVGNFZG15Mm9uSFlLbEFCZyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIgbWVtYmVyRW5kPSJfYk5ET3daVGNFZG15Mm9uSFlLbEFCZyBfYk5ET3dwVGNFZG15Mm9uSFlLbEFCZyI+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX2JORE93cFRjRWRteTJvbkhZS2xBQmciIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQTBCMjQ3NDAyNUY0MUVDMUQ1MTAzRTIiIGFzc29jaWF0aW9uPSJfYk5ET3dKVGNFZG15Mm9uSFlLbEFCZyIvPgotICA8L293bmVkTWVtYmVyPgotICA8b3duZWRNZW1iZXIgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il9JUVFqTUtTM0VkbXRRNFRja3Y1UzJRIiBuYW1lPSJVUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfa045TFpwVFlFZG15Mm9uSFlLbEFCZyIgc291cmNlPSJhcHBsaWVkU3RlcmVvdHlwZXMiPgotICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJFY29yZV8wOkVjb3JlX19FRGF0YVR5cGUiIHhtaTppZD0iX2tOOUxaNVRZRWRteTJvbkhZS2xBQmciIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rTjlMYUpUWUVkbXkyb25IWUtsQUJnIiBzb3VyY2U9ImtleXdvcmRzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX2tOOUxhWlRZRWRteTJvbkhZS2xBQmciIGtleT0iZGF0YXR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9vd25lZE1lbWJlcj4KLTwvdW1sOk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5nZW5tb2RlbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmUuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTU1MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIHJ1bnRpbWVKYXI9InRydWUiIG1vZGVsTmFtZT0iQ29tcG9uZW50Q29yZSIKLSAgICBlZGl0UGx1Z2luQ2xhc3M9ImNvbXBvbmVudGNvcmUucHJvdmlkZXIuQ29tcG9uZW50Q29yZUVkaXRQbHVnaW4iIGVkaXRvclBsdWdpbkNsYXNzPSJjb21wb25lbnRjb3JlLnByZXNlbnRhdGlvbi5Db21wb25lbnRDb3JlRWRpdG9yUGx1Z2luIj4KLSAgPGZvcmVpZ25Nb2RlbD5jb21wb25lbnRDb3JlLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNvbXBvbmVudGNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwiIGNsYXNzUGFja2FnZVN1ZmZpeD0iaW50ZXJuYWwuaW1wbCIgdXRpbGl0eVBhY2thZ2VTdWZmaXg9ImludGVybmFsLnV0aWwiCi0gICAgICBlY29yZVBhY2thZ2U9ImNvbXBvbmVudENvcmUuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL3VzZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tcG9uZW50Q29yZS5lY29yZSMvL0RlcGVuZGVuY3lUeXBlL2NvbnN1bWVzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9JUGF0aCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iY29tcG9uZW50Q29yZS5lY29yZSMvL1VSSSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vV29ya2JlbmNoQ29tcG9uZW50L3Jlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvY29tcG9uZW50VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Xb3JrYmVuY2hDb21wb25lbnQvcmVmZXJlbmNlZENvbXBvbmVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFJlc291cmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50UmVzb3VyY2Uvc291cmNlUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9ydW50aW1lUGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9leGNsdXNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRSZXNvdXJjZS9jb21wb25lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50UmVzb3VyY2UvcmVzb3VyY2VUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50VHlwZS9jb21wb25lbnRUeXBlSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vQ29tcG9uZW50VHlwZS92ZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL0NvbXBvbmVudFR5cGUvcHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9Db21wb25lbnRUeXBlL21ldGFkYXRhUmVzb3VyY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXBvbmVudENvcmUuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb3BlcnR5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9SZWZlcmVuY2VkQ29tcG9uZW50L2hhbmRsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXBvbmVudENvcmUuZWNvcmUjLy9SZWZlcmVuY2VkQ29tcG9uZW50L3J1bnRpbWVQYXRoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcG9uZW50Q29yZS5lY29yZSMvL1JlZmVyZW5jZWRDb21wb25lbnQvZGVwZW5kZW5jeVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUmVmZXJlbmNlZENvbXBvbmVudC9kZXBlbmRlbnRPYmplY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb2plY3RDb21wb25lbnRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21wb25lbnRDb3JlLmVjb3JlIy8vUHJvamVjdENvbXBvbmVudHMvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcG9uZW50Q29yZS5lY29yZSMvL1Byb2plY3RDb21wb25lbnRzL2NvbXBvbmVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZVBhY2thZ2UuZW14IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kZWwvY29tcG9uZW50Q29yZVBhY2thZ2UuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAzZGU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZGVsL2NvbXBvbmVudENvcmVQYWNrYWdlLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL05vdGF0aW9uIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8xLjAuMC9VTUwiIHhtbG5zOnVtbG5vdGF0aW9uPSJodHRwOi8vd3d3LmlibS5jb20veHRvb2xzLzEuNS4wL1VtbG5vdGF0aW9uIiB4bWk6aWQ9Il93VUNId01POEVkbW1FYktFQm5XMEFRIiBuYW1lPSJjb21wb25lbnRDb3JlUGFja2FnZSIgYXBwbGllZFByb2ZpbGU9Il93VUNIeE1POEVkbW1FYktFQm5XMEFRIF93VUNIeDhPOEVkbW1FYktFQm5XMEFRIF93VUNIeXNPOEVkbW1FYktFQm5XMEFRIF93VUlPWXNPOEVkbW1FYktFQm5XMEFRIF93VUlPWmNPOEVkbW1FYktFQm5XMEFRIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il93VUNId2NPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il93VUNId3NPOEVkbW1FYktFQm5XMEFRIj4KLSAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iX3dVQ0h3c084RWRtbUViS0VCblcwQVEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2VFZGdlcz0iXzNJWlhnTU84RWRtbUViS0VCblcwQVEgXzNJZmVJTU84RWRtbUViS0VCblcwQVEgXzNJZmVKOE84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0laWGdNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmb01POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMnZGZm9jTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZm9zTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8ydkZmbzhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJ2RmZwTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMnZGZnBjTzhFZG1tRWJLRUJuVzBBUSIgZmlsdGVyaW5nPSJNYW51YWwiPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJ2aXpyZWY6Ly8vI2pmaWVsZF52Y29yZS50YXJnZXQ9dW1sMi5Qcm9wZXJ0eV5uYW1lPWFydGlmYWN0RWRpdE1vZGVsW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgICA8ZmlsdGVyZWRPYmplY3RzIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9InZpenJlZjovLy8jamZpZWxkXnZjb3JlLnRhcmdldD11bWwyLlByb3BlcnR5Xm5hbWU9aXNSZWFkT25seVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgICAgPGZpbHRlcmVkT2JqZWN0cyB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJ2aXpyZWY6Ly8vI2pmaWVsZF52Y29yZS50YXJnZXQ9dW1sMi5Qcm9wZXJ0eV5uYW1lPWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZFtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvc3R5bGVzPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnBzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8ydkZmcDhPOEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJpdmF0ZSxwYWNrYWdlLHByb3RlY3RlZCIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnFNTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMnZGZnFjTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMnZGZnFzTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzJ2RmZxOE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfMnIxWFVjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8ycjFYVXNPOEVkbW1FYktFQm5XMEFRIiB4PSIxNTU4MiIgeT0iMjE5NDIiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGtNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlRWRnZXM9Il8zSWxrd01POEVkbW1FYktFQm5XMEFRIF8zSWxreU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXRFZGdlcz0iXzNJZmVKOE84RWRtbUViS0VCblcwQVEgXzNJbGt3TU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGs4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjVUTGxNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTGxjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExsc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbDhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI1VExtTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjVUTG1jTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbXNPOEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJpdmF0ZSxwYWNrYWdlLHByb3RlY3RlZCIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yNVRMbThPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbk1POEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI1VExuY084RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yNVRMbnNPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfMjVUTGtjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIi8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzI1VExrc084RWRtbUViS0VCblcwQVEiIHg9IjcwMDkiIHk9IjE3NDg3Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFBTU84RWRtbUViS0VCblcwQVEiIHRhcmdldEVkZ2VzPSJfM0lmZUlNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUIxQThPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjlCMUJNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjUzMCIgaGVpZ2h0PSI1MzAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFCY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlCMUJzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUIxQjhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5JbnRlcmZhY2VebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5QjFDTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfMjlCMUNjTzhFZG1tRWJLRUJuVzBBUSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW50ZXJmYWNlIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkludGVyZmFjZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjlIN29NTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOUg3b2NPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOUg3b3NPOEVkbW1FYktFQm5XMEFRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOUg3bzhPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENsYXNzaWZpZXJTdHlsZSIgeG1pOmlkPSJfMjlCMUFjTzhFZG1tRWJLRUJuVzBBUSIgc2hvd1N0ZXJlb3R5cGU9IkxhYmVsIiB1c2VDbGFzc2lmaWVyU2hhcGU9InRydWUiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnRlcmZhY2UiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuSW50ZXJmYWNlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzI5QjFBc084RWRtbUViS0VCblcwQVEiIHg9IjE2MjE4IiB5PSIxNzQ5MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3b01POEVkbW1FYktFQm5XMEFRIiB0YXJnZXRFZGdlcz0iXzNJbGt5TU84RWRtbUViS0VCblcwQVEgXzNJcnJZOE84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d284TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfMjk0d3BNTzhFZG1tRWJLRUJuVzBBUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3BjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdwc084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yOTR3cDhPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdxTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3FjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yOTR3cXNPOEVkbW1FYktFQm5XMEFRIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzI5NHdxOE84RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdyTU84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMjk0d3JjTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzI5NHdyc084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yOTR3b2NPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMjk0d29zTzhFZG1tRWJLRUJuVzBBUSIgeD0iMzg5NCIgeT0iMjU2MTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STElNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlRWRnZXM9Il8zSXJyWThPOEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItUkxJOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iXzItUkxKTU84RWRtbUViS0VCblcwQVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItUkxKY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVJMSnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1STEo4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8yLVJMS01POEVkbW1FYktFQm5XMEFRIiBmaWx0ZXJpbmc9IkF1dG9tYXRpYyIgZmlsdGVyaW5nS2V5cz0icHJvdGVjdGVkLHByaXZhdGUscGFja2FnZSIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InZpenJlZjovLy8janNyY3R5cGVedmNvcmUudGFyZ2V0PXVtbDIuQ2xhc3NebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yLVhSd01POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ3Y084RWRtbUViS0VCblcwQVEiIGZpbHRlcmluZz0iQXV0b21hdGljIiBmaWx0ZXJpbmdLZXlzPSJwcm90ZWN0ZWQscHJpdmF0ZSxwYWNrYWdlIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzItWFJ3c084RWRtbUViS0VCblcwQVEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ3OE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMi1YUnhNTzhFZG1tRWJLRUJuVzBBUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzItWFJ4Y084RWRtbUViS0VCblcwQVEiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJ2aXpyZWY6Ly8vI2pzcmN0eXBlXnZjb3JlLnRhcmdldD11bWwyLkNsYXNzXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8yLVJMSWNPOEVkbW1FYktFQm5XMEFRIiBzaG93U3RlcmVvdHlwZT0iTGFiZWwiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0idml6cmVmOi8vLyNqc3JjdHlwZV52Y29yZS50YXJnZXQ9dW1sMi5DbGFzc15uYW1lPUNvbXBvbmVudENvcmVbamN1Xm5hbWU9Q29tcG9uZW50Q29yZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV0iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMi1STElzTzhFZG1tRWJLRUJuVzBBUSIgeD0iMTkwOCIgeT0iMTc0OTAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX3dVQ0h3OE84RWRtbUViS0VCblcwQVEiLz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSVpYZ01POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJWlhnOE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJWlhoY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0laWGg4TzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSVpYaHNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSVpYaE1POEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSVpYZ2NPOEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJWlhnc084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzI2NzMsIDQzMTIsIDI2NzMsIDQzMTJdJFszMjI4LCA0MzEyLCAzMjI4LCA0MzEyXSRbMzIyOCwgNTU1NiwgMzIyOCwgNTU1Nl0kWzE5MzIsIDU1NTYsIDE5MzIsIDU1NTZdJFsxOTMyLCA0OTQ3LCAxOTMyLCA0OTQ3XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWZlSU1POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yOUIxQU1POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVJOE84RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVKY084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbXBsZW1lbnRhdGlvbiIgaHJlZj0idml6cmVmOi8vLyNqaW1wbF52Y29yZS50YXJnZXQ9dW1sMi5JbXBsZW1lbnRhdGlvbltqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyW2pjdV5uYW1lPUlFZGl0TW9kZWxIYW5kbGVyLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWZlSnNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkltcGxlbWVudGF0aW9uIiBocmVmPSJ2aXpyZWY6Ly8vI2ppbXBsXnZjb3JlLnRhcmdldD11bWwyLkltcGxlbWVudGF0aW9uW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9SUVkaXRNb2RlbEhhbmRsZXJbamN1Xm5hbWU9SUVkaXRNb2RlbEhhbmRsZXIuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lmZUpNTzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lmZUljTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW1wbGVtZW50YXRpb24iIGhyZWY9InZpenJlZjovLy8jamltcGxedmNvcmUudGFyZ2V0PXVtbDIuSW1wbGVtZW50YXRpb25banNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1JRWRpdE1vZGVsSGFuZGxlcltqY3VebmFtZT1JRWRpdE1vZGVsSGFuZGxlci5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJZmVJc084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzI3LCAtNDk0OCwgNTMsIDMxNzVdJFsyNywgLTY4MjcsIDUzLCAxMjk2XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWZlSjhPOEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8ycjFYVU1POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVLc084RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJZmVMTU84RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWZlTHNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPUFydGlmYWN0RWRpdFtqY3VebmFtZT1BcnRpZmFjdEVkaXQuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lmZUxjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9QXJ0aWZhY3RFZGl0W2pjdV5uYW1lPUFydGlmYWN0RWRpdC5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJZmVLOE84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJZmVLTU84RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1BcnRpZmFjdEVkaXRbamN1Xm5hbWU9QXJ0aWZhY3RFZGl0LmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zSWZlS2NPOEVkbW1FYktFQm5XMEFRIiBwb2ludHM9IlstMTMsIDcwNzcsIDI4MzEsIC01NjM2XSRbLTI4NDQsIDg2NjQsIDAsIC00MDQ5XSIvPgotICAgICAgPC9lZGdlcz4KLSAgICAgIDxlZGdlcyB4bWk6aWQ9Il8zSWxrd01POEVkbW1FYktFQm5XMEFRIiBzb3VyY2U9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIiB0YXJnZXQ9Il8yNVRMa01POEVkbW1FYktFQm5XMEFRIj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt3OE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4Y084RWRtbUViS0VCblcwQVEiIHR5cGU9IlN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4OE84RWRtbUViS0VCblcwQVEiIHR5cGU9IktpbmQiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzNJbGt4c084RWRtbUViS0VCblcwQVEiIHR5cGU9Ik5hbWUiPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM0lsa3hNTzhFZG1tRWJLRUJuVzBBUSIgeT0iLTE4NSIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfM0lsa3djTzhFZG1tRWJLRUJuVzBBUSIgcm91dGluZz0iUmVjdGlsaW5lYXIiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9TW9kdWxlQ29yZU5hdHVyZVtqY3VebmFtZT1Nb2R1bGVDb3JlTmF0dXJlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfM0lsa3dzTzhFZG1tRWJLRUJuVzBBUSIgcG9pbnRzPSJbMjgzMSwgMjk2NCwgMjgzMSwgMjk2NF0kWzI4MzEsIDM4MzcsIDI4MzEsIDM4MzddJFsxMzIyLCAzODM3LCAxMzIyLCAzODM3XSRbMTMyMiwgMjk2NCwgMTMyMiwgMjk2NF0iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgICA8ZWRnZXMgeG1pOmlkPSJfM0lsa3lNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJfMjVUTGtNTzhFZG1tRWJLRUJuVzBBUSIgdGFyZ2V0PSJfMjk0d29NTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSWxreThPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWU1POEVkbW1FYktFQm5XMEFRIiB0eXBlPSJTdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWXNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJLaW5kIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8zSXJyWWNPOEVkbW1FYktFQm5XMEFRIiB0eXBlPSJOYW1lIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VXNhZ2UiIGhyZWY9InZpenJlZjovLy8jamRlcF52Y29yZS50YXJnZXQ9dW1sMi5Vc2FnZVtqc3JjdHlwZV5uYW1lPU1vZHVsZUNvcmVOYXR1cmVbamN1Xm5hbWU9TW9kdWxlQ29yZU5hdHVyZS5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dW2pzcmN0eXBlXm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbltqY3VebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV0iLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzNJbGt6TU84RWRtbUViS0VCblcwQVEiIHk9Ii0xODUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzNJbGt5Y084RWRtbUViS0VCblcwQVEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Nb2R1bGVDb3JlTmF0dXJlW2pjdV5uYW1lPU1vZHVsZUNvcmVOYXR1cmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzNJbGt5c084RWRtbUViS0VCblcwQVEiIHBvaW50cz0iWzAsIDQwNDgsIDMzMDcsIC0yNDYwXSRbLTMzMDcsIDU2MzUsIDAsIC04NzNdIi8+Ci0gICAgICA8L2VkZ2VzPgotICAgICAgPGVkZ2VzIHhtaTppZD0iXzNJcnJZOE84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iXzItUkxJTU84RWRtbUViS0VCblcwQVEiIHRhcmdldD0iXzI5NHdvTU84RWRtbUViS0VCblcwQVEiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lyclpzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFNTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFzTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iS2luZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfM0lycmFjTzhFZG1tRWJLRUJuVzBBUSIgdHlwZT0iTmFtZSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlVzYWdlIiBocmVmPSJ2aXpyZWY6Ly8vI2pkZXBedmNvcmUudGFyZ2V0PXVtbDIuVXNhZ2VbanNyY3R5cGVebmFtZT1Db21wb25lbnRDb3JlW2pjdV5uYW1lPUNvbXBvbmVudENvcmUuamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXVtqc3JjdHlwZV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb25bamN1Xm5hbWU9VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbi5qYXZhW2pwYWNrXm5hbWU9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlW2pzcmNyb290XnNyY2ZvbGRlcj1tb2R1bGVjb3JlLXNyY1twcm9qZWN0XnZjb3JlLnRhcmdldD11bWwyLk1vZGVsXmlkPW9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZV1dXV1dIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zSXJyWjhPOEVkbW1FYktFQm5XMEFRIiB5PSItMTg1Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8zSXJyWk1POEVkbW1FYktFQm5XMEFRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpVc2FnZSIgaHJlZj0idml6cmVmOi8vLyNqZGVwXnZjb3JlLnRhcmdldD11bWwyLlVzYWdlW2pzcmN0eXBlXm5hbWU9Q29tcG9uZW50Q29yZVtqY3VebmFtZT1Db21wb25lbnRDb3JlLmphdmFbanBhY2tebmFtZT1vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmVbanNyY3Jvb3Rec3JjZm9sZGVyPW1vZHVsZWNvcmUtc3JjW3Byb2plY3RedmNvcmUudGFyZ2V0PXVtbDIuTW9kZWxeaWQ9b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlXV1dXV1banNyY3R5cGVebmFtZT1VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uW2pjdV5uYW1lPVVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YVtqcGFja15uYW1lPW9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZVtqc3Jjcm9vdF5zcmNmb2xkZXI9bW9kdWxlY29yZS1zcmNbcHJvamVjdF52Y29yZS50YXJnZXQ9dW1sMi5Nb2RlbF5pZD1vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmVdXV1dXSIvPgotICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8zSXJyWmNPOEVkbW1FYktFQm5XMEFRIiBwb2ludHM9IlstMSwgNDA0OCwgLTMzMDgsIC0yNDYwXSRbMzMwNywgNTYzNSwgMCwgLTg3M10iLz4KLSAgICAgIDwvZWRnZXM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il93VUNIeE1POEVkbW1FYktFQm5XMEFRIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3dVQ0h4Y084RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il93VUNIeHNPOEVkbW1FYktFQm5XMEFRIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0Jhc2ljLnByb2ZpbGUudW1sMiNfNm1GUmdLODZFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQmFzaWMucHJvZmlsZS51bWwyI182bUZSZ0s4NkVkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVQ0h4OE84RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VDSHlNTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVQ0h5Y084RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvSW50ZXJtZWRpYXRlLnByb2ZpbGUudW1sMiNfQ3o3Y3NLODdFZGloOS1HRzVhZlEwZyIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il93VUNIeXNPOEVkbW1FYktFQm5XMEFRIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3dVSU9ZTU84RWRtbUViS0VCblcwQVEiIHNvdXJjZT0iYXR0cmlidXRlcyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il93VUlPWWNPOEVkbW1FYktFQm5XMEFRIiBrZXk9InZlcnNpb24iIHZhbHVlPSIwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX1BST0ZJTEVTL0NvbXBsZXRlLnByb2ZpbGUudW1sMiNfTTdwVGtLODdFZGloOS1HRzVhZlEwZyIvPgotICAgIDxpbXBvcnRlZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTDJfUFJPRklMRVMvQ29tcGxldGUucHJvZmlsZS51bWwyI19NN3BUa0s4N0VkaWg5LUdHNWFmUTBnIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVSU9Zc084RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VJT1k4TzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVSU9aTU84RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19hX1Mzd05XTEVkaXk0SXFQOHdoakZBP0RlZmF1bHQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX3dVSU9aY084RWRtbUViS0VCblcwQVEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfd1VJT1pzTzhFZG1tRWJLRUJuVzBBUSIgc291cmNlPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3dVSU9aOE84RWRtbUViS0VCblcwQVEiIGtleT0idmVyc2lvbiIgdmFsdWU9IjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I192amJ1d092SEVkaURYNWJqaTBpVlNBP0RlcGxveW1lbnQiLz4KLSAgICA8aW1wb3J0ZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50Ii8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfd1VJT2FNTzhFZG1tRWJLRUJuVzBBUSI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vVU1MMl9MSUJSQVJJRVMvVU1MMlByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sMiNfRWZSWm9LODZFZGllYVlneHRWV044USIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci08L3VtbDpNb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmUucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViNjI4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9tb2R1bGVjb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5FRURTTUlHUkFUSU5HPVRoaXMgcHJvamVjdCBuZWVkcyB0byBtaWdyYXRlIFdUUCBtZXRhZGF0YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmVOTFMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL21vZHVsZWNvcmVOTFMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2YjJkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9tb2R1bGVjb3JlTkxTLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1JlYWRfRXhjZXB0aW9uPUV4Y2VwdGlvbiB3aGlsZSBhY3F1aXJpbmcgYXJ0aWZhY3QgZWRpdCBmb3IgcmVhZC4KLUFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1dyaXRlX0V4Y2VwdGlvbj1FeGNlcHRpb24gd2hpbGUgYWNxdWlyaW5nIGFydGlmYWN0IGVkaXQgZm9yIHdyaXRlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9BcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9BcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3NDVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgRmFjYWRlIHBhdHRlcm4gZm9yIGFjY2Vzc2luZyBNb2R1bGUgQ29udGVudCBNZXRhbW9kZWxzIGZvciBXZWIgVG9vbHMgUGxhdGZvcm0gZmxleGlibGUKLSAqIG1vZHVsZXMuCi0gKiA8cD4KLSAqIEFydGlmYWN0RWRpdCBoaWRlcyB0aGUgbWFuYWdlbWVudCBvZiBhY2Nlc3NpbmcgZWRpdCBtb2RlbHMgKHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSkKLSAqIGNvcnJlY3RseS4gRWFjaCBwcm9qZWN0IG1heSBoYXZlIG11bHRpcGxlICh7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0pcyBkZXBlbmRpbmcgb24gdGhlIG51bWJlcgotICogb2YgbW9kdWxlcyBjb250YWluZWQgYnkgdGhlIHByb2plY3QuIENsaWVudHMgc2hvdWxkIHVzZSBBcnRpZmFjdEVkaXQgb3IgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3MKLSAqIHdoZW4gd29ya2luZyB3aXRoIHRoZSBjb250ZW50IG1vZGVscyBvZiBXVFAgbW9kdWxlcy4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBFYWNoIEFydGlmYWN0RWRpdCBmYWNhZGUgaXMgZGVzaWduZWQgdG8gbWFuYWdlIHRoZSBFZGl0TW9kZWwgbGlmZWN5Y2xlIGZvciBjbGllbnRzLiBIb3dldmVyLAotICogd2hpbGUgZWFjaCBBcnRpZmFjdEVkaXQgaXMgZGVzaWduZWQgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBuZWVkZWQsIGNsaWVudHMgbXVzdCBlbmZvcmNlIHRoZQotICogQXJ0aWZhY3RFZGl0IGxpZmVjeWNsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiBhY3F1aXJpbmcgYSBBcnRpZmFjdEVkaXQgaW5zdGFuY2UgZmFjYWRlIGlzIHRvCi0gKiB1c2Uge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvclJlYWQoV29ya2JlbmNoQ29tcG9uZW50KX0mbmJzcDtvcgotICoge0BzZWUgI2dldEFydGlmYWN0RWRpdEZvcldyaXRlKFdvcmtiZW5jaENvbXBvbmVudCl9LgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGNsaWVudHMgaGF2ZSBjb25jbHVkZWQgdGhlaXIgdXNlIG9mIHRoZSBpbnN0YW5jZSwgPGI+Y2xpZW50cyBtdXN0IGNhbGwge0BzZWUgI2Rpc3Bvc2UoKX0KLSAqIDwvYj4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgTW9kdWxlQ29yZU5hdHVyZQotICogQHNlZSBBcnRpZmFjdEVkaXRNb2RlbAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJRWRpdE1vZGVsSGFuZGxlciwgSUFkYXB0YWJsZXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQXJ0aWZhY3RFZGl0LmNsYXNzOwotCXByaXZhdGUgZmluYWwgQXJ0aWZhY3RFZGl0TW9kZWwgYXJ0aWZhY3RFZGl0TW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0JpbmFyeTsKLQlwcml2YXRlIEJpbmFyeUNvbXBvbmVudEhlbHBlciBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdE1vZGVsID0gbnVsbDsKLQkJcHJvamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuPC9wPgotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYoYU1vZHVsZS5pc0JpbmFyeSgpKXsKLQkJCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KGFNb2R1bGUpOwotCQl9Ci0JCWlmIChpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCWlmICghYU1vZHVsZS5pc0JpbmFyeSgpICYmIGlzVmFsaWRFZGl0YWJsZU1vZHVsZShhTW9kdWxlKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZSByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kCi0JICogbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8gbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYyB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdAotCSAqIHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tCi0JICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCB0cnVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgQXJ0aWZhY3RFZGl0KGFQcm9qZWN0LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICBBIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBoYXMgYSBtb2R1bGVUeXBlSWQgd2hpY2ggaGFzIGEgZGVmaW5lZAotCSAqICAgICAgICAge0BzZWUgSUVkaXRNb2RlbEZhY3Rvcnl9Jm5ic3A7YW5kIGlzIGNvbnRhaW5lZCBieSBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJaWYgKGFNb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8qIGFuZCB0aGUgY29udGFpbmluZyBwcm9qZWN0IG11c3QgYmUgcmVzb2x2ZWFibGUgYW5kIGFjY2Vzc2libGUgKi8KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgYW5BcnRpZmFjdEVkaXRNb2RlbCkgewotCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0JCWlzUmVhZE9ubHkgPSBhcnRpZmFjdEVkaXRNb2RlbC5pc1JlYWRPbmx5KCk7Ci0JCWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZCA9IGZhbHNlOwotCQkKLQkJcHJvamVjdCA9IGFuQXJ0aWZhY3RFZGl0TW9kZWwuZ2V0UHJvamVjdCgpOwotCX0KLQotCQotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQoSVZpcnR1YWxDb21wb25lbnQgYUJpbmFyeU1vZHVsZSl7Ci0JCWlmKCFhQmluYXJ5TW9kdWxlLmlzQmluYXJ5KCkpewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgY29uc3RydWN0b3IgaXMgb25seSBmb3IgYmluYXJ5IGNvbXBvbmVudHMuIik7Ci0JCX0KLQkJYmluYXJ5Q29tcG9uZW50SGVscGVyID0gaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihhQmluYXJ5TW9kdWxlKTsKLQkJYXJ0aWZhY3RFZGl0TW9kZWwgPSBudWxsOwotCQlpc1JlYWRPbmx5ID0gdHJ1ZTsKLQkJaXNCaW5hcnkgPSB0cnVlOwotCQlpc0FydGlmYWN0RWRpdE1vZGVsU2VsZk1hbmFnZWQgPSB0cnVlOwotCQlwcm9qZWN0ID0gbnVsbDsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LgotCSAqIDwvcD4KLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCWlmICh0b0FjY2Vzc0FzUmVhZE9ubHkpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbCA9IGFOYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSwgdGhpcyk7Ci0JCWVsc2UKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gYU5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFNb2R1bGUuZ2V0UHJvamVjdCgpKSwgdGhpcyk7Ci0JCWlzUmVhZE9ubHkgPSB0b0FjY2Vzc0FzUmVhZE9ubHk7Ci0JCWlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZCA9IHRydWU7Ci0JCXByb2plY3QgPSBhTmF0dXJlLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTmF0dXJlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Jm5ic3A7Zm9yIGFuIGFjY2Vzc2libGUgcHJvamVjdAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtwb2ludGluZyB0byBhIG1vZHVsZSBmcm9tIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0KLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMoYVByb2plY3QsdG9BY2Nlc3NBc1JlYWRPbmx5LGZhbHNlLG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAcGFyYW0gZm9yQ3JlYXRlCi0JICogQHBhcmFtIHByb2plY3RUeXBlCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUsIFN0cmluZyBwcm9qZWN0VHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQotCQl0aGlzKGFQcm9qZWN0LHRvQWNjZXNzQXNSZWFkT25seSxmb3JDcmVhdGUscHJvamVjdFR5cGUsbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpIHsKLQkJaWYoIXZhbGlkQXJ0aWZhY3RFZGl0KXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkQXJ0aWZhY3RFZGl0ID0gdHJ1ZTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWRBcnRpZmFjdEVkaXQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1hcmtJbnZhbGlkKCl7Ci0JCUxvZ2dlci5nbG9iYWwubG9nKExldmVsLldBUk5JTkcsICJJbnZhbGlkIEFydGlmYWN0IEVkaXQgYWNjZXNzIChtb2RlbCB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQpIik7Ci0JCXZhbGlkQXJ0aWZhY3RFZGl0ID0gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEBwYXJhbSBmb3JDcmVhdGUKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSBVc2VkIHRvIHBhc3Mgc3BlY2lmaWMgZWRpdE1vZGVsIGVkaXQgKFVzZWQgdG8gbG9va3VwIGZhY3RvcnkpCi0JICogQHBhcmFtIGVkaXRNb2RlbFBhcmFtcyAtIFByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgY2FjaGVLZXkgb24gZWRpdE1vZGVsRmFjdG9yeQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHksIGJvb2xlYW4gZm9yQ3JlYXRlLCBTdHJpbmcgcHJvamVjdFR5cGUsIE1hcCBlZGl0TW9kZWxQYXJhbXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0JCWlmIChhUHJvamVjdCA9PSBudWxsIHx8ICFhUHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcHJvamVjdDogIiArIGFQcm9qZWN0KTsKLQotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0KLQkJaWYgKG5hdHVyZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIE1vZHVsZUNvcmVOYXR1cmU6ICIgKyBhUHJvamVjdCk7Ci0JCWlmICghdmFsaWRQcm9qZWN0VmVyc2lvbihhUHJvamVjdCkpewotCQkJbWFya0ludmFsaWQoKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY29tcG9uZW50IGhhbmRsZTogIiArIGFQcm9qZWN0KTsKLQkJaWYgKCFmb3JDcmVhdGUgJiYgIWlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb21wb25lbnQgaGFuZGxlOiAiICsgYVByb2plY3QpOwotCQlwcm9qZWN0ID0gYVByb2plY3Q7Ci0JCVVSSSBjb21wb25lbnRVUkkgPSBudWxsOwotCQlpZiAoZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSAhPSBudWxsKQotCQkJY29tcG9uZW50VVJJID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkoYVByb2plY3QsZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSk7Ci0JCWVsc2UKLQkJCWNvbXBvbmVudFVSSSA9IE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKGFQcm9qZWN0KTsKLQotCQlpZiAodG9BY2Nlc3NBc1JlYWRPbmx5KQotCQkJYXJ0aWZhY3RFZGl0TW9kZWwgPSBuYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKGNvbXBvbmVudFVSSSwgdGhpcywgcHJvamVjdFR5cGUsIGVkaXRNb2RlbFBhcmFtcyk7Ci0JCWVsc2UKLQkJCWFydGlmYWN0RWRpdE1vZGVsID0gbmF0dXJlLmdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoY29tcG9uZW50VVJJLCB0aGlzLCBwcm9qZWN0VHlwZSwgZWRpdE1vZGVsUGFyYW1zKTsKLQkJaXNSZWFkT25seSA9IHRvQWNjZXNzQXNSZWFkT25seTsKLQkJaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkID0gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBkZWZpbmUgYW4gYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgZm9yIFhNTCBmaWxlIGNyZWF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCQotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamJERCI7Ci0JCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpCi0JCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYkREIjsKLQkJaWYgKGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyREQiOwotCQlpZiAoaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBjbGllbnRERCI7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdDIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRm9yY2UgYSBzYXZlIG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsLiBUaGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUuIFVubGVzcwotCSAqIHJlcXVpcmVkLCB1c2Uge0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDsgaW5zdGVhZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXIjc2F2ZSgpCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgTW9kdWxlQ29yZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCWlmIChpc1JlYWRPbmx5KCkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHZhbGlkYXRlRWRpdCgpLmlzT0soKSkKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnNhdmUoYU1vbml0b3IsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNhdmUgdGhlIHVuZGVybHlpbmcgbW9kZWwgb25seSBpZiBubyBvdGhlciBjbGllbnRzIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG1vZGVsLiBJZiB0aGUKLQkgKiBtb2RlbCBpcyBub3Qgc2hhcmVkLCBpdCB3aWxsIGJlIHNhdmVkLiBJZiBpdCBpcyBzaGFyZWQsIHRoZSBzYXZlIHdpbGwgYmUgZGVmZXJyZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI3NhdmVJZk5lY2Vzc2FyeSgpCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgTW9kdWxlQ29yZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQkJZWxzZSBpZiAodmFsaWRhdGVFZGl0KCkuaXNPSygpKQotCQkJYXJ0aWZhY3RFZGl0TW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KGFNb25pdG9yLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgZWRpdCBmb3IgcmVzb3VyY2Ugc3RhdGUKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoKSB7Ci0JCUlWYWxpZGF0ZUVkaXRDb250ZXh0IHZhbGlkYXRvciA9IChJVmFsaWRhdGVFZGl0Q29udGV4dCkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJVmFsaWRhdGVFZGl0Q29udGV4dC5DTEFTU19LRVkpOwotCQlyZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUoZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKLQkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlIEBvcGVyYXRpb25IYW5kbGVyLiAKLQkgKiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgYW5kIHRoZSBtb2RlbCBpcyBub3Qgc2hhcmVkLCAKLQkgKiB0aGUgZW50aXJlIGVkaXQgbW9kZWwgd2lsbCBiZSBzYXZlZC4gWW91IG1heSBwYXNzIGluIGEgYm9vbGVhbiA8Y29kZT53YXNEaXJ0eTwvY29kZT4gdG8KLQkgKiBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgZWRpdCBtb2RlbCB3YXMgZGlydHkgcHJpb3IgdG8gbWFraW5nIGFueSBjaGFuZ2VzIGFuZAotCSAqIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBib29sZWFuIHdhc0RpcnR5KSB7Ci0KLQkJaWYgKHNob3VsZFNhdmUob3BlcmF0aW9uSGFuZGxlciwgd2FzRGlydHkpKQotCQkJc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQllbHNlCi0JCQloYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGEgc2F2ZUlmTmVjZXNzYXJ5IG9yCi0JICogc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdCBkZXRlcm1pbmVzIG5vdCB0byBzYXZlLiBUaGlzIHByb3ZpZGVzIHN1YmNsYXNzZXMgd2l0aCBhbgotCSAqIG9wcG9ydHVuaXR5IHRvIGRvIHNvbWUgb3RoZXIgYWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFNhdmUoSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgYm9vbGVhbiB3YXNEaXJ0eSkgewotCQlyZXR1cm4gIXdhc0RpcnR5ID8gc2hvdWxkU2F2ZSgpIDogc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGEgc2F2ZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0VG9TYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJaWYgKG9wZXJhdGlvbkhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9wZXJhdGlvbkhhbmRsZXIuY2FuQ29udGludWUoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfIiksIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2VVUklzKHRydWUpKTsgLy8kTk9OLU5MUy0xJCA9ICJUaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIHNhdmVkIGJ1dCBhcmUgY3VycmVudGx5IHNoYXJlZCwgZG8geW91IHdhbnQgdG8gc2F2ZSBub3c/IgotCX0KLQotCS8qKgotCSAqIFNob3VsZCB0aGUgcmVzb3VyY2VzIGJlIHNhdmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKLQkJcmV0dXJuIHNob3VsZFNhdmUoKSB8fCBwcm9tcHRUb1NhdmUob3BlcmF0aW9uSGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFNhdmUoKSB7Ci0JCXJldHVybiAhaXNSZWFkT25seSgpICYmIGlzQXJ0aWZhY3RFZGl0TW9kZWxTZWxmTWFuYWdlZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG11c3QgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZCB3aGVuIHRoZXkgaGF2ZSBmaW5pc2hlZCB1c2luZyB0aGUgbW9kZWwsIGV2ZW4gaWYgdGhlCi0JICogQXJ0aWZhY3RFZGl0IGluc3RhbmNlIGZhY2FkZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJYmluYXJ5Q29tcG9uZW50SGVscGVyLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCX0gZWxzZSBpZiAoaXNBcnRpZmFjdEVkaXRNb2RlbFNlbGZNYW5hZ2VkICYmIGFydGlmYWN0RWRpdE1vZGVsICE9IG51bGwpCi0JCQlhcnRpZmFjdEVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHJvb3Qgb2JqZWN0IGZvciByZWFkIG9yIHdyaXRlIGFjY2VzcyAoZGVwZW5kaW5nIG9uIGhvdyB0aGUgY3VycmVudCBBcnRpZmFjdEVkaXQKLQkgKiB3YXMgbG9hZGVkKS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRDb250ZW50TW9kZWxSb290KCkgewotCQlpZihpc0JpbmFyeSgpKQotCQkgICByZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCWlmIChhcnRpZmFjdEVkaXRNb2RlbCE9bnVsbCkKLQkJCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0cmFjayBsaWZlY3lsY2UgZXZlbnRzIGZyb20gdGhlIHVuZGVybHlpbmcgRWRpdE1vZGVsLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgRWRpdE1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCQotCQl9IGVsc2UgewotCQkJaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmIGxpc3RlbmVyIT1udWxsKQotCQkJCWFydGlmYWN0RWRpdE1vZGVsLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSB0aGUgc3VwcGxpZWQgbGlzdGVuZXIKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIEVkaXRNb2RlbExpc3RlbmVyCi0JICogICAgICAgICAgIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQl9IGVsc2UgaWYgKGFydGlmYWN0RWRpdE1vZGVsIT1udWxsICYmICFhcnRpZmFjdEVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWFydGlmYWN0RWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIG1heSBiZSByZW1vdmVkIHNvb24uIEF2b2lkIGFkZGluZyBkZXBlbmRlbmNpZXMgdG8gaXQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyZWQgaW50ZXJuYWwgYW5kIG5vdCBwdWJsaXNoZWQgYXMgQVBJLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbCA9PSBlZGl0TW9kZWw7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVByb2plY3QgLSByZXR1cm5zIHRoZSBwcm9qZWN0IG9mIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gSVZpcnR1YWxDb21wb25lbnQgLSByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHdvcmtiZW5jaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQlyZXR1cm4gYmluYXJ5Q29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCgpOwotCQl9Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFZpcnR1YWxDb21wb25lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIG1hbmFnZWQgZWRpdCBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJaWYoaXNCaW5hcnkoKSl7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlciBnZXRCaW5hcnlDb21wb25lbnRIZWxwZXIoKSB7Ci0JCXJldHVybiBiaW5hcnlDb21wb25lbnRIZWxwZXI7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gVGhlIEVNRiBjb21tYW5kIHN0YWNrIG1hbmFnZWQgYnkgdGhlIHVuZGVybHlpbmcgZWRpdG1vZGVsCi0JICovCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5nZXRDb21tYW5kU3RhY2soKTsKLQl9Ci0JLyoqCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVXNlICgoQXJ0aWZhY3RFZGl0TW9kZWwpZ2V0QWRhcHRlcihBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOwotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZihpc0JpbmFyeSgpKXsKLQkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7Ci0JCX0KLQkJYXJ0aWZhY3RFZGl0TW9kZWwuZGVsZXRlUmVzb3VyY2UoYVJlc291cmNlKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBUaGUgaXNEaXJ0eSBmbGFnIGJhc2VkIHRoZSB1bmRlcmx5aW5nIGVkaXRtb2RlbCdzIGxpc3Qgb2YgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbC5pc0RpcnR5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gbW9kaWZ5IGFuIEFydGlmYWN0RWRpdCBpbnN0YW5jZSBmYWNhZGUgdGhhdCB3YXMgbG9hZGVkIGFzIHJlYWQtb25seS4iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBtb2RpZnkgYW4gQXJ0aWZhY3RFZGl0IGluc3RhbmNlIGZhY2FkZSB0aGF0IHdhcyBsb2FkZWQgYXMgYmluYXJ5LiIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJcmV0dXJuIGlzQmluYXJ5OwotCX0KLQkKLQkvKioKLQkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkCi0JICogaWYgdGhleSBhcmUgbm90IGFscmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VMb2FkS25vd25SZXNvdXJjZXMoKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkKLQkJfSBlbHNlIHsKLQkJCUxpc3QgdXJpcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKLQkJCVVSSSB1cmkgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7Ci0JCQkJdXJpID0gKFVSSSkgdXJpcy5nZXQoaSk7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZSh1cmkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIFJlc291cmNlIGZvciBAYVVyaS4KLQkgKiBAZGVwcmVjYXRlZCBVc2UgKChBcnRpZmFjdEVkaXRNb2RlbClnZXRBZGFwdGVyKEFydGlmYWN0RWRpdE1vZGVsLkFEQVBURVJfVFlQRSkpLmdldFJlc291cmNlKGFSZXNvdXJjZSk7Ci0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSBhVXJpKSB7Ci0JCWlmKGlzQmluYXJ5KCkpewotCQkJcmV0dXJuIGJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRSZXNvdXJjZShhVXJpKTsKLQkJfQotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShhVXJpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKQotCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCk7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0NvbXBvbmVudENvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMWUzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvQ29tcG9uZW50Q29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudEltcGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGhhbmRsZSBjcmVhdGlvbiBmYWN0b3J5IGZvciB0aGUgVmlydHVhbCBQYXRoIEFQSS4gQ2xpZW50cyBtYXkgdXNlCi0gKiB0aGlzIGNsYXNzIHRvIGNvbnZlcnQgUGxhdGZvcm0gSVJlc291cmNlIG1vZGVsIGVsZW1lbnRzIHRvIElWaXJ0dWFsUmVzb3VyY2UKLSAqIG1vZGVsIGVsZW1lbnRzLgotICogPHA+Ci0gKiBDb21wb25lbnRDb3JlIHByb3ZpZGVzIGEgY29uc2lzdGVudCBlbnRyeSBwb2ludCB0byB0aGUgSVZpcnR1YWwgUGF0aCBtb2RlbAotICogdGhhdCBhbGxvd3MgY2xpZW50cyB0byBncm91cCByZXNvdXJjZXMgdG9nZXRoZXIgaW4gbG9naWNhbCBjb2xsZWN0aW9ucyB3aXRoIGEKLSAqIHBhdGggc3RydWN0dXJlIHRoYXQgdmFyaWVzIGZyb20gdGhlaXIgYWN0dWFsIHNvdXJjZSBsb2NhdGlvbiBzdHJ1Y3R1cmVzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudENvcmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG5ldyBWaXJ0dWFsUmVzb3VyY2VbMF07Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBwcm9qZWN0IChhUHJvamVjdCkuIENvbXBvbmVudCBuYW1lcyBzaG91bGQgYmUKLQkgKiB1bmlxdWUgYWNyb3NzIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3QKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGFjY2Vzc2libGUgcHJvamVjdCB0byBjb250YWluIHRoZSBjb21wb25lbnQKLQkgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIGFuIElWaXJ0dWFsQ29tcG9uZW50IHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb3IKLQkgKiAgICAgICAgIG51bGwgaWYgcGFzc2VkIHByb2plY3QgZG9lcyBub3QgY29udGFpbiBNb2R1bGVDb3JlTmF0dXJlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJaWYgKGFQcm9qZWN0ID09IG51bGwgfHwgIWFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIElWaXJ0dWFsQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgKGFDb21wb25lbnROYW1lKQotCSAqIGNvbnRhaW5lZCBieSB0aGUgZ2l2ZW4gcHJvamVjdCAoYVByb2plY3QpLiBDb21wb25lbnQgbmFtZXMgc2hvdWxkIGJlCi0JICogdW5pcXVlIGFjcm9zcyBhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBhY2Nlc3NpYmxlIHByb2plY3QgdG8gY29udGFpbiB0aGUgY29tcG9uZW50Ci0JICogQHJldHVybiBBIGhhbmRsZSB0byBhbiBJVmlydHVhbENvbXBvbmVudCB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9yCi0JICogICAgICAgICBudWxsIGlmIHBhc3NlZCBwcm9qZWN0IGRvZXMgbm90IGNvbnRhaW4gTW9kdWxlQ29yZU5hdHVyZS4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjY3JlYXRlKGludCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBhTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxDb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYUNvbXBvbmVudE5hbWUpCi0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnROYW1lCi0JICogICAgICAgICAgICBBIG5hbWUgdG8gaWRlbnRpZnkgdGhlIGNvbXBvbmVudCwgdGhlIG5hbWUgY2FuIGJlCi0JICogICAgICAgICAgICBsaWIvJmx0O0Fic29sdXRlIHBhdGggb2YgYSBqYXImZ3Q7IG9yCi0JICogICAgICAgICAgICB2YXIvJmx0O0NMQVNTUEFUSF9WQVJJQUJMRS9saWJyYXJ5IG5hbWVyJmd0OwotCSAqIEByZXR1cm4gQSBoYW5kbGUgdG8gYW4gSVZpcnR1YWxDb21wb25lbnQgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGFDb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQoYVByb2plY3QsIGFDb21wb25lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxGb2xkZXIgd2l0aCBhIHJ1bnRpbWUgcGF0aCBzcGVjaWZpZWQgYnkgYVJ1bnRpbWVQYXRoCi0JICogY29udGFpbmVkIGJ5IGFQcm9qZWN0LCBpbiBhIGNvbXBvbmVudCBuYW1lZCBhQ29tcG9uZW50TmFtZS4gVGhlIHJlc3VsdGFudAotCSAqIElWaXJ0dWFsRm9sZGVyIG1heSBvciBtYXkgbm90IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgYWNjZXNzaWJsZSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIGNvbXBvbmVudAotCSAqIEBwYXJhbSBhUnVudGltZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBydW50aW1lIHBhdGggb2YgdGhlIElWaXJ0dWFsRm9sZGVyIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsRm9sZGVyIGNvbnRhaW5lZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB3aXRoIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcnVudGltZSBwYXRoCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNjcmVhdGUoaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjY3JlYXRlTGluayhJUGF0aCwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBDb21wb25lbnRJbXBsTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZUZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSVZpcnR1YWxGaWxlIHdpdGggYSBydW50aW1lIHBhdGggc3BlY2lmaWVkIGJ5IGFSdW50aW1lUGF0aAotCSAqIGNvbnRhaW5lZCBieSBhUHJvamVjdCwgaW4gYSBjb21wb25lbnQgbmFtZWQgYUNvbXBvbmVudE5hbWUuIElWaXJ0dWFsRmlsZXMKLQkgKiBjYW4gb25seSBiZSBjcmVhdGVkIGFzIGxpbmtzLiBVc2UKLQkgKiB7QGxpbmsgSVZpcnR1YWxSZXNvdXJjZSNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0gb3IKLQkgKiB7QGxpbmsgSVZpcnR1YWxGaWxlI2dldFVuZGVybHlpbmdGaWxlKCl9IHRvIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggcmVhbAotCSAqIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgYWNjZXNzaWJsZSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIGNvbXBvbmVudAotCSAqIEBwYXJhbSBhUnVudGltZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBydW50aW1lIHBhdGggb2YgdGhlIElWaXJ0dWFsRm9sZGVyIHRvIHJldHVybi4KLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsRmlsZSBjb250YWluZWQgYnkgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgd2l0aCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHJ1bnRpbWUgcGF0aAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNjcmVhdGVMaW5rKElQYXRoLCBpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxGaWxlIGNyZWF0ZUZpbGUoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlyZXR1cm4gbmV3IFZpcnR1YWxGaWxlKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBJVmlydHVhbFJlZmVyZW5jZSB0aGF0IGNhcHR1cmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4KLQkgKiBhQ29tcG9uZW50IGFuZCBhUmVmZXJlbmNlZENvbXBvbmVudC4gVGhlIElWaXJ0dWFsUmVmZXJlbmNlIHdpbGwgYmUgc3RvcmVkCi0JICogd2l0aCBhQ29tcG9uZW50IGFuZCB0YXJnZXQgYVJlZmVyZW5jZWRDb21wb25lbnQuIElWaXJ0dWFsUmVmZXJlbmNlcyBtYXkKLQkgKiBzcGFuIHByb2plY3RzLgotCSAqIAotCSAqIEBwYXJhbSBhQ29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHZhbGlkLCBleGlzdGluZyBJVmlydHVhbENvbXBvbmVudAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlZENvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZXhpc3RpbmcgSVZpcnR1YWxDb21wb25lbnQKLQkgKiBAcmV0dXJuIEFuIElWaXJ0dWFsUmVmZXJlbmNlIHRoYXQgY2FwdHVyZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCi0JICogICAgICAgICBhQ29tcG9uZW50IGFuZCBhUmVmZXJlbmNlZENvbXBvbmVudC4KLQkgKiBAc2VlIElWaXJ0dWFsUmVmZXJlbmNlI2NyZWF0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgY3JlYXRlUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbFJlZmVyZW5jZShhQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZSBjcmVhdGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxDb21wb25lbnQgYVJlZmVyZW5jZWRDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbFJlZmVyZW5jZShhQ29tcG9uZW50LCBhUmVmZXJlbmNlZENvbXBvbmVudCwgcnVudGltZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBJVmlydHVhbFJlc291cmNlcyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4gSVJlc291cmNlLgotCSAqIEVhY2ggSVJlc291cmNlIGNvdWxkIGJlIG1hcHBlZCB0byBtdWx0aXBsZSBjb21wb25lbnRzLCBhbmQgdGh1cyBhbiBhcnJheQotCSAqIG9mIGVhY2ggSVZpcnR1YWxSZXNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIElSZXNvdXJjZSB3aWxsIGJlIHJldHVybmVkLgotCSAqIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgYWxzbyBtYXAgdG8gb3RoZXIgZXhpc3RpbmcgSVJlc291cmNlcywgc28gdGhlCi0JICogbWFwcGluZyBpcyBub3QgMToxLgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIEFuIGFjY2Vzc2libGUgSVJlc291cmNlCi0JICogQHJldHVybiBBbiBhcnJheSBvZiBJVmlydHVhbFJlc291cmNlcyBmcm9tIHRoZSBtb2RlbCB0aGF0IHJlcHJlc2VudCB0aGUKLQkgKiAgICAgICAgIElSZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVzb3VyY2VbXSBjcmVhdGVSZXNvdXJjZXMoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJU3RydWN0dXJlRWRpdCBzZSA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvaik7Ci0JCQlpZiAoc2UgIT0gbnVsbCkgewotCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gc2UuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChhUmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBhUmVzb3VyY2UuZXhpc3RzKCkgPyBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FIDogUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfUkVTT1VSQ0VfQUxXQVlTKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoYVJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJCWZvdW5kUmVzb3VyY2VzLmFkZChuZXcgVmlydHVhbEZpbGUocHJvaiwgcmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpKTsKLQkJCQkJZWxzZQotCQkJCQkJZm91bmRSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKHByb2osIHJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2UgIT0gbnVsbCkgewotCQkJCXNlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmRSZXNvdXJjZXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoSVZpcnR1YWxSZXNvdXJjZVtdKSBmb3VuZFJlc291cmNlcy50b0FycmF5KG5ldyBWaXJ0dWFsUmVzb3VyY2VbZm91bmRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiBOT19SRVNPVVJDRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL0lFZGl0TW9kZWxIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvSUVkaXRNb2RlbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OWIxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvSUVkaXRNb2RlbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIFByb3ZpZGVzIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuIEVkaXQgTW9kZWwuIENsaWVudHMgd2hpY2ggdXNlCi0gKiBpbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIDxiPnJlcXVpcmVkIHRvIGludm9rZSB7QHNlZSAjZGlzcG9zZSgpfTwvYj4gd2hlbiB0aGV5IGhhdmUKLSAqIGNvbXBsZXRlZCB0aGVpciB1c2FnZS4gT25jZSBjbGllbnRzIGhhdmUgZGlzcG9zZWQgdGhhdCBpbnN0YW5jZSwgdGhleSB3aWxsIG5vdCBiZSBhYmxlIHRvIGludm9rZQotICoge0BzZWUgI3NhdmUoSVByb2dyZXNzTW9uaXRvcil9b3Ige0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDthbmQgc2hvdWxkIGJlIHdhcnkgb2YKLSAqIHVzaW5nIGFueSBtb2RlbCBvYmplY3RzIGFjcXVpcmVkIGZyb20gdGhlIGhhbmRsZXIsIGFzIHRoZXkgbWF5IGJlIG9yIGJlY29tZSBzdGFsZS4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogPHA+Ci0JICogRm9yY2UgYSBzYXZlIG9mIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgYW5kIGtlZXAgdHJhY2sgb2YgcHJvZ3Jlc3MgdXNpbmcgdGhlIHN1cHBsaWVkCi0JICogcHJvZ3Jlc3MgbW9uaXRvci4gQ2xpZW50cyBzaG91bGQgYXZvaWQgY2FsbGluZyB0aGlzIHZlcnNpb24gb2Ygc2F2ZSB1bmxlc3MgdGhleSBhcmUgY2VydGFpbgotCSAqIHRoZXkgcmVxdWlyZSB0aGUgbW9kZWwgdG8gYmUgc2F2ZWQuIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlCi0JICoge0BzZWUgI3NhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yKX0mbmJzcDtpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvciBvciBudWxsCi0JICovCi0Jdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2F2ZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsLCBpZiBubyBvdGhlciBjb25zdW1lcnMgYXJlIHVzaW5nIHRoZSBlZGl0IG1vZGVsLCBhbmQga2VlcAotCSAqIHRyYWNrIG9mIHByb2dyZXNzIHVzaW5nIHRoZSBzdXBwbGllZCBwcm9ncmVzcyBtb25pdG9yLiBUaGlzIHZlcnNpb24gb2Ygc2F2ZSB3aWxsIG9ubHkgc2F2ZSBpZgotCSAqIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIGNvbnN1bWVycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb25pdG9yCi0JICogICAgICAgICAgICBBIHZhbGlkIHByb2dyZXNzIG1vbml0b3Igb3IgbnVsbAotCSAqLwotCXZvaWQgc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ2xpZW50cyBtdXN0IGludm9rZSB0aGlzIG1ldGhvZCB3aGVuIHRoZXkgaGF2ZSBmaW5pc2hlZCB1c2luZyB0aGUgaGFuZGxlci4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvTW9kdWxlQ29yZU5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL01vZHVsZUNvcmVOYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlMzRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvTW9kdWxlQ29yZU5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5BcnRpZmFjdEVkaXRNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuTW9kdWxlQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiA8cD4KLSAqIEFsbG93cyBwcm9qZWN0cyB0byBzdXBwb3J0IGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlcy4gVGhlIE1vZHVsZUNvcmVOYXR1cmUgbWFuYWdlcyB0aGUKLSAqIGNvbmZpZ3VyYXRpb24gb2YgYSBtb2R1bGUgc3RydWN0dXJhbCBidWlsZGVyIHRoYXQgcHJlcGFyZXMgV29ya2JlbmNoTW9kdWxlcyBmb3IgZGVwbG95bWVudC4KLSAqIDwvcD4KLSAqIDxwPgotICogVG8gZGV0ZXJtaW5lIGlmIGEgcHJvamVjdCBzdXBwb3J0cyBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZXMsIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZQotICogTW9kdWxlQ29yZU5hdHVyZToKLSAqIDxwPgotICogPGNvZGU+KE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsKTwvY29kZT4KLSAqIDwvcD4KLSAqIDxwPgotICogSWYgdGhlIHByb2plY3QgaGFzIGEgTW9kdWxlQ29yZU5hdHVyZSwgdGhlbiB0aGUgcHJvamVjdCBzdXBwb3J0cyBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogSW4gZ2VuZXJhbCwgY2xpZW50cyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZSB1dGlsaXR5IG1ldGhvZHMgYXZhaWxhYmxlIG9uIHRoaXMgY2xhc3MgdG8gYWNxdWlyZQotICogdGhlIE1vZHVsZUNvcmVOYXR1cmUgaW5zdGFuY2UgZnJvbSBhIGdpdmVuIHByb2plY3QgKHtAc2VlICNnZXRNb2R1bGVDb3JlTmF0dXJlKElQcm9qZWN0KX0KLSAqICZuYnNwO29yIHRvIG1ha2UgYSBmbGV4aWJsZSBwcm9qZWN0IGZsZXhpYmxlIGJ5IGFkZGluZyBhIE1vZHVsZUNvcmVOYXR1cmUgKAotICoge0BzZWUgI2FkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShJUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvcil9KS4KLSAqIDwvcD4gCi0gKiA8YSBuYW1lPSJtb2RlbC1kaXNjdXNzaW9uIi8+Ci0qIDxhIG5hbWU9Im1vZHVsZS1zdHJ1Y3R1cmFsLW1vZGVsIi8+Ci0qIDxwPgotKiBFYWNoIE1vZHVsZUNvcmVOYXR1cmUgZnJvbSBhIGdpdmVuIHByb2plY3QgY2FuIHByb3ZpZGUgYWNjZXNzIHRvIHRoZQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBvZiB0aGUgcHJvamVjdC4KLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgaXMgYSBzdWJjbGFzcyBvZgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWx9Jm5ic3A7dGhhdCBtYW5hZ2VzCi0qIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4gQXMgYW4gRWRpdE1vZGVsLCB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0mbmJzcDsgcmVmZXJlbmNlcyBFTUYgcmVzb3VyY2VzLAotKiB0aGF0IGNvbnRhaW4gRU1GIG1vZGVscyAtLSBpbiB0aGlzIGNhc2UsIHRoZSBFTUYgbW9kZWwgb2YgPGk+LmNvbXBvbmVudCA8L2k+IGZpbGUuCi0qIDwvcD4KLSogPHA+Ci0qIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBFZGl0IEZhY2FkZSBwYXR0ZXJuICh2aWEKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdH0mbmJzcDsgb3Igb25lIGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPgotKiA8YSBuYW1lPSJhcnRpZmFjdC1lZGl0bW9kZWwiLz4KLSogPHA+Ci0qIEVhY2ggTW9kdWxlQ29yZU5hdHVyZSBmcm9tIGEgZ2l2ZW4gcHJvamVjdCBjYW4gYWxzbyBwcm92aWRlIGFjY2VzcyB0byB0aGUKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyBmb3IgZWFjaAotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwOyBjb250YWluZWQgYnkgdGhlIHByb2plY3QuIExpa2UKLSoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0sCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYSBzdWJjbGFzcyBvZgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWx9Jm5ic3A7IHRoYXQgY29udGFpbnMKLSogRU1GIHJlc291cmNlcywgd2hpY2ggaW4gdHVybiBjb250YWluIHRoZSBFTUYgbW9kZWxzIG9mIG1vZHVsZSBtZXRhZGF0YSBmaWxlcyAoc3VjaCBhcyBKMkVFCi0qIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMpLgotKiA8L3A+Ci0qIDxwPgotKiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaGlnaGxpZ2h0cyB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBzdWJjbGFzc2VzIG9mIEVkaXRNb2RlbCwgYW5kIHRoZQotKiByZWxhdGlvbnNoaXAgb2YgdGhlIEVkaXRNb2RlbCB0byB0aGUgRU1GIHJlc291cmNlcy4gSW4gdGhlIGRpYWdyYW0sICJNZXRhbW9kZWxSZXNvdXJjZSIgYW5kCi0qICJNZXRhbW9kZWxPYmplY3QiIGFyZSB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIHNwZWNpZmljIHN1YmNsYXNzZXMgb2YKLSoge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlfSZuYnNwO2FuZCB7QHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdH0mbmJzcDsKLSogcmVzcGVjdGl2ZWx5LgotKiA8L3A+Ci0qIDx0YWJsZSBjZWxsc3BhY2luZz0iMTAiIGNlbGxwYWRkaW5nPSIxMCI+Ci0qIDx0cj4KLSogPHRkPgotKiA8cD4KLSogPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L21ldGFtb2RlbF9jb21wb25lbnRzLmpwZyIgLz4KLSogPC9wPgotKiA8L3RkPgotKiA8L3RyPgotKiA8dHI+Ci0qIDx0ZD4KLSogPHA+Ci0qIDxpPkZpZ3VyZSAxOiBBIGNvbXBvbmVudCBkaWFncmFtIG9mIHRoZSBNb2R1bGUgRWRpdCBNb2RlbHMuIDwvaT4KLSogPC9wPgotKiA8L3RkPgotKiA8L3RyPgotKiA8L3RhYmxlPgotKiA8cD4KLSogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIEVkaXQgRmFjYWRlIHBhdHRlcm4gKHZpYQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0fSZuYnNwOyBvciB3aGF0IGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPgotKiA8YSBuYW1lPSJhY2Nlc3Nvci1rZXkiLz4KLSogPHA+Ci0qIEFsbCBFZGl0TW9kZWxzIGhhdmUgYSBsaWZlY3ljbGUgdGhhdCBtdXN0IGJlIGVuZm9yY2VkIHRvIGtlZXAgdGhlIHJlc291cmNlcyBsb2FkZWQgdGhhdCBhcmUgaW4KLSogdXNlLCBhbmQgdG8gdW5sb2FkIHJlc291cmNlcyB0aGF0IGFyZSBub3QgaW4gdXNlLiBUbyBhY2Nlc3MgYW4gRWRpdE1vZGVsLCBjbGllbnRzIGFyZSByZXF1aXJlZCB0bwotKiBzdXBwbHkgYW4gb2JqZWN0IHRva2VuIHJlZmVycmVkIHRvIGFzIGFuIGFjY2Vzc29yIGtleS4gVGhlIGFjY2Vzc29yIGtleSBhbGxvd3MgdGhlIGZyYW1ld29yayB0bwotKiBiZXR0ZXIgdHJhY2sgd2hpY2ggY2xpZW50cyBhcmUgdXNpbmcgdGhlIEVkaXRNb2RlbCwgYW5kIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBjbGllbnQgd2hpY2ggaGFzCi0qIGFjY2Vzc2VkIHRoZSBFZGl0TW9kZWwgd2l0aCBhbiBhY2Nlc3NvciBrZXkgbWF5IGludm9rZSBzYXZlKigpcyBvbiB0aGF0IEVkaXRNb2RlbC4KLSogPC9wPiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQjZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoSVByb2plY3QpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0I2dldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShJUHJvamVjdCkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0I2dldEFydGlmYWN0RWRpdEZvclJlYWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCkKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50KQotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlTmF0dXJlIGV4dGVuZHMgRWRpdE1vZGVsTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUsIElNb2R1bGVDb25zdGFudHMsIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9CVUlMREVSX0lEID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25idWlsZGVyIjsgLy8gcGx1Z2luIGlkIG9mIHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgY2FjaGVkTW9kZWw7Ci0JLyoqCi0JICogPHA+Ci0JICogRmluZCBhbmQgcmV0dXJuIHRoZSBNb2R1bGVDb3JlTmF0dXJlIG9mIGFQcm9qZWN0LCBpZiBhdmFpbGFibGUuCi0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqICAgICAgICAgICAgQW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGdldE1vZHVsZUNvcmVOYXR1cmUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChhUHJvamVjdCAhPSBudWxsICYmIGFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiAoTW9kdWxlQ29yZU5hdHVyZSkgYVByb2plY3QuZ2V0TmF0dXJlKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFkZHMgYSBNb2R1bGVDb3JlTmF0dXJlIHRvIHRoZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBBIGFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgdGltZSB0byBjb21wbGV0aW9uCi0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZU5hdHVyZSBvZiBhUHJvamVjdCwgaWYgaXQgZXhpc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVDb3JlTmF0dXJlIGFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShmaW5hbCBJUHJvamVjdCBhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGFQcm9qZWN0Lmhhc05hdHVyZShJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQpKQotCQkJCXJldHVybiBnZXRNb2R1bGVDb3JlTmF0dXJlKGFQcm9qZWN0KTsKLQotCQkJSUpvYk1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwkKLQkJCWlmIChhTW9uaXRvciAhPSBudWxsKQotCQkJCWFNb25pdG9yLmJlZ2luVGFzaygiQWRkIE1vZHVsZUNvcmUgTmF0dXJlIiwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1hbmFnZXIuYmVnaW5SdWxlKHJvb3QsIGFNb25pdG9yKTsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGFQcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJU3RyaW5nW10gY3VycmVudE5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJCVN0cmluZ1tdIG5ld05hdHVyZUlkcyA9IG5ldyBTdHJpbmdbY3VycmVudE5hdHVyZUlkcy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnROYXR1cmVJZHMsIDAsIG5ld05hdHVyZUlkcywgMCwgY3VycmVudE5hdHVyZUlkcy5sZW5ndGgpOwotCQkJCW5ld05hdHVyZUlkc1tjdXJyZW50TmF0dXJlSWRzLmxlbmd0aF0gPSBJTW9kdWxlQ29uc3RhbnRzLk1PRFVMRV9OQVRVUkVfSUQ7Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZUlkcyk7Ci0JCQkJYVByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIGFNb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7IAkJCQkKLQkJCX0gZmluYWxseSB7Ci0JCQkJbWFuYWdlci5lbmRSdWxlKHJvb3QpOwotCQkJfSAJCQkKLQkJCWlmIChhTW9uaXRvciAhPSBudWxsKQotCQkJCWFNb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8qIFJldHVybiB0aGUgbmV3IG5hdHVyZSAqLwotCQlyZXR1cm4gZ2V0TW9kdWxlQ29yZU5hdHVyZShhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIGEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwO2ZvciByZWFkLW9ubHkgYWNjZXNzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSBNb2R1bGVDb3JlI2dldE1vZHVsZUNvcmVGb3JSZWFkKElQcm9qZWN0KX0mbmJzcDt0byB3b3JrCi0JICogd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVscyBvZiBmbGV4aWJsZSBwcm9qZWN0cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkKLQkgKiAgICAgICAgICAgIFR5cGljYWxseSBjbGllbnQgc3VwcGxpZXMgdGhlIG9iamVjdCB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QsIG9yIGEgcHJveHkgKAotCSAqICAgICAgICAgICAgPGNvZGU+bmV3IE9iamVjdCgpPC9jb2RlPikgaW4gdGhlIGNhc2Ugb2Ygb3RoZXIgc3RhdGljIG1ldGhvZHMgcmVxdWVzdGluZyBhCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9LgotCSAqIEByZXR1cm4gQSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Zm9yIHRoZSBwcm9qZWN0IG9mIHRoZSBjdXJyZW50IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvclJlYWQoT2JqZWN0IGFuQWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIChNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwpIGdldEVkaXRNb2RlbEZvclJlYWQoTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeS5NT0RVTEVfU1RSVUNUVVJBTF9NT0RFTF9JRCwgYW5BY2Nlc3NvcktleSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIGEge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwO2ZvciB3cml0ZSBhY2Nlc3MuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlIE1vZHVsZUNvcmUjZ2V0TW9kdWxlQ29yZUZvcldyaXRlKElQcm9qZWN0KX0mbmJzcDt0byB3b3JrCi0JICogd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVscyBvZiBmbGV4aWJsZSBwcm9qZWN0cy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IGlzIGFuZCA8YQotCSAqIGhyZWY9IiNtb2R1bGUtc3RydWN0dXJhbC1tb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkKLQkgKiAgICAgICAgICAgIFR5cGljYWxseSBjbGllbnQgc3VwcGxpZXMgdGhlIG9iamVjdCB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QsIG9yIGEgcHJveHkgKAotCSAqICAgICAgICAgICAgPGNvZGU+bmV3IE9iamVjdCgpPC9jb2RlPikgaW4gdGhlIGNhc2Ugb2Ygb3RoZXIgc3RhdGljIG1ldGhvZHMgcmVxdWVzdGluZyBhCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9LgotCSAqIEByZXR1cm4gQSB7QHNlZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Zm9yIHRoZSBwcm9qZWN0IG9mIHRoZSBjdXJyZW50IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvcldyaXRlKE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiAoTW9kdWxlU3RydWN0dXJhbE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JXcml0ZShNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5Lk1PRFVMRV9TVFJVQ1RVUkFMX01PREVMX0lELCBhbkFjY2Vzc29yS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyB0byB3b3JrIHdpdGggdGhlIHVuZGVybHlpbmcgY29udGVudCBvZiBhbgotCSAqIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0LiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH1zCi0JICogYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudCBtb2RlbHMgZm9yIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH1zLiBJbgotCSAqIGdlbmVyYWwsIGEgY29udGVudCBtb2RlbCB3aWxsIGNvbnRhaW4gYW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUncyByZWxldmFudAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHBvc3NpYmx5IG90aGVyIEVNRiByZXNvdXJjZXMgYXMgd2VsbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICoge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG1heSBub3QgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbC4gQ2xpZW50cyB0aGF0IG5lZWQgdG8gbWFrZSBjaGFuZ2VzCi0JICogdG8gdGhlIHVuZGVybHlpbmcgTW9kdWxlIENvbnRlbnQgTW9kdWxlLCBhbmQgdGhhdCBjaG9vc2UgdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZQotCSAqIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyBzaG91bGQgdXNlIHtAc2VlICNnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSwgT2JqZWN0KX0uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIENsaWVudHMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlIEFydGlmYWN0RWRpdH0mbmJzcDtvciBvbmUgb2YgaXRzIHJlbGV2YW50IHN1YmNsYXNzZXMgdG8KLQkgKiB3b3JrIHdpdGggdGhlIG1vZHVsZSBjb250ZW50IG1vZGVsLCBpbnN0ZWFkIG9mIHdvcmtpbmcgd2l0aCBkaXJlY3RseSB3aXRoIHRoZSBFZGl0TW9kZWw6Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIDxjb2RlPkFydGlmYWN0RWRpdCBlZGl0RmFjYWRlID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoYVdvcmtiZW5jaE1vZHVsZSk7PC9jb2RlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBXaGVuIGEgY2xpZW50IGlzIGF3YXJlIG9mIHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgbW9kdWxlLCBtb3JlIHNwZWNpZmljIEVkaXQgRmFjYWRlcyBtYXkgYmUKLQkgKiBhY3F1aXJlZDoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+V2ViRWRpdCBlZGl0RmFjYWRlID0gV2ViRWRpdC5nZXRXZWJFZGl0Rm9yUmVhZChhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIGEgcGFydGljdWxhciBFZGl0IEZhY2FkZSBpcyBub3QgYXBwbGljYWJsZSB0byB0aGUgc3VwcGxpZWQge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0sIHRoZW4KLQkgKiA8Yj5udWxsIDwvYj4gd2lsbCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYW5kIDxhCi0JICogaHJlZj0iI2FydGlmYWN0LWVkaXRtb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIFVSSSBvZiB0aGUgZm9ybSAibW9kdWxlOi9yZXNvdXJjZS8gPHByb2plY3QtbmFtZT4vCi0JICogICAgICAgICAgICA8bW9kdWxlLWRlcGxveWVkLW5hbWU+IgotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5Ci0JICogICAgICAgICAgICBUeXBpY2FsbHkgY2xpZW50IHN1cHBsaWVzIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgbWV0aG9kLCBvciBhIHByb3h5ICgKLQkgKiAgICAgICAgICAgIDxjb2RlPm5ldyBPYmplY3QoKTwvY29kZT4pIGluIHRoZSBjYXNlIG9mIG90aGVyIHN0YXRpYyBtZXRob2RzIHJlcXVlc3RpbmcgYQotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfS4KLQkgKiBAcmV0dXJuCi0JICogQHNlZSBBcnRpZmFjdEVkaXQKLQkgKiBAc2VlIEFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXkpIHsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFNb2R1bGVVUkkgLSB1c2VkIHRvIGxvb2t1cCBwcm9qZWN0Ci0JICogQHBhcmFtIGFuQWNjZXNzb3JLZXkgLSB1c2VkIHRvIHNldCBjbGllbnQgYWNjZXNzb3IKLQkgKiBAcGFyYW0gcHJvamVjdFR5cGUgLSB1c2VkIHRvIGRldGVybWluZSBlZGl0bW9kZWwgZmFjdG9yeQotCSAqIEBwYXJhbSBwYXJhbXMgLSBwYXNzZWQgZm9yIHNwZWNpYWxpemVkIHByb2Nlc3NpbmcgaW4gZmFjdG9yeQotCSAqIEByZXR1cm4gQXJ0aWZhY3RFZGl0TW9kZWwgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSwgU3RyaW5nIHByb2plY3RUeXBlLCBNYXAgcGFyYW1zKSB7Ci0JCQotCQlpZiAocGFyYW1zID09IG51bGwpCi0JCQlwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9NT0RVTEVfVVJJLCBhTW9kdWxlVVJJKTsKLQkJaWYgKHByb2plY3RUeXBlICE9bnVsbCkKLQkJCXJldHVybiAoQXJ0aWZhY3RFZGl0TW9kZWwpIGdldEVkaXRNb2RlbEZvclJlYWQocHJvamVjdFR5cGUsIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSk7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoYVByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBlZGl0TW9kZWxJRHMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0TW9kZWxJRHMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8ZWRpdE1vZGVsSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGVkaXRNb2RlbElEc1tpXSk7Ci0JCQkJCQlpZiAoZmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKSB7Ci0JCQkJCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElEc1tpXSwgYW5BY2Nlc3NvcktleSwgcGFyYW1zKTsKLQkJCQkJCQlpZiAoZWRpdE1vZGVsICE9bnVsbCkKLQkJCQkJCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIElnbm9yZSBleGNlcHRpb25zIHRoYXQgY29tZSBmcm9tIFByb2plY3RGYWNldHNNYW5hZ2VyCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoU3RhdHVzLkVSUk9SLCBNb2R1bGVDb3JlTWVzc2FnZXMuQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfUmVhZF9FeGNlcHRpb24sIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1JlYWRfRXhjZXB0aW9uLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChVUkkgYU1vZHVsZVVSSSwgT2JqZWN0IGFuQWNjZXNzb3JLZXksIFN0cmluZyBwcm9qZWN0VHlwZSkgewotCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZChhTW9kdWxlVVJJLCBhbkFjY2Vzc29yS2V5LCBwcm9qZWN0VHlwZSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfSZuYnNwOyB0byB3b3JrIHdpdGggdGhlIHVuZGVybHlpbmcgY29udGVudCBvZiBhbgotCSAqIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0LiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH1zCi0JICogYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudCBtb2RlbHMgZm9yIGluZGl2aWR1YWwge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH1zLiBJbgotCSAqIGdlbmVyYWwsIGEgY29udGVudCBtb2RlbCB3aWxsIGNvbnRhaW4gYW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2R1bGUncyByZWxldmFudAotCSAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHBvc3NpYmx5IG90aGVyIEVNRiByZXNvdXJjZXMgYXMgd2VsbC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICoge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9cyB0aGF0IGFyZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgTW9kdWxlIENvbnRlbnQgTWV0YW1vZGVsLiBGb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBleHBlY3QgdG8KLQkgKiBtYWtlIG1vZGlmaWNhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHtAc2VlICNnZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQoVVJJLCBPYmplY3QpfQotCSAqICZuYnNwOyBpbnN0ZWFkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QHNlZSBBcnRpZmFjdEVkaXR9Jm5ic3A7b3Igb25lIG9mIGl0cyByZWxldmFudCBzdWJjbGFzc2VzIHRvCi0JICogd29yayB3aXRoIHRoZSBtb2R1bGUgY29udGVudCBtb2RlbCwgaW5zdGVhZCBvZiB3b3JraW5nIHdpdGggZGlyZWN0bHkgd2l0aCB0aGUgRWRpdE1vZGVsOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnRpZmFjdEVkaXQgZWRpdEZhY2FkZSA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JXcml0ZShhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIFdoZW4gYSBjbGllbnQgaXMgYXdhcmUgb2YgdGhlIHVuZGVybHlpbmcgdHlwZSBvZiBtb2R1bGUsIG1vcmUgc3BlY2lmaWMgRWRpdCBGYWNhZGVzIG1heSBiZQotCSAqIGFjcXVpcmVkOgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Y29kZT5XZWJFZGl0IGVkaXRGYWNhZGUgPSBXZWJFZGl0LmdldFdlYkVkaXRGb3JXcml0ZShhV29ya2JlbmNoTW9kdWxlKTs8L2NvZGU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIGEgcGFydGljdWxhciBFZGl0IEZhY2FkZSBpcyBub3QgYXBwbGljYWJsZSB0byB0aGUgc3VwcGxpZWQge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudH0sIHRoZW4KLQkgKiA8Yj5udWxsIDwvYj4gd2lsbCBiZSByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogU2VlIHRoZSBkaXNjdXNzaW9uIHdoYXQgYSB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDsgaXMgYW5kIDxhCi0JICogaHJlZj0iI2FydGlmYWN0LWVkaXRtb2RlbCI+aG93IGl0IHJlbGF0ZXMgdG8gdGhlIE1vZHVsZSBDb250ZW50IE1ldGFtb2RlbCA8L2E+LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBBbHNvIHNlZSB0aGUgZGlzY3Vzc2lvbiBvZiA8YSBocmVmPSIjYWNjZXNzb3Ita2V5Ij50aGUgcHVycG9zZSBvZiBhbiBhY2Nlc3NvciBrZXkgPC9hPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIFVSSSBvZiB0aGUgZm9ybSAibW9kdWxlOi9yZXNvdXJjZS8gPHByb2plY3QtbmFtZT4vCi0JICogICAgICAgICAgICA8bW9kdWxlLWRlcGxveWVkLW5hbWU+IgotCSAqIEBwYXJhbSBhbkFjY2Vzc29yS2V5Ci0JICogICAgICAgICAgICBUeXBpY2FsbHkgY2xpZW50IHN1cHBsaWVzIHRoZSBvYmplY3QgdGhhdCBpbnZva2VkIHRoaXMgbWV0aG9kLCBvciBhIHByb3h5ICgKLQkgKiAgICAgICAgICAgIDxjb2RlPm5ldyBPYmplY3QoKTwvY29kZT4pIGluIHRoZSBjYXNlIG9mIG90aGVyIHN0YXRpYyBtZXRob2RzIHJlcXVlc3RpbmcgYQotCSAqICAgICAgICAgICAge0BzZWUgTW9kdWxlU3RydWN0dXJhbE1vZGVsfS4KLQkgKiBAcmV0dXJuCi0JICogQHNlZSBBcnRpZmFjdEVkaXQKLQkgKiBAc2VlIEFydGlmYWN0RWRpdCNnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5KSB7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKGFNb2R1bGVVUkksIGFuQWNjZXNzb3JLZXksIG51bGwpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSSAtIHVzZWQgdG8gbG9va3VwIHByb2plY3QKLQkgKiBAcGFyYW0gYW5BY2Nlc3NvcktleSAtIHVzZWQgdG8gc2V0IGNsaWVudCBhY2Nlc3NvcgotCSAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIHVzZWQgdG8gZGV0ZXJtaW5lIGVkaXRtb2RlbCBmYWN0b3J5Ci0JICogQHBhcmFtIHBhcmFtcyAtIHBhc3NlZCBmb3Igc3BlY2lhbGl6ZWQgcHJvY2Vzc2luZyBpbiBmYWN0b3J5Ci0JICogQHJldHVybiBBcnRpZmFjdEVkaXRNb2RlbCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKFVSSSBhTW9kdWxlVVJJLCBPYmplY3QgYW5BY2Nlc3NvcktleSwgU3RyaW5nIHByb2plY3RUeXBlLCBNYXAgcGFyYW1zKSB7Ci0JCQotCQlpZiAocGFyYW1zID09IG51bGwpCi0JCQlwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9NT0RVTEVfVVJJLCBhTW9kdWxlVVJJKTsKLQkJaWYgKHByb2plY3RUeXBlICE9IG51bGwpCi0JCQlyZXR1cm4gIChBcnRpZmFjdEVkaXRNb2RlbCkgZ2V0RWRpdE1vZGVsRm9yV3JpdGUocHJvamVjdFR5cGUsIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBhUHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVVSSSk7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoYVByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBlZGl0TW9kZWxJRHMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0TW9kZWxJRHMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8ZWRpdE1vZGVsSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGVkaXRNb2RlbElEc1tpXSk7Ci0JCQkJCQlpZiAoZmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKSB7Ci0JCQkJCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBnZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRHNbaV0sIGFuQWNjZXNzb3JLZXksIHBhcmFtcyk7Ci0JCQkJCQkJaWYgKGVkaXRNb2RlbCAhPW51bGwpCi0JCQkJCQkJCXJldHVybiBlZGl0TW9kZWw7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZ25vcmUgZXhjZXB0aW9ucyB0aGF0IGNvbWUgZnJvbSBQcm9qZWN0RmFjZXRzTWFuYWdlcgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKFN0YXR1cy5FUlJPUiwgTW9kdWxlQ29yZU1lc3NhZ2VzLkFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1dyaXRlX0V4Y2VwdGlvbiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoU3RhdHVzLkVSUk9SLCBNb2R1bGVDb3JlTWVzc2FnZXMuQWNxdWlyaW5nX0FydGlmYWN0RWRpdF9Gb3JfV3JpdGVfRXhjZXB0aW9uLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGUoVVJJIGFNb2R1bGVVUkksIE9iamVjdCBhbkFjY2Vzc29yS2V5LCBTdHJpbmcgcHJvamVjdFR5cGUpIHsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKGFNb2R1bGVVUkksIGFuQWNjZXNzb3JLZXksIHByb2plY3RUeXBlLCBwYXJhbXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmF0dXJlSUQoKSB7Ci0JCXJldHVybiBNT0RVTEVfTkFUVVJFX0lEOwotCX0KLQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5JRU1GQ29udGV4dENvbnRyaWJ1dG9yI3ByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UpCi0JICovCi0JcHVibGljIHZvaWQgcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCQlpZiAoZW1mQ29udGV4dCA9PSBhTmF0dXJlKQotCQkJcmV0dXJuOwotCQllbWZDb250ZXh0ID0gYU5hdHVyZTsKLQkJZ2V0RW1mQ29udGV4dCgpLnNldERlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5KHRydWUpOwotCQkvLyBPdmVycmlkaW5nIHN1cGVyY2xhc3MgdG8gdXNlIG91ciBvd24gVVJJIGNvbnZlcnRlciwgd2hpY2gga25vd3MgYWJvdXQgYmluYXJ5IHByb2plY3RzCi0JCVByb2plY3RSZXNvdXJjZVNldCBwcm9qZWN0UmVzb3VyY2VTZXQgPSBhTmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCXByb2plY3RSZXNvdXJjZVNldC5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSk7Ci0JCXByb2plY3RSZXNvdXJjZVNldC5zZXRVUklDb252ZXJ0ZXIoY3JlYXRlVVJJQ29udmVydGVyKGdldFByb2plY3QoKSwgcHJvamVjdFJlc291cmNlU2V0KSk7Ci0JCQotCQkvLyBpbml0aWFsaXplQ2FjaGVFZGl0TW9kZWwoKTsKLQkJLy8gYWRkQWRhcHRlckZhY3RvcmllcyhzZXQpOwotCQkvLyBzZXQuZ2V0U3luY2hyb25pemVyKCkuYWRkRXh0ZW5kZXIodGhpcyk7IC8vIGFkZGVkIHNvIHdlIGNhbiBiZSBpbmZvcm1lZCBvZiBjbG9zZXMgdG8gdGhlCi0JCS8vIG5ldyBKMkVFUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoc2V0KTsgLy8gVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIFVSSUNvbnZlcnRlciBpcwotCQljYWNoZU1vZHVsZVN0cnVjdHVyYWxNb2RlbCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZS5wcmltQ29uZmlndXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIucHJpbUNvbmZpZ3VyZSgpOwotCQkvLyBhZGQgVmFsaWRhdGlvbiBCdWlsZGVyIHRvIGFsbCBmbGV4IFByb2plY3QncyBidWlsZGVyIGxpc3QKLQkJUHJvamVjdFV0aWxpdGllcy5hZGRUb0J1aWxkU3BlYyhWQUxJREFUSU9OX0JVSUxERVJfSUQscHJvamVjdCk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKElQcm9qZWN0IGFQcm9qZWN0LCBQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0ICkgewotCQlDb21wb25lbnRDb3JlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IG5ldyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKGFQcm9qZWN0LCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOyAKLQkJdXJpQ29udmVydGVyLmFkZElucHV0Q29udGFpbmVyKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiB1cmlDb252ZXJ0ZXI7Ci0JfQotCQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJ5IGNsaWVudHMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIGdldEVtZkNvbnRleHRCYXNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklFTUZDb250ZXh0Q29udHJpYnV0b3Ijc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCQkvL0RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQgYnkgY2xpZW50cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmUjY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvbmZpZ3VyZSgpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKSB7Ci0JCWlmIChjYWNoZWRNb2RlbCA9PSBudWxsKQotCQkJY2FjaGVkTW9kZWwgPSBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBNT0RVTEVfUExVR19JTl9JRDsKLQl9Ci0KLQlwdWJsaWMgRWRpdE1vZGVsIGdldEV4aXN0aW5nRWRpdE1vZGVsKFN0cmluZyBhcnRpZmFjdEVkaXRNb2RlbElkLE1hcCBwYXJhbXMsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlyZXR1cm4gZ2V0RW1mQ29udGV4dCgpLmdldEV4aXN0aW5nRWRpdE1vZGVsKGFydGlmYWN0RWRpdE1vZGVsSWQscGFyYW1zLGlzUmVhZE9ubHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlzdXBlci5zaHV0ZG93bigpOwotCQlpZiAoY2FjaGVkTW9kZWwgIT0gbnVsbCkgewotCQkJY2FjaGVkTW9kZWwuZGlzcG9zZSgpOwotCQkJY2FjaGVkTW9kZWwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5JU3luY2hyb25pemVyRXh0ZW5kZXIjcHJvamVjdENoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5PUEVOKQotCQkJaWYgKGNhY2hlZE1vZGVsID09IG51bGwpCi0JCQkJY2FjaGVkTW9kZWwgPSBnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guSVN5bmNocm9uaXplckV4dGVuZGVyI3Byb2plY3RDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2plY3RDbG9zZWQoKSB7Ci0JCXRoaXMuZW1mQ29udGV4dCA9IG51bGw7Ci0JCWlmIChjYWNoZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQljYWNoZWRNb2RlbC5kaXNwb3NlKCk7Ci0JCQljYWNoZWRNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTdjMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL1VucmVzb2x2ZWFibGVVUklFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaHJvd24gd2hlbmV2ZXIgYSBVUkkgY2Fubm90IGJlIGFwcHJvcHJpYXRlbHkgcmVzb2x2ZWQuCi0gKiA8L3A+Ci0gKiAgCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihVUkkgYW5VbnJlc29sdmVhYmxlVVJJKSB7Ci0JCXN1cGVyKCJDb3VsZCBub3QgcmVzb2x2ZTogIiArIGFuVW5yZXNvbHZlYWJsZVVSSSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWE3MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQWN0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIKLQotICAgIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZwotICAgIAotewotICAgIHByaXZhdGUgZmluYWwgSURhdGFNb2RlbCBkbTsKLSAgICAKLSAgICBwdWJsaWMgRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyKCBmaW5hbCBJRGF0YU1vZGVsIGRtICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZG0gPSBkbTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbiggZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgKQotICAgIHsKLSAgICAgICAgZG0uc2V0UHJvcGVydHkoIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgZnYgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZSggZmluYWwgU3RyaW5nIHBqbmFtZSApCi0gICAgewotICAgICAgICBkbS5zZXRTdHJpbmdQcm9wZXJ0eSggSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHBqbmFtZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotICAgIAotICAgICAgICBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUwotICAgICAgICAgICAgPSB7IElBY3Rpb25Db25maWcuY2xhc3MgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggYWRhcHRlclR5cGUgPT0gSUFjdGlvbkNvbmZpZy5jbGFzcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWNldERhdGFNb2RlbENvbmZpZ0FkYXB0ZXIoIChJRGF0YU1vZGVsKSBhZGFwdGFibGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmIzNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uRmFjZXREYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uLlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX09QRVJBVElPTiA9ICJGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1BST0pFQ1RfTkFNRSk7Ci0JCW5hbWVzLmFkZChGQUNFVF9JRCk7Ci0JCW5hbWVzLmFkZChGQUNFVF9WRVJTSU9OX1NUUik7Ci0JCW5hbWVzLmFkZChGQUNFVF9UWVBFKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX1ZFUlNJT04pOwotCQluYW1lcy5hZGQoRkFDRVRfQUNUSU9OKTsKLQkJbmFtZXMuYWRkKFNIT1VMRF9FWEVDVVRFKTsKLQkJbmFtZXMuYWRkKE5PVElGSUNBVElPTl9PUEVSQVRJT04pOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCkpLmdldFZlcnNpb24oZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfVkVSU0lPTl9TVFIpKTsKLQkJfSBlbHNlIGlmIChGQUNFVF9BQ1RJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbigoVHlwZSkgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSksIChJUHJvamVjdEZhY2V0VmVyc2lvbikgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTiksIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChTSE9VTERfRVhFQ1VURS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChOT1RJRklDQVRJT05fT1BFUkFUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gZ2V0RmFjZXROb3RpZmljYXRpb25PcGVyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEZBQ0VUX0FDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRGYWNldE5vdGlmaWNhdGlvbk9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkltcGwobmV3IEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uKHRoaXMubW9kZWwpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQkJcmV0dXJuICJGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5vdGlmaWNhdGlvbi4iICsgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfVFlQRSkgKyAiLiIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9JRCk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkIAotCQkJfQotCi0JCQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCXJldHVybiBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDIyMzQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX1BST0pFQ1RfRE0gPSAiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuTUFTVEVSX1BST0pFQ1RfRE0iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChNQVNURVJfUFJPSkVDVF9ETSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHVibGljIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1RZUEUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBGQUNFVF9UWVBFX0lOU1RBTEw7Ci0JCX0gZWxzZSBpZiAoRkFDRVRfVkVSU0lPTl9TVFIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCQkJcmV0dXJuIHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfSUQpKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJcmV0dXJuIHZlcnNpb247Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChGQUNFVF9UWVBFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhGQUNFVF9WRVJTSU9OKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmVxdWFscyhwcm9wZXJ0eVZhbHVlKSkgewotCQkJCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobnVsbCAhPSBwcm9wZXJ0eVZhbHVlICYmIEZBQ0VUX1ZFUlNJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIHByb3BlcnR5VmFsdWU7Ci0JCQlzZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9yczsKLQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKG51bGwgPT0gY2FjaGVkVmVyc2lvbkRlc2NyaXB0b3JzKSB7Ci0JCQkJU2V0IHZlcnNpb25zID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX0lEKSkuZ2V0VmVyc2lvbnMoKTsKLQkJCQlMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5saXN0KENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHZlcnNpb25zKSk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcigpewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJCXJldHVybiAoKElQcm9qZWN0RmFjZXRWZXJzaW9uKW8xKS5nZXRWZXJzaW9uU3RyaW5nKCkuY29tcGFyZVRvKCgoSVByb2plY3RGYWNldFZlcnNpb24pbzIpLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQljYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWNhY2hlZFZlcnNpb25EZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IodmVyc2lvbiwgdmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uRGVzY3JpcHRvcnM7Ci0JCX0KLQkJaWYgKEZBQ0VUX1ZFUlNJT05fU1RSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAobnVsbCA9PSBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnMpIHsKLQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSB2ZXJzaW9uRGVzY3JpcHRvcnMgPSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRkFDRVRfVkVSU0lPTik7Ci0JCQkJY2FjaGVkVmVyc2lvblN0cmluZ0Rlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt2ZXJzaW9uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZFZlcnNpb25TdHJpbmdEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQljYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHZlcnNpb25EZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYWNoZWRWZXJzaW9uU3RyaW5nRGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgY3JlYXRlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL0ZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTlhNDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5Qcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogVHlwZSBqYXZhLnV0aWwuQ29sbGVjdGlvbi4gVGhpcyBpcyBhIHNtYWxsZXN0IENvbGxlY3Rpb24gb2YKLQkgKiBJUHJvamVjdEZhY2V0cyB0aGF0IGFyZSBhYnNvbHV0ZWx5IHJlcXVpcmVkIGJ5IHRoaXMgcHJvamVjdCB0eXBlLiBUaGlzCi0JICogQ29sbGVjdGlvbiB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHJ1bnRpbWVzLiBUaGlzIHByb3BlcnR5IGlzIG5vdCBtZWFudCB0bwotCSAqIGJlIGV4cG9zZWQgdG8gY2xpZW50cy4gU3ViY2xhc3NlcyBzaG91bGQgaW5pdGlhbGl6ZSB0aGlzIENvbGxlY3Rpb24gaW4KLQkgKiB0aGVpciBpbml0KCkgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OID0gIkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFX1ZFUlNJT05fQ09NUExJQU5DRSA9ICJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLkZPUkNFX1ZFUlNJT05fQ09NUExJQU5DRSI7Ci0JCi0JcHVibGljIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChGQUNFVF9QUk9KRUNUX05BTUUpOwotCQluYW1lcy5hZGQoRkFDRVRfRE1fTUFQKTsKLQkJbmFtZXMuYWRkKEZBQ0VUX0FDVElPTl9NQVApOwotCQluYW1lcy5hZGQoRkFDRVRfUlVOVElNRSk7Ci0JCW5hbWVzLmFkZChSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTik7Ci0JCW5hbWVzLmFkZChGT1JDRV9WRVJTSU9OX0NPTVBMSUFOQ0UpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlJRGF0YU1vZGVsIHByb2plY3REYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcoKSk7Ci0JCXByb2plY3REYXRhTW9kZWwuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlnZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9QUk9KRUNUX0RNLCBwcm9qZWN0RGF0YU1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRmFjZXRBY3Rpb25NYXBJbXBsIGV4dGVuZHMgSGFzaE1hcCBpbXBsZW1lbnRzIEZhY2V0QWN0aW9uTWFwIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgYm9vbGVhbiBzdXByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgYWRkKEFjdGlvbiBhY3Rpb24pIHsKLQkJCXB1dChhY3Rpb24uZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmdldFByb2plY3RGYWNldCgpLmdldElkKCksIGFjdGlvbik7Ci0JCX0KLQotCQlwdWJsaWMgQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgZmFjZXRJRCkgewotCQkJcmV0dXJuIChBY3Rpb24pIGdldChmYWNldElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfQUNUSU9OX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gc3VwZXIucmVtb3ZlKGtleSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghc3VwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9BQ1RJT05fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghc3VwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9BQ1RJT05fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtKSB7Ci0JCQl0cnkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJCXN1cGVyLnB1dEFsbChtKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0FDVElPTl9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBGYWNldERhdGFNb2RlbE1hcEltcGwgZXh0ZW5kcyBIYXNoTWFwIGltcGxlbWVudHMgRmFjZXREYXRhTW9kZWxNYXAsIElEYXRhTW9kZWxMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGJvb2xlYW4gc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCXB1YmxpYyB2b2lkIGFkZChJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsKSB7Ci0JCQlwdXQoZmFjZXREYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCksIGZhY2V0RGF0YU1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBJRGF0YU1vZGVsIGdldEZhY2V0RGF0YU1vZGVsKFN0cmluZyBmYWNldElEKSB7Ci0JCQlyZXR1cm4gKElEYXRhTW9kZWwpIGdldChmYWNldElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJdHJ5IHsKLQkJCQlzdXByZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkoKElEYXRhTW9kZWwpIGl0ZXJhdG9yLm5leHQoKSkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJCXN1cGVyLmNsZWFyKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9ETV9NQVAsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIHZhbHVlOwotCQkJCU9iamVjdCBsYXN0VmFsdWUgPSBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQkJaWYgKGxhc3RWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCSgoSURhdGFNb2RlbCkgbGFzdFZhbHVlKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJKChJRGF0YU1vZGVsKSBsYXN0VmFsdWUpLnNldFByb3BlcnR5KEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLk1BU1RFUl9QUk9KRUNUX0RNLCBudWxsKTsKLQkJCQl9Ci0JCQkJZG0uc2V0UHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FLCBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpKTsKLQkJCQlkbS5zZXRQcm9wZXJ0eShGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5NQVNURVJfUFJPSkVDVF9ETSwgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci50aGlzLm1vZGVsKTsKLQkJCQlkbS5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQlyZXR1cm4gbGFzdFZhbHVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoIXN1cHJlc3NOb3RpZmljYXRpb24pIHsKLQkJCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfRE1fTUFQLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBtKSB7Ci0JCQl0cnkgewotCQkJCXN1cHJlc3NOb3RpZmljYXRpb24gPSB0cnVlOwotCQkJCXN1cGVyLnB1dEFsbChtKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3VwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0RNX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdHJ5IHsKLQkJCQlJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIHN1cGVyLnJlbW92ZShrZXkpOwotCQkJCWRtLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCXJldHVybiBkbTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKCFzdXByZXNzTm90aWZpY2F0aW9uKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX0RNX01BUCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhGQUNFVF9QUk9KRUNUX05BTUUpKSB7Ci0JCQkJaWYgKGNvbnRhaW5zVmFsdWUoZXZlbnQuZ2V0RGF0YU1vZGVsKCkpKSB7Ci0JCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZlbnQuZ2V0RGF0YU1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoRkFDRVRfUlVOVElNRSkpIHsKLQkJCQlpZiAoY29udGFpbnNWYWx1ZShldmVudC5nZXREYXRhTW9kZWwoKSkpIHsKLQkJCQkJaWYgKGV2ZW50LmdldEZsYWcoKSA9PSBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpIHsKLQkJCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQkJCX0gZWxzZSBpZihldmVudC5nZXRGbGFnKCkgPT0gSURhdGFNb2RlbC5FTkFCTEVfQ0hHKSB7Ci0JCQkJCQlnZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlldmVudC5nZXREYXRhTW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pKSB7Ci0JCQkJZ2V0RGF0YU1vZGVsKCkubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoTWFwKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJKChJRGF0YU1vZGVsKSBpdGVyYXRvci5uZXh0KCkpLnNldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9Ci0JCQlJRGF0YU1vZGVsIHByb2pNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9QUk9KRUNUX0RNKTsKLQkJCXByb2pNb2RlbC5zZXRQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQl9IGVsc2UgaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHByb3BlcnR5VmFsdWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChNYXApIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCkpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZG0uaXNQcm9wZXJ0eShGQUNFVF9SVU5USU1FKSkgewotCQkJCQlkbS5zZXRQcm9wZXJ0eShGQUNFVF9SVU5USU1FLCBydW50aW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJaWYoZ2V0Qm9vbGVhblByb3BlcnR5KEZPUkNFX1ZFUlNJT05fQ09NUExJQU5DRSkpewotCQkJCQlNYXAgZmFjZXRETXMgPSAoTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwotCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjZXRETXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSURhdGFNb2RlbCBmYWNldERhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KChTdHJpbmcpIGZhY2V0RGF0YU1vZGVsLmdldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfSUQpKTsKLQkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSURhdGFNb2RlbCBmYWNldE1vZGVsID0gKChGYWNldERhdGFNb2RlbE1hcCkgZmFjZXRETXMpLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0LmdldElkKCkpOwotCQkJCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIG9sZFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGZhY2V0TW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OKTsKLQkJCQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBuZXdWZXJzaW9uID0gZmFjZXQuZ2V0TGF0ZXN0U3VwcG9ydGVkVmVyc2lvbihydW50aW1lKTsKLQkJCQkJCQlpZiAobmV3VmVyc2lvbiAhPSBudWxsICYmIChvbGRWZXJzaW9uID09IG51bGwgfHwgb2xkVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkuY29tcGFyZVRvKG5ld1ZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKSA+IDAgfHwgIXJ1bnRpbWUuc3VwcG9ydHMob2xkVmVyc2lvbikpKSB7Ci0JCQkJCQkJCWZhY2V0TW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLCBuZXdWZXJzaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRkFDRVRfRE1fTUFQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbmV3IEZhY2V0RGF0YU1vZGVsTWFwSW1wbCgpOwotCQkJc2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQLCBvYmopOwotCQkJcmV0dXJuIG9iajsKLQkJfSBlbHNlIGlmIChGQUNFVF9BQ1RJT05fTUFQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlPYmplY3Qgb2JqID0gbmV3IEZhY2V0QWN0aW9uTWFwSW1wbCgpOwotCQkJc2V0UHJvcGVydHkoRkFDRVRfQUNUSU9OX01BUCwgb2JqKTsKLQkJCXJldHVybiBvYmo7Ci0JCX0gZWxzZSBpZihSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTi5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQlDb2xsZWN0aW9uIGMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgYyk7Ci0JCQlyZXR1cm4gYzsKLQkJfSBlbHNlIGlmKEZPUkNFX1ZFUlNJT05fQ09NUExJQU5DRS5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKG51bGwgIT0gcnVudGltZSkgewotCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHJ1bnRpbWUsIHJ1bnRpbWUuZ2V0TG9jYWxpemVkTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG51bGwsIFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5SVU5USU1FX05PTkUsIG51bGwpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlDb2xsZWN0aW9uIHByb2plY3RGYWNldHMgPSAoQ29sbGVjdGlvbilnZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTik7Ci0JCQlTZXQgcnVudGltZXMgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBydW50aW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVJ1bnRpbWUgcnQgPSAoSVJ1bnRpbWUpIGl0Lm5leHQoKTsKLQotCQkJCS8vIGFkZCB0aGlzIHJ1bnRpbWUgaW4gdGhlIGxpc3Qgb25seSBpZiBpdCBzdXBwb3J0cyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZhY2V0cwotCQkJCWJvb2xlYW4gc3VwcG9ydHNGYWN0ZXQgPSB0cnVlOwotCQkJCWZvciAoSXRlcmF0b3IgZmFjZXRJdCA9IHByb2plY3RGYWNldHMuaXRlcmF0b3IoKTsgZmFjZXRJdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSAoSVByb2plY3RGYWNldCkgZmFjZXRJdC5uZXh0KCk7Ci0JCQkJCWlmICghcnQuc3VwcG9ydHMoZmFjZXQpKSB7Ci0JCQkJCQlzdXBwb3J0c0ZhY3RldCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHN1cHBvcnRzRmFjdGV0KSB7Ci0JCQkJCWxpc3QuYWRkKHJ0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKSArIDFdOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocnVudGltZSwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkpOwotCQkJfQotCQkJaWYoZGVzY3JpcHRvcnMubGVuZ3RoID4gMil7Ci0JCQkJQXJyYXlzLnNvcnQoZGVzY3JpcHRvcnMsIDAsIGRlc2NyaXB0b3JzLmxlbmd0aCAtIDIsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZDEgPSAoRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKWFyZzA7Ci0JCQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZDIgPSAoRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKWFyZzE7Ci0JCQkJCQlyZXR1cm4gZDEuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpLmNvbXBhcmVUbyhkMi5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCWRlc2NyaXB0b3JzW2Rlc2NyaXB0b3JzLmxlbmd0aCAtIDFdID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUlVOVElNRV9OT05FLCBudWxsKSk7Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfUFJPSkVDVF9ETSk7Ci0JCQlyZXR1cm4gcHJvak1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9OQU1FKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMGNiYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9GbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkZsZXhpYmxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBAc2VlIEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcywgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLQotCXB1YmxpYyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQlpbml0TmVzdGVkUHJvamVjdE1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5lc3RlZFByb2plY3RNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBwcm9qTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9QUk9KRUNUX0NSRUFUSU9OLCBwcm9qTW9kZWwpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChORVNURURfTU9ERUxfUFJPSkVDVF9DUkVBVElPTik7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKFBST0pFQ1RfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0TG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBzdGF0dXMgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQlpZiAoUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJRGF0YU1vZGVsIHByb2pNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9QUk9KRUNUX0NSRUFUSU9OKTsKLQkJCXByb2pNb2RlbC5zZXRQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQl9IGVsc2UgaWYgKFBST0pFQ1RfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCUlEYXRhTW9kZWwgcHJvak1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1BST0pFQ1RfQ1JFQVRJT04pOwotCQkJcHJvak1vZGVsLnNldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTE9DQVRJT04sIHByb3BlcnR5VmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0TmFtZSgpOwotCQl9IGVsc2UgaWYgKFBST0pFQ1RfTE9DQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVByb2plY3RMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE5hbWUoKSB7Ci0JCUlEYXRhTW9kZWwgcHJvak1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1BST0pFQ1RfQ1JFQVRJT04pOwotCQlyZXR1cm4gcHJvak1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24oKSB7Ci0JCUlEYXRhTW9kZWwgcHJvak1vZGVsID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1BST0pFQ1RfQ1JFQVRJT04pOwotCQlyZXR1cm4gcHJvak1vZGVsLnZhbGlkYXRlUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMuUFJPSkVDVF9MT0NBVElPTik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdExvY2F0aW9uKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Um9vdExvY2F0aW9uKCk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIGdldFByb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsKQotCQkJcGF0aCA9IHBhdGguYXBwZW5kKHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCS8vCQotCS8vIHByb3RlY3RlZCB2b2lkIGluaXROZXN0ZWRNb2RlbHMoKSB7Ci0JLy8gc3VwZXIuaW5pdE5lc3RlZE1vZGVscygpOwotCS8vIGluaXRQcm9qZWN0TW9kZWwoKTsKLQkvLyBhZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfUFJPSkVDVF9DUkVBVElPTiwgcHJvamVjdERhdGFNb2RlbCk7Ci0JLy8KLQkvLyBzZXJ2ZXJUYXJnZXREYXRhTW9kZWwgPSBuZXcgSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWwoKTsKLQkvLyBhZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfU0VSVkVSX1RBUkdFVCwgc2VydmVyVGFyZ2V0RGF0YU1vZGVsKTsKLQkvLyB9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvamVjdE1vZGVsKCkgewotCS8vIHByb2plY3REYXRhTW9kZWwgPSBuZXcgUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0JLy8gfQotCS8vCQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24obW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjM2NhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQluYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBmaW5hbCBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRjZjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwotCi0vKioKLSAqIDxwPgotICogSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBhcyB3ZWxsIGFzIGFsbCBleHRlbmRpbmcgaW50ZXJmYWNlcyBleHRlbmRpbmcKLSAqIElDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgc3BlY2lmaWNhbGx5LCBidXQgbm90IGxpbWl0ZWQgdG8gYWxsIEoyRUUgY29tcG9uZW50IHJlbGF0ZWQKLSAqIGNyZWF0aW9uLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotICogICAgICA8L3A+Ci0gKiAgICAgIDxwPgotICogICAgICBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAgICAgPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBAc2VlIElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzLCBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLiBUaGUgdXNlciBkZWZpbmVkIG5hbWUgb2YgdGhlIHRhcmdldCBwcm9qZWN0IGZvciB0aGUgY29tcG9uZW50IHRvIGJlCi0JICogY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLiBUaGUgdXNlciBkZWZpbmVkIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9OQU1FID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX05BTUUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgU3RyaW5nLiBUaGUgdXNlciBkZWZpbmVkIGxvY2F0aW9uIG9uIGRpc2sgb2YgdGhlIHRhcmdldCBwcm9qZWN0IGZvciB0aGUKLQkgKiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZC4gRGVmYXVsdGVkIHRvIGRlZmF1bHQgZWNsaXBzZSB3b3Jrc3BhY2UgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkxPQ0FUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBTdHJpbmcuIFRoZSB1c2VyIGRlZmluZWQgZGVwbG95IG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLiBUaGUKLQkgKiBEYXRhTW9kZWxQcm92aWRlciB3aWxsIGRlZmF1bHQgdGhlIG5hbWUgdG8gdGhlIENPTVBPTkVOVF9OQU1FLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9ERVBMT1lfTkFNRSA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9ERVBMT1lfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBTdHJpbmcuIE5lc3RlZCBvcGVyYXRpb24gdG8gY3JlYXRlIGEgbmV3IHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX1BST0pFQ1RfQ1JFQVRJT05fRE0gPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfUFJPSkVDVF9DUkVBVElPTl9ETSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBUT0RPIGRlbGV0ZSB0aGlzCi0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgQm9vbGVhbiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+LiBJZiB0aGlzIHByb3BlcnR5IGlzCi0JICogc2V0IHRvIDxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4gdGhlbiBhIGRlZmF1bHQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBzdXBwb3J0aW5nCi0JICogYmluZGluZ3MgZmlsZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0RFRkFVTFRfRklMRVMgPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9GSUxFUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIHVuc2V0dGFibGUgcmVzdWx0IHByb3BlcnR5IHVzZWQgdG8gcmV0cmVpdmUgdGhlIGNyZWF0ZWQgdmlydHVhbCBjb21wb25lbnQgYWZ0ZXIgdGhlCi0JICogb3BlcmF0aW9uIGhhcyBleGVjdXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlQgPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjYmY5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotcHVibGljIGludGVyZmFjZSBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBpcyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9IHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgc3BlY2lmaWVkIGJ5IHtAbGluayAjVEFSR0VUX0NPTVBPTkVOVF9MSVNUfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGlmIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fXMgQSwgQiwgYW5kIEMgZXhpc3QgYW5kIHJlZmVyZW5jZXMgYXJlIHJlcXVpcmVkCi0JICogZnJvbSBBIHRvIEIgYW5kIEEgdG8gQywgdGhlbiB7QGxpbmsgI1NPVVJDRV9DT01QT05FTlR9IHNob3VsZCBiZSBzZXQgdG8gQSwgYW5kCi0JICoge0BsaW5rICNUQVJHRVRfQ09NUE9ORU5UX0xJU1R9IHNob3VsZCBiZSBzZXQgdG8gYSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IGNvbnRhaW5pbmcgQiBhbmQgQy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0NPTVBPTkVOVCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gY29udGFpbmluZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyB0aGF0Ci0JICogd2lsbCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50fSBzcGVjaWZpZWQgYnkge0BsaW5rICNTT1VSQ0VfQ09NUE9ORU5UfS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTVBPTkVOVF9MSVNUID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UT0RPIHRoaXMgc2hvdWxkIGJlIGEgbWFwCi0JLyoqCi0JICogT3B0aW9uYWwsIGRlcGxveSBwYXRoIGZvciB0aGUgZGVwZW5kZW50IGNvbXBvbmVudCwgZGVmYXVsdCBpcyAiLyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCA9ICJJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9ERVBMT1lfUEFUSCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBhcmNoaXZlIG5hbWUgZm9yIHRoZSBkZXBlbmRlbnQgY29tcG9uZW50LCBkZWZhdWx0IGlzICIiCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT01QT05FTlRfQVJDSElWRV9OQU1FID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0FSQ0hJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoaXMgb3B0aW9uYWwgcHJvcGVydHkgaXMgdGhlIHtAbGluayBqYXZhLnV0aWwuTWFwfSBjb250YWluaW5nIGtleXMgb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyBhbmQKLQkgKiB2YWx1ZXMgb2Yge0BsaW5rIFN0cmluZ31zLiBUaGlzIG1hcCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFN0cmluZyB3aGljaCBzaG91bGQgYmUgdXNlZCBieQotCSAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH0gc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgI1NPVVJDRV9DT01QT05FTlR9IHByb3BlcnR5IHRvIGxvb2t1cAotCSAqIHRoZSBrZXllZCB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudH0uIFRoZSB7QGxpbmsgamF2YS51dGlsLlNldH0gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnR9cyBpbiB0aGUKLQkgKiBrZXlzIG9mIHRoaXMge0BsaW5rIGphdmEudXRpbC5NYXB9IHNob3VsZCBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSB7QGxpbmsgamF2YS51dGlsLkxpc3R9LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQID0gIklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2MTVmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBGQUNFVF9UWVBFX0lOU1RBTEwgPSBBY3Rpb24uVHlwZS5JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEZBQ0VUX1RZUEVfVU5JTlNUQUxMID0gQWN0aW9uLlR5cGUuVU5JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IEZBQ0VUX1RZUEVfVkVSU0lPTl9DSEFOR0UgPSBBY3Rpb24uVHlwZS5WRVJTSU9OX0NIQU5HRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1BST0pFQ1RfTkFNRSA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1RZUEUgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfSUQgPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZFUlNJT05fU1RSID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhbiBJUHJvamVjdEZhY2V0VmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZFUlNJT04gPSAiSUZhY2V0RGF0YU1vZGVsUHJvcGV0aWVzLkZBQ0VUX1ZFUlNJT04iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogYW4gSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX0FDVElPTiA9ICJJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0FDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9FWEVDVVRFID0gIklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuU0hPVUxEX0VYRUNVVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUzZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1NThlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSURhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JLyoqCi0JICogQSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9QUk9KRUNUX05BTUUgPSBJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRTsKLQotCS8qKgotCSAqIEEgTmVzdGVkIElEYXRhTW9kZWwgb2YgdHlwZSBJUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RFRF9QUk9KRUNUX0RNID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX1BST0pFQ1RfRE0iOyAvLyROT04tTkxTLTEkIjsKLQotCS8qKgotCSAqIEFuIGluc3RhbmNlb2YgRmFjZXREYXRhTW9kZWxNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfRE1fTUFQID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gaW5zdGFuY2Ugb2YgRmFjZXRBY3Rpb25NYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9BQ1RJT05fTUFQID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfQUNUSU9OX01BUCI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIEFuIGluc3RhbmNlb2Ygb2YgSVJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9SVU5USU1FID0gIklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFRoaXMgbWFwIGlzIHVzZWQgZm9yIHRyYWNraW5nIGluZGl2aWR1YWwgSURhdGFNb2RlbHMgaW1wbGVtZW50aW5nIElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuCi0JICogVGhlIGZhY2V0IGlkcyBhcmUgdGhlIGtleXMgZm9yIHJldGlldmluZyB0aGUgc3BlY2lmaWMgSUZhY2V0YXRhTW9kZWxQcm9wZXJ0aWVzIElEYXRhTW9kZWxzCi0JICovCi0JcHVibGljIGludGVyZmFjZSBGYWNldERhdGFNb2RlbE1hcCBleHRlbmRzIE1hcCB7Ci0JCXB1YmxpYyB2b2lkIGFkZChJRGF0YU1vZGVsIGZhY2V0RGF0YU1vZGVsKTsKLQkJcHVibGljIElEYXRhTW9kZWwgZ2V0RmFjZXREYXRhTW9kZWwoU3RyaW5nIGZhY2V0SUQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWFwIGlzIHVzZWQgZm9yIHRyYWNpbmcgaW5kaXZkdWFsIElGYWNldGVkUHJvamVjdC5BY3Rpb25zIGZvciBmYWNldHMgdGhhdCBlaXRoZXIgZG8gbm90Ci0JICogaGF2ZSBhbnkgY29uZmlnIGRhdGEsIG9yIGZhY2V0cyB3aG9zZSBjb25maWcgZGF0YSBpcyBub3QgYW4gSURhdGFNb2RlbC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEZhY2V0QWN0aW9uTWFwIGV4dGVuZHMgTWFwIHsKLQkJcHVibGljIHZvaWQgYWRkKElGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uKTsKLQkJcHVibGljIElGYWNldGVkUHJvamVjdC5BY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBmYWNldElEKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZmM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXM7Ci0vKioKLSAqIDxwPgotICogSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSBEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBhcyB3ZWxsIGFzIGFsbCBleHRlbmRpbmcgaW50ZXJmYWNlcyBleHRlbmRpbmcgCi0gKiBJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHNwZWNpZmljYWxseSwgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBKYXZhIHJlbGVhdGVkIGNyZWF0b2luIGluIHRoZSAKLSAqIEpTVCBsYXllci4gCi0gKiBAc2VlIEZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0vKioKLSAqIFRoaXMgaGFzIGJlZW4gc2xhdGVkIGZvciByZW1vdmFsIHBvc3QgV1RQIDEuNS4gRG8gbm90IHVzZSB0aGlzIGNsYXNzL2ludGVyZmFjZQotICogCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBAc2VlIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXMsIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNSB7Ci0gICAKLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCwgdHlwZSBJRGF0YU1vZGVsLiBUaGUgdXNlciBzZXQgSURhdGFNb2RlbCB1c2VkIHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBwcm9qZWN0LiAgUHJvdmlkZXJzIHdoaWNoIGN1cnJlbnRseSBleGlzdCBmb3IKLSAgICAgKiB0aGlzIElEYXRhTW9kZWwgaW5jbHVkZSBJUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX01PREVMX1BST0pFQ1RfQ1JFQVRJT04gPSAiSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ORVNURURfTU9ERUxfUFJPSkVDVF9DUkVBVElPTiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTNmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIklQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU5MzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9kYXRhbW9kZWwvcHJvcGVydGllcy9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5Db21wb25lbnQgY3JlYXRpb24gYW5kIFJlZmVyZW5jZWQgQ29tcG9uZW50IGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGlzIHBhY2thZ2UgaW5jbHVkZXMgQVBJICBmb3IgY3JlYXRpbmcgY29tcG9uZW50cyBpbiBhIEZsZXhpYmxlIHByb2plY3QgYW5kIAotICAgICAgICBhZGRpbmcgcmVmZXJlbmNlZCBjb21wb25lbnRzIHRvIGV4aXN0aW5nIGNvbXBvbmVudHMuKHNlZSA8YSBocmVmPSJDb21wb25lbnRDb3JlLmh0bWwiPkNvbXBvbmVudENvcmU8L2E+KS4gCi0gICAgICAgIENsaWVudHMgc2hvdWxkIGFsc28gcmV2aWV3IHRoZSA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzPC9iPgotICAgICAgICBwYWNrYWdlLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0FydGlmYWN0RWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQXJ0aWZhY3RFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxMzg1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvQXJ0aWZhY3RFZGl0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiAKLSAqIFByb3ZpZGVzIHJlc291cmNlIGxpZmUgY3ljbGUgbWFuYWdlbWVudCBiZXR3ZWVuIGFuIEVkaXRNb2RlbCBhbmQgYSBXVFAgZmxleGlibGUgbW9kdWxlIHBhdHRlcm4uCi0gKiA8cD4KLSAqIEFydGlmYWN0RWRpdE1vZGVsIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBtYW5hZ2luZyBhIHNldCBvZiBFTUYgcmVzb3VyY2VzIHdpdGhpbiBhIHVuaXQgb2Ygd29yay4KLSAqIE1hbmFnZW1lbnQgb2YgdGhlc2UgcmVzb3VyY2VzIGluY2x1ZGVzIGJhc2ljIHNlcnZpY2VzIHN1Y2ggYXMgbG9hZHMsIHNhdmVzLCBhbmQgc3luY2hyb25pemF0aW9uCi0gKiBmb3IgdGhlIG1hbmFnZWQgcmVzb3VyY2VzLiBBcnRpZmFjdEVkaXRNb2RlbHMgYXJlIHJlZmVyZW5jZSBjb3VudGVkIHNvIHRoYXQgYSBzaW5nbGUgaW5zdGFuY2UgY2FuCi0gKiBiZSBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gb3IgZWRpdG9yLgotICogPC9wPgotICogPHA+Ci0gKiBBcml0ZmFjdEVkaXRNb2RlbCB1dGlsaXplcwotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dH0mbmJzcDsgdG8gbWFuYWdlIHRoZSBsaWZlCi0gKiBjeWNsZSBvZiBhbiBFTUYge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlfSZuYnNwOyBpbiBhIGdpdmVuIEVNRgotICoge0BzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0fS4gVGhlcmUgaXMgb25lIEFydGlmYWN0RWRpdE1vZGVsIHBlcgotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtpbiBlYWNoIHByb2plY3QuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dAotICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlCi0gKi8KLQotcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdE1vZGVsIGV4dGVuZHMgRWRpdE1vZGVsIGltcGxlbWVudHMgSUFkYXB0YWJsZSwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBBcnRpZmFjdEVkaXRNb2RlbC5jbGFzczsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IGNvbXBvbmVudFByb2plY3Q7IAotCXByaXZhdGUgZmluYWwgSVBhdGggbW9kdWxlUGF0aDsKLQlwcml2YXRlIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBVUkkgY29tcG9uZW50VVJJOwotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIEFydGlmYWN0RWRpdE1vZGVsIGluc3RhbmNlIHRoYXQgdXNlcyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCSAqIDxiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEZhY3RvcnkgPC9iPiBleHRlbnNpb24gcG9pbnQKLQkgKiBhc3NvY2lhdGVkIHdpdGggYW5FZGl0TW9kZWxJZCBhdHRhY2hlZCB0byB0aGUgcHJvamVjdCBtYW5hZ2VkIGJ5IGFDb250ZXh0IGZvciBhIHNwZWNpZmljCi0JICogbW9kdWxlIHJlZmVyZW5jZWQgYnkgYU1vZHVsZVVSSS4gUmVzb3VyZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQgYXMgZGVmaW5lZCBSZXNvdXJjZXMgdmlhCi0JICogdGhlIGFwcHJvcHJpYXRlIEVkaXRNb2RlbCBleHRlbnNpb24gcG9pbnRzIHdpbGwgYmUgYWNjZXNzZWQgYXMgcmVhZC1vbmx5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bzoKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGNvZGU+QXJ0aWZhY3RFZGl0TW9kZWwoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0cnVlLCBhTW9kdWxlVVJJKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuRWRpdE1vZGVsSWQKLQkgKiAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFZGl0TW9kZWwgZGVmaW5lZCBieSB0aGUgYXBwcm9wcmlhdGUKLQkgKiAgICAgICAgICAgIDxiPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEZhY3RvcnkgPC9iPiBleHRlbnNpb24KLQkgKiAgICAgICAgICAgIHBvaW50LgotCSAqIEBwYXJhbSBhQ29udGV4dAotCSAqICAgICAgICAgICAgQSB2YWxpZCBFTUZXb3JrYmVuY2hDb250ZXh0IHdoaWNoIGhlbHBzIG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIEVNRiByZXNvdXJjZXMgZm9yCi0JICogICAgICAgICAgICBhIGdpdmVuIHByb2plY3QuCi0JICogQHBhcmFtIHRvTWFrZVJlYWRPbmx5Ci0JICogICAgICAgICAgICBUcnVlIGluZGljYXRlcyB0aGF0IFJlc291cmNlcyBsb2FkZWQgYnkgdGhlIEVkaXRNb2RlbCB3aWxsIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgbW9kaWZpY2F0aW9ucy4KLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSBmdWxseS1xdWFsaWZpZWQgVVJJIHRoYXQgY29uZm9ybXMgdG8gdGhlICJtb2R1bGU6IiBmb3JtYXQuCi0JICovCi0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXRoaXMoYW5FZGl0TW9kZWxJZCwgYUNvbnRleHQsIHRvTWFrZVJlYWRPbmx5LCB0cnVlLCBhTW9kdWxlVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgQXJ0aWZhY3RFZGl0TW9kZWwgaW5zdGFuY2UgdGhhdCB1c2VzIGluZm9ybWF0aW9uIGZyb20gdGhlCi0JICogPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRmFjdG9yeSA8L2I+IGV4dGVuc2lvbiBwb2ludAotCSAqIGFzc29jaWF0ZWQgd2l0aCBhbkVkaXRNb2RlbElkIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0IG1hbmFnZWQgYnkgYUNvbnRleHQgZm9yIGEgc3BlY2lmaWMKLQkgKiBtb2R1bGUgcmVmZXJlbmNlZCBieSBhTW9kdWxlVVJJLiBSZXNvdXJlcyB0aGF0IGFyZSBub3QgcmVjb2duaXplZCBhcyBkZWZpbmVkCi0JICogPC9wPioKLQkgKiAKLQkgKiBAcGFyYW0gYW5FZGl0TW9kZWxJZAotCSAqICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVkaXRNb2RlbCBkZWZpbmVkIGJ5IHRoZSBhcHByb3ByaWF0ZQotCSAqICAgICAgICAgICAgPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRmFjdG9yeSA8L2I+IGV4dGVuc2lvbgotCSAqICAgICAgICAgICAgcG9pbnQuCi0JICogQHBhcmFtIGFDb250ZXh0Ci0JICogICAgICAgICAgICBBIHZhbGlkIEVNRldvcmtiZW5jaENvbnRleHQgd2hpY2ggaGVscHMgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgRU1GIHJlc291cmNlcyBmb3IKLQkgKiAgICAgICAgICAgIGEgZ2l2ZW4gcHJvamVjdC4KLQkgKiBAcGFyYW0gdG9NYWtlUmVhZE9ubHkKLQkgKiAgICAgICAgICAgIFRydWUgaW5kaWNhdGVzIHRoYXQgUmVzb3VyY2VzIGxvYWRlZCBieSB0aGUgRWRpdE1vZGVsIHdpbGwgbm90IGFsbG93Ci0JICogICAgICAgICAgICBtb2RpZmljYXRpb25zLgotCSAqIEBwYXJhbSB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5Ci0JICogICAgICAgICAgICBUcnVlIGluZGljYXRlcyB0aGF0IFJlc291cmNlcyBub3QgcmVjb2duaXplZCBieSB0aGUgRWRpdE1vZGVsIGJlIGxvYWRlZCBhcwotCSAqICAgICAgICAgICAgcmVhZC1vbmx5IC0gc3VjaCB0aG9zZSBsb2FkZWQgdmlhIHtAc2VlICNnZXRSZXNvdXJjZShVUkkpfS4KLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSBmdWxseS1xdWFsaWZpZWQgVVJJIHRoYXQgY29uZm9ybXMgdG8gdGhlICJtb2R1bGU6IiBmb3JtYXQuCi0JICogIAotCSAqLwotCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBib29sZWFuIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7Ci0JCUlQcm9qZWN0IGFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChhTW9kdWxlVVJJKTsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2o7Ci0JCQlmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRQcm9qICE9IG51bGwpCi0JCQkJZmFjZXRQcm9qLmFkZExpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfWZpbmFsbHkgewotCQkJY29tcG9uZW50UHJvamVjdCA9IGFQcm9qZWN0OwotCQl9Ci0JCQotCQl2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50UHJvamVjdCk7Ci0JCWNvbXBvbmVudFVSSSA9IGFNb2R1bGVVUkk7Ci0JCW1vZHVsZVBhdGggPSBuZXcgUGF0aChhTW9kdWxlVVJJLnBhdGgoKSk7Ci0JCXByb2Nlc3NMb2FkZWRSZXNvdXJjZXMoY29tcG9uZW50UHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWNjZXNzZXMgcmVzb3VyY2VzIHdpdGhpbiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzZXQuIFRha2VzIGEgc3RhbmRhcmQgVVJJIGF0dGFjaGVzIG1vZHVsZQotCSAqIHByb3RvY29sIGFuZCBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgcmVzb3VyY2UgaXMgcGFydCBvZiBhCi0JICogZmxleGlibGUgbW9kdWxlIHN0cnVjdHVyZS4gSWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGluIHRoZSByZXNvdXJjZSBzZXQgaXQgd2lsbCB0cnkgYW5kCi0JICogbG9hZCB0aGUgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhVXJpIC0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uIG9mIHJlc291cmNlCi0JICogCi0JICogQHJldHVybiBSZXNvdXJjZSAoQHNlZSBSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKLQkJLy8gRmlyc3QgY2hlY2sgaWYgcGFzc2VkIFVSSSBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQuLi4KLQkJSVBhdGggcmVxdWVzdFBhdGggPSBtb2R1bGVQYXRoLmFwcGVuZChuZXcgUGF0aChhVXJpLnBhdGgoKSkpOwotCQlVUkkgcmVzb3VyY2VVUkkgPSBVUkkuY3JlYXRlVVJJKFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wgKyByZXF1ZXN0UGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKHJlc291cmNlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0Q29tcG9uZW50UHJvamVjdCgpIHsgCi0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TW9kdWxlVVJJKCkgewotCQlyZXR1cm4gY29tcG9uZW50VVJJOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEFjY2Vzc2VzIHJlc291cmVjZXMgd2l0aGluIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNldC4gVGFrZXMgYSBzdGFybmRhcmQgVVJJIGF0dGFjaGVzIG1vZHVsZQotCSAqIGluZm9ybWF0aW9uLiBUaGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXNvdXJjZSBpcyBwYXJ0IG9mIGEgZmxleGlibGUgbW9kdWxlCi0JICogc3RydWN0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYVVyaSAtCi0JICogICAgICAgICAgICBsb2NhdGlvbiBvZiByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UgKEBzZWUgUmVzb3VyY2UpCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgYVVyaSkgewotCi0JCXJldHVybiBzdXBlci5nZXRPckNyZWF0ZVJlc291cmNlKGFVcmkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE92ZXJyaWRkZW4gdG8gcHJldmVudCBzdXBlcigpIGltcGxlbWVudGF0aW9uLCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKGFNb2R1bGVVUkkpIHVzZWQKLQkgKiBpbnN0ZWFkLiAoQGxpbmsgcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhVUkkgYU1vZHVsZVVSSSkKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFVcmkgLQotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgcmVzb3VyY2UKLQkgKi8KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEdhdGhlcnMgcmVzb3VyY2VzIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2V0LCBkZXRlcm1pbmVzIGlmIGludGVyZXN0ZWQgKEBsaW5rCi0JICogcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhVUkkgYU1vZHVsZVVSSSkpYW5kIHJlcXVlc3QgYWNjZXNzIChAbGluayBhY2Nlc3MoUmVmZXJlbmNlZFJlc291cmNlCi0JICogYVJlc291cmNlKSl0byBlYWNoIHJlc291cmNlIGluY3JlbWVudGluZyB0aGUgd3JpdGUvcmVhZCBjb3VudC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFVcmkgLQotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgcmVzb3VyY2UKLQkgKi8KLQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0xvYWRlZFJlc291cmNlcyhJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCkgewotCQlMaXN0IGxvYWRlZFJlc291cmNlcyA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmICghbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQobG9hZGVkUmVzb3VyY2VzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENoZWNrcyB0byBtYWtlIHN1cmUgYSBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlIGV4aXN0IGZvciB0aGUgcmVzb3VyY2VzIGluIHRoZSByZXNvdXJjZSBzZXQuCi0JICogVGhpcyBpcyBhY2hpZXZlZCBieSBxdWVyeWluZyBNb2R1bGVDb3JlKEBzZWUgTW9kdWxlQ29yZSkgZm9yIGV4aXN0aW5nCi0JICogV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIChAc2VlIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcykuIElmIHRoZSByZXNvdXJjZSBleGlzdCBpdCBwcm9jZXNzZXMKLQkgKiB0aGUgcmVzb3VyY2UgKEBsaW5rIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpKS4gUHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgaW5jcmVtZW50cwotCSAqIHRoZSByZWFkL3dyaXRlIGNvdW50LgotCSAqIDwvcD4qCi0JICogCi0JICogQHBhcmFtIHRoZVJlc291cmNlcyAtCi0JICogICAgICAgICAgICBsaXN0IG9mIHJlc291cmNlcyB0byB2ZXJpZnkgZmxleGlibGUgbW9kdWxlIHN0YXR1cywgYW5kIHByb2Nlc3MKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgV29ya2JlbmNoUmVzb3VyY2Ugd2l0aCB0aGUgY29ycmVzcG9uZGluZyBVUkkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1Jlc291cmNlc0lmSW50ZXJyZXN0ZWQoTGlzdCB0aGVSZXNvdXJjZXMpIHsKLQkJaW50IHNpemUgPSB0aGVSZXNvdXJjZXMuc2l6ZSgpOwotCQlSZXNvdXJjZSByZXNvdXJjZVRvUHJvY2VzczsKLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsgCi0gCi0JCUlSZXNvdXJjZSByZXNvdXJjZVJlc291cmNlOwotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgCi0JCQlyZXNvdXJjZVRvUHJvY2VzcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXNvdXJjZVRvUHJvY2VzcyA9PSBudWxsKSBjb250aW51ZTsKLQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHJlc291cmNlVG9Qcm9jZXNzLmdldFVSSSgpLmxhc3RTZWdtZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBsYXN0U2VnbWVudCAmJiBsYXN0U2VnbWVudC5lbmRzV2l0aChJTW9kdWxlQ29uc3RhbnRzLkNPTVBPTkVOVF9GSUxFX05BTUUpKSBjb250aW51ZTsKLQkJCXJlc291cmNlUmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlVG9Qcm9jZXNzKTsKLQkJCWlmIChyZXNvdXJjZVJlc291cmNlICE9IG51bGwpIHsKLQkJCQl2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMocmVzb3VyY2VSZXNvdXJjZSk7IAotCQkJCWZvciAoaW50IHJlc291cmNlc0luZGV4ID0gMDsgcmVzb3VyY2VzSW5kZXggPCB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aDsgcmVzb3VyY2VzSW5kZXgrKykgewotCQkJCQlpZiAodmlydHVhbENvbXBvbmVudC5lcXVhbHModmlydHVhbFJlc291cmNlc1tyZXNvdXJjZXNJbmRleF0uZ2V0Q29tcG9uZW50KCkpKSB7Ci0JCQkJCQlpZiAocmVzb3VyY2VUb1Byb2Nlc3MgIT1udWxsICYmIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlKHJlc291cmNlVG9Qcm9jZXNzKSkgewotCQkJCQkJCXByb2Nlc3NSZXNvdXJjZShyZXNvdXJjZVRvUHJvY2Vzcyk7Ci0JCQkJCQkJcHJvY2Vzc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAgCi0JCXJldHVybiBwcm9jZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogPHA+Ci0JICogR2VuZXJpYyB3YXkgdG8gcmV0cmlldmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiwgd2l0aGluIHRoZSBwbGF0Zm9ybS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlclR5cGUgZm9yIHRoaXMgYWRhcHRlciBjbGFzcyBmcm9tIGFkYXB0ZXIgZmFjdG9yeSBzdG9yZWQgaW4gdGhlCi0JICogICAgICAgICBhZGFwdGVyIG1hbmFnZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogIAotCSAqLwotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRWaXJ0dWFsQ29tcG9uZW50KCkgewotCQlyZXR1cm4gdmlydHVhbENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZCgpIHsKLQkJdHJ5IHsKLQkJCUVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLm5vdGlmeUZ1bmN0aW9uR3JvdXBDaGFuZ2VkKG51bGwsZ2V0Q29tcG9uZW50UHJvamVjdCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0Rpc3Bvc2UoKSB7Ci0JCS8vUmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBmYWNldGVkIHByb2plY3QKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZ2V0Q29tcG9uZW50UHJvamVjdCgpKTsKLQkJCWlmIChmYWNldFByb2ogIT0gbnVsbCkKLQkJCQlmYWNldFByb2oucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJc3VwZXIuZG9EaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0JpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0JpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ODhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9CaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUNvbXBvbmVudEhlbHBlciB7Ci0KLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudDsKLQotCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCXJldHVybiBjb21wb25lbnQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVsZWFzZUFjY2VzcyhBcnRpZmFjdEVkaXQgZWRpdCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCi0JcHVibGljIGFic3RyYWN0IFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpOwotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZThhZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PjwvY29weXJpZ2h0PgotICogCi0gKiAkSWQ6IENvbXBvbmVudFJlc291cmNlLmphdmEsdiAxLjYgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gUHJvdmlkZXMgYW4gYWJzdHJhY3QgbWFwcGluZyBvZiB3b3JrYmVuY2ggcmVzb3VyY2VzIHRvIGRlcGxveWFibGUKLSAqIHJlc291cmNlcy4KLSAqIDxwPgotICogVGhlIHVuZGVybHlpbmcgZWNsaXBzZSByZXNvdXJjZSBjb3VsZCBiZSBhIGNvbnRhaW5lciBvciBhIGZpbGUuIEhvd2V2ZXIsIGlmIHRoZQotICoge0BzZWUgI2dldFNvdXJjZVBhdGgoKX0mbmJzcDsgaXMgYSBjb250YWluZXIsIHRoZW4gdGhlIHtAc2VlICNnZXREZXBsb3llZFBhdGgoKX0mbmJzcDsgd2lsbCBiZQotICogYSBjb250YWluZXIgYXMgd2VsbC4KLSAqIDwvcD5DbGllbnRzIHRoYXQgcmVxdWlyZSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgRWNsaXBzZSBSZXNvdXJjZSBmb3IgYSBnaXZlbgotICogQ29tcG9uZW50UmVzb3VyY2Ugc2hvdWxkIHVzZSAKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlI2dldEVjbGlwc2VSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSl9Jm5ic3A7Ci0gKiA8cD4KLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzIDwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCA8ZW0+U291cmNlIFBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0RXhjbHVzaW9ucyA8ZW0+RXhjbHVzaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldENvbXBvbmVudCA8ZW0+Q29tcG9uZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UmVzb3VyY2VUeXBlIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U291cmNlUGF0aChJUGF0aCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlQYXRoIGdldFNvdXJjZVBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNvdXJjZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNvdXJjZVBhdGgoSVBhdGggdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UnVudGltZSBQYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSdW50aW1lUGF0aChJUGF0aCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1c2lvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1c2lvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseQotCSAqIHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdXNpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4Y2x1c2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbXBvbmVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlc291cmNlcyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtiZW5jaENvbXBvbmVudCBnZXRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50KFdvcmtiZW5jaENvbXBvbmVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXNvdXJjZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQlJUHJvamVjdCBnZXRPd25pbmdQcm9qZWN0KCk7Ci0Jdm9pZCBzZXRPd25pbmdQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KTsKLQotfSAvLyBDb21wb25lbnRSZXNvdXJjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTA3MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogSW5kaWNhdGVzIGhvdyB0aGUge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDtzaG91bGQgYmUgaGFuZGxlZCBieQotICogdGhlIHRvb2xpbmcuICAKLSAqIDxwPgotICogSW4gcGFydGljdWxhciwgdGhlIHtAc2VlICNnZXRNb2R1bGVUeXBlSWQoKX0mbmJzcDsgaXMgdXNlZCB0byBjb29yZGluYXRlIG90aGVyCi0gKiBleHRlbnNpb25zIHN1Y2ggYXMgRWRpdE1vZGVscyBhbmQgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgcHJlcGFyYXRpb24gYnVpbGRlci4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBTZWUgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgZm9yIGFuIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5vdmVydmlldyBvZiB0aGUgbW9kZWwgY29tcG9uZW50cyA8L2E+LgotICogPC9wPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0TWV0YWRhdGFSZXNvdXJjZXMgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50VHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbXBvbmVudFR5cGVJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50VHlwZV9Db21wb25lbnRUeXBlSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZUlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRDb21wb25lbnRUeXBlSWQgPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21wb25lbnRUeXBlSWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlCi0JICogcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JUGF0aCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfVmVyc2lvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldENvbXBvbmVudFR5cGVfUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJvcGVydGllcygpOwotCi19IC8vIENvbXBvbmVudFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGU0ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvbmVudGNvcmVGYWN0b3J5LmphdmEsdiAxLjIgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlRmFjdG9yeUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50Y29yZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRjb3JlRmFjdG9yeSBlSU5TVEFOQ0UgPSBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrYmVuY2hDb21wb25lbnQgY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudFR5cGUgY3JlYXRlQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVmZXJlbmNlZENvbXBvbmVudCBjcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9qZWN0Q29tcG9uZW50cyBjcmVhdGVQcm9qZWN0Q29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb21wb25lbnRjb3JlUGFja2FnZSBnZXRDb21wb25lbnRjb3JlUGFja2FnZSgpOwotCi19IC8vQ29tcG9uZW50Y29yZUZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Db21wb25lbnRjb3JlUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDRmZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0NvbXBvbmVudGNvcmVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZVBhY2thZ2UuamF2YSx2IDEuOCAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50Y29yZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiY29tcG9uZW50Y29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbXBvbmVudGNvcmUueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudGNvcmVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0V29ya2JlbmNoQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktCRU5DSF9DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCA8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9ORU5UX1JFU09VUkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJ1bnRpbWUgUGF0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdXNpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9SRVNPVVJDRV9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50VHlwZUltcGwgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnQgVHlwZSBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPTkVOVF9UWVBFX19WRVJTSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT05FTlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVmZXJlbmNlZENvbXBvbmVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYW5kbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdW50aW1lIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRIID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbnQgT2JqZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyY2hpdmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUUgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRURfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UUyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfQ09NUE9ORU5UU19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldERlcGVuZGVuY3lUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFUEVOREVOQ1lfVFlQRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklQYXRoPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0SVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSVBBVEggPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5VUkk8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRjb3JlUGFja2FnZUltcGwjZ2V0VVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFVSSSA9IDg7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2JlbmNoIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtiZW5jaENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldFJlZmVyZW5jZWRDb21wb25lbnRzIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9Qcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAc2VlICNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlIDxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb25lbnRSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0U291cmNlUGF0aCA8ZW0+U291cmNlIFBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb3VyY2UgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRTb3VyY2VQYXRoKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSdW50aW1lUGF0aCgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1J1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldEV4Y2x1c2lvbnMgPGVtPkV4Y2x1c2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkV4Y2x1c2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0RXhjbHVzaW9ucygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Db21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50KCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlI2dldFJlc291cmNlVHlwZSgpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGUjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZSNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCA8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmZXJlbmNlZCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRIYW5kbGUgPGVtPkhhbmRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhhbmRsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEhhbmRsZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0UnVudGltZVBhdGggPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldFJ1bnRpbWVQYXRoKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVuY3lUeXBlIDxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXBlbmRlbmN5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0RGVwZW5kZW50T2JqZWN0KCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXJjaGl2ZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0QXJjaGl2ZU5hbWUoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfQXJjaGl2ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyA8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRDb21wb25lbnRzIDxlbT5Db21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21wb25lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldENvbXBvbmVudHMoKQotCSAqIEBzZWUgI2dldFByb2plY3RDb21wb25lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREZXBlbmRlbmN5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCA8ZW0+SVBhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPklQYXRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCIKLQkgKiAgICAgICAgYW5ub3RhdGlvbj0ia2V5d29yZHMgZGF0YXR5cGU9J251bGwnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldElQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSA8ZW0+VVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5VUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiCi0JICogICAgICAgIGFubm90YXRpb249ImtleXdvcmRzIGRhdGF0eXBlPSdudWxsJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudGNvcmVGYWN0b3J5IGdldENvbXBvbmVudGNvcmVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwgPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFdvcmtiZW5jaENvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLQkVOQ0hfQ09NUE9ORU5UID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktCRU5DSF9DT01QT05FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTID0gZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVMgPSBlSU5TVEFOQ0UuZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwgPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRSZXNvdXJjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT01QT05FTlRfUkVTT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9Tb3VyY2VQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SdW50aW1lIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9SdW50aW1lUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVzaW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUmVzb3VyY2VUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRDb21wb25lbnRUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPTkVOVF9UWVBFID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX0NPTVBPTkVOVF9UWVBFX0lEID0gZUlOU1RBTkNFLmdldENvbXBvbmVudFR5cGVfQ29tcG9uZW50VHlwZUlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29tcG9uZW50VHlwZV9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIFJlc291cmNlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUyA9IGVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwgPGVtPlByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST1BFUlRZID0gZUlOU1RBTkNFLmdldFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZWRDb21wb25lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVGRVJFTkNFRF9DT01QT05FTlQgPSBlSU5TVEFOQ0UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFuZGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UnVudGltZSBQYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRlbmN5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW5jeVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlcGVuZGVudCBPYmplY3Q8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJjaGl2ZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwgPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRQcm9qZWN0Q29tcG9uZW50cygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9KRUNUX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FID0gZUlOU1RBTkNFLmdldFByb2plY3RDb21wb25lbnRzX1Byb2plY3ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21wb25lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMgPSBlSU5TVEFOQ0UuZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0pFQ1RfQ09NUE9ORU5UU19fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQcm9qZWN0Q29tcG9uZW50c19WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGUgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsI2dldERlcGVuZGVuY3lUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gREVQRU5ERU5DWV9UWVBFID0gZUlOU1RBTkNFLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JUGF0aDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRJUGF0aCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBJUEFUSCA9IGVJTlNUQU5DRS5nZXRJUGF0aCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VVJJPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCNnZXRVUkkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVSSSgpOwotCi0JfQotCi19IC8vQ29tcG9uZW50Y29yZVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9EZXBlbmRlbmN5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlcGVuZGVuY3lUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTE0YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0RlcGVuZGVuY3lUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiAKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogSW5kaWNhdGVzIGhvdyBhIHBhcnRpY3VsYXIge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLlJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7c2hvdWxkIGJlCi0gKiBhYnNvcmJlZCBieSBhIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Xb3JrYmVuY2hDb21wb25lbnR9LiAKLSAqIDxwPgotICogUHJvdmlkZXMgdHdvIHR5cGVzICgidXNlcyIsICJjb25zdW1lcyIpIHdoaWNoIGFyZSB1c2VkIGJ5Ci0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuUmVmZXJlbmNlZENvbXBvbmVudH1zIHRvIHNwZWNpZnkgaG93IHRoZQotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLlJlZmVyZW5jZWRDb21wb25lbnR9Jm5ic3A7IHNob3VsZCBiZSBhYnNvcmJlZCBieSB0aGUKLSAqIGNvbnRhaW5pbmcge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0uCi0gKiA8L3A+Ci0gKiBGb3IgY2xpZW50cyB0aGF0IG5lZWQgdG8gY3JlYXRlIG9uZSBvZiB0aGVzZSBvYmplY3RzIGZyb20gc2NyYXRjaCwKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlRmFjdG9yeX0uCi0gKiA8cD4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkRlcGVuZGVuY3kgVHlwZTwvYj48L2VtPicsIGFuZAotICogdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwvcD4KLSAqIDxwPiAKLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+IHVzZXM9MCBjb25zdW1lcz0xIDwhLS0KLSAqIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZUNvcmVQYWNrYWdlI2dldERlcGVuZGVuY3lUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwZW5kZW5jeVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVzZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVzZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkCi0JICogYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVVNFU19MSVRFUkFMCi0JICogQG1vZGVsIG5hbWU9InVzZXMiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkKLQkgKiBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OU1VNRVNfTElURVJBTAotCSAqIEBtb2RlbCBuYW1lPSJjb25zdW1lcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVU1FUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Vc2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVU0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5VHlwZSBVU0VTX0xJVEVSQUwgPSBuZXcgRGVwZW5kZW5jeVR5cGUoVVNFUywgInVzZXMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNDT05TVU1FUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeVR5cGUgQ09OU1VNRVNfTElURVJBTCA9IG5ldyBEZXBlbmRlbmN5VHlwZShDT05TVU1FUywgImNvbnN1bWVzIik7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5VHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBEZXBlbmRlbmN5VHlwZVtdIHsKLQkJCVVTRVNfTElURVJBTCwKLQkJCUNPTlNVTUVTX0xJVEVSQUwsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotCSAqIEBwYXJhbSBuYW1lIHBhc3NlcyBsaXRlcmFsIG5hbWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEZXBlbmRlbmN5VHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURlcGVuZGVuY3lUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVwZW5kZW5jeSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiAgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgcGFzc2VzIGxpdGVyYWwgdmFsdWUKLQkgKiBAcmV0dXJuIGxpdGVyYWwgaW5zdGFuY2UKLQkgKiAgPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVwZW5kZW5jeVR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFVTRVM6IHJldHVybiBVU0VTX0xJVEVSQUw7Ci0JCQljYXNlIENPTlNVTUVTOiByZXR1cm4gQ09OU1VNRVNfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlcGVuZGVuY3lUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvL0RlcGVuZGVuY3lUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvSUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL0lDb21wb25lbnRQcm9qZWN0TWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NmFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvSUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgewotCXB1YmxpYyB2b2lkIG1pZ3JhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZUNvcmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyMTJkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiB7Ci0JCXByb3RlY3RlZCBJUmVwb3J0ZXIgX3JlcG9ydGVyOwotCi0JCXB1YmxpYyBNb2R1bGVDb3JlVmFsaWRhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCQl9Ci0JCQotCQlwdWJsaWMgUmVzb3VyY2UgZ2V0UHJpbWFyeVJlc291cmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzM0OyBDaGFuZ2luZyB0aGlzIG1ldGhvZCB0byBjYWxsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbC5nZXRQcmltYXJ5UmVzb3VyY2UoKSBtZXRob2QgaW5zdGVhZC4KLQkJCS8vIFRoaXMgZG9lcyB0d28gdGhpbmdzOgotCQkJLy8gMS4gUmVvcmRlcnMgdGhlIGxvY2tzIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBsb2NraW5nIHRoZSByZXNvdXJjZSAoQnVnemlsbGEgMTgxMzM0KSwKLQkJCS8vCSAgdGhlbiB0aGUgZWRpdCBtb2RlbCBhbmQKLQkJCS8vIDIuIFJldXNlcyBjb2RlLiAoVGhlIGNvZGUgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQgTVNNLmdldFByaW1hcnlSZXNvdXJjZSgpIGlzIGlkZW50aWNhbC4KLQkJCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQlpZiAoc3RydWN0dXJlRWRpdCAhPSBudWxsKSB7Ci0JCQkJTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbCA9IHN0cnVjdHVyZUVkaXQuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCk7Ci0JCQkJaWYgKHN0cnVjdHVyYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vIGFjcXVpcmluZyB0aGUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIGxvY2sgaGVyZSBmaXJzdCBiZWNhdXNlIHRoZSBjYWxsIHRvIGdldFByaW1hcnlSZXNvdXJjZSgpCi0JCQkJCS8vIHdpbGwgY2F1c2UgdGhpcyBsb2NrIHRvIGJlIGFjcXVpcmVkIGxhdGVyIHJlc3VsdGluZyBpbiBhIHBvdGVudGlhbCBkZWFkbG9jawotCQkJCQlzeW5jaHJvbml6ZWQgKHN0cnVjdHVyYWxNb2RlbCkgewotCQkJCQkJcmV0dXJuIHN0cnVjdHVyYWxNb2RlbC5nZXRQcmltYXJ5UmVzb3VyY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qKSB7Ci0JCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qKTsKLQkJCXJldHVybiBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCQkJCXRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCV9yZXBvcnRlciA9IHJlcG9ydGVyOwotCQkJLy9SZW1vdmUgYWxsIG1hcmtlcnMgcmVsYXRlZCB0byB0aGlzIHZhbGlkYXRvcgotCQkJX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOwotCQkJLy9Vc2luZyB0aGUgaGVscGVyIGNsYXNzLCBsb2FkIHRoZSBtb2R1bGUgbW9kZWwKLQkJCUlQcm9qZWN0IHByb2ogPSAoSVByb2plY3QpIGhlbHBlcgotCQkJCQkubG9hZE1vZGVsKE1vZHVsZUNvcmVWYWxpZGF0b3JIZWxwZXIuTU9EVUxFQ09SRSwgbnVsbCk7Ci0JCQl0cnkgewotCQkJCWlmIChwcm9qLmlzQWNjZXNzaWJsZSgpICYmIHByb2ouaGFzTmF0dXJlKE1vZHVsZUNvcmVOYXR1cmUuTU9EVUxFX05BVFVSRV9JRCkpIHsKLQkJCQkJaWYgKG5lZWRzTWlncmF0aW5nKHByb2opKQotCQkJCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoIm1vZHVsZWNvcmUiLAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkiTkVFRFNNSUdSQVRJTkciLCBudWxsLCBwcm9qKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJX3JlcG9ydGVyID0gbnVsbDsKLQotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBuZWVkc01pZ3JhdGluZyhJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpZ2V0UHJpbWFyeVJlc291cmNlKHByb2plY3QpOwotCQkJYm9vbGVhbiBtdWx0aUNvbXBzID0gZmFsc2U7Ci0JCQlpZiAocHJvamVjdD09bnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlib29sZWFuIG5lZWRzTWlncmF0aW5nID0gKCFwcm9qZWN0Lmhhc05hdHVyZShGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB8fCByZXMgPT0gbnVsbCB8fCAoKHJlcyAhPSBudWxsKSAmJiAoKFdUUE1vZHVsZXNSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSA9PSBudWxsKTsgLy98fCAocmVzIT1udWxsICYmICFyZXMuaXNMb2FkZWQoKSAmJiAoKFdUUE1vZHVsZXNSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSAhPSBudWxsKTsKLQkJCWlmICghbmVlZHNNaWdyYXRpbmcpIHsKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgVHJhbnNsYXRvclJlc291cmNlICYmICgoVHJhbnNsYXRvclJlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudHMpIHsKLQkJCQkJUHJvamVjdENvbXBvbmVudHMgY29tcG9uZW50cyA9IChQcm9qZWN0Q29tcG9uZW50cykgKChXVFBNb2R1bGVzUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJCWlmIChjb21wb25lbnRzLmdldENvbXBvbmVudHMoKSAhPSBudWxsKSB7Ci0JCQkJCQltdWx0aUNvbXBzID0gY29tcG9uZW50cy5nZXRDb21wb25lbnRzKCkuc2l6ZSgpID4gMTsKLQkJCQkJCXJldHVybiBtdWx0aUNvbXBzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5lZWRzTWlncmF0aW5nOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotCQkJCXRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJCS8vIEZvcndhcmRpbmcgdG8gam9iIG1ldGhvZAotCQkJdmFsaWRhdGVJbkpvYihoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY5ZjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29yZVZhbGlkYXRvckhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRUNPUkUgPSAiTU9EVUxFQ09SRSI7Ci0JCXB1YmxpYyBNb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyKCkgewotCQkJc3VwZXIoKTsKLQkJCS8vCXRoZSBmb2xsb3dpbmcgd2lsbCByZWdpc3RlciB0aGUgaGVscGVyJ3Mgc3ltYm9saWMgbWV0aG9kcwotCQkgICAgQ2xhc3MgW10gYXJncyA9IG5ldyBDbGFzc1swXSA7Ci0JCSAgICByZWdpc3Rlck1vZGVsKE1PRFVMRUNPUkUsICJsb2FkTW9kZWwiLCBhcmdzKTsKLQkJfQotCQkvKioKLQkJICogTG9hZCB0aGUgVHJhZGluZyBTZXNzaW9uIGZvciB2YWxpZGF0aW9uCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQotCX0JCQotCQkvKioKLQkJICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcwotCQkgKiByZXNvdXJjZSwgb3IgdHlwZSBvZiByZXNvdXJjZSwgaXNuJ3QgaGFuZGxlZCBieSB0aGlzIGhlbHBlciwgcmV0dXJuCi0JCSAqIG51bGwuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQotCQkJcmV0dXJuIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVNaWdyYXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVNaWdyYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhOTA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlTWlncmF0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5Qcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVNaWdyYXRvck1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBtYW5hZ2VyQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQgbWlncmF0ZWQgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgYm9vbGVhbiBtaWdyYXRpbmc7Ci0JcHVibGljIE1vZHVsZU1pZ3JhdG9yTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBNb2R1bGVNaWdyYXRvck1hbmFnZXIgZ2V0TWFuYWdlcihJUHJvamVjdCBwcm9qKSB7Ci0JCU1vZHVsZU1pZ3JhdG9yTWFuYWdlciBtYW5hZ2VyID0gKE1vZHVsZU1pZ3JhdG9yTWFuYWdlciltYW5hZ2VyQ2FjaGUuZ2V0KHByb2opOwotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQltYW5hZ2VyID0gbmV3IE1vZHVsZU1pZ3JhdG9yTWFuYWdlcigpOwotCQkJbWFuYWdlckNhY2hlLnB1dChwcm9qLG1hbmFnZXIpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQlwcml2YXRlIHZvaWQgbWlncmF0ZUNvbXBvbmVudHNJZk5lY2Vzc2FyeShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIG11bHRpQ29tcHMpIHsKLQkJCi0JCXNldHVwQW5kTWlncmF0ZUNvbXBvbmVudFByb2plY3QocHJvamVjdCk7Ci0JCQotCX0KLQlwcml2YXRlIHZvaWQgc2V0dXBBbmRNaWdyYXRlQ29tcG9uZW50UHJvamVjdChJUHJvamVjdCBwcm9qKSB7Ci0JCW1pZ3JhdGVkLmFkZChwcm9qKTsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZG0uc2V0U3RyaW5nUHJvcGVydHkoSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLHByb2ouZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCWRtLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtaWdyYXRlT2xkTWV0YURhdGEoSVByb2plY3QgYVByb2plY3QsIGZpbmFsIGJvb2xlYW4gbXVsdGlDb21wcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltaWdyYXRpbmcgPSB0cnVlOwotCQlJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIHdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMoYVByb2plY3QpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSVByb2plY3QgYVByb2ogPSAoSVByb2plY3QpdGhpcy5nZXRJbmZvKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFQcm9qLmlzQWNjZXNzaWJsZSgpICYmIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoYVByb2opKSB7Ci0JCQkJCQlpZiAoYVByb2ouZmluZE1lbWJlcigiLnd0cG1vZHVsZXMiKSAhPSBudWxsKSB7Ci0JCQkJCQkJbW92ZU9sZE1ldGFEYXRhRmlsZShhUHJvaik7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobmVlZHNDb21wb25lbnRNaWdyYXRpb24oYVByb2osbXVsdGlDb21wcykpCi0JCQkJCQkJbWlncmF0ZUNvbXBvbmVudHNJZk5lY2Vzc2FyeShhUHJvaixtdWx0aUNvbXBzKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1pZ3JhdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIG5lZWRzQ29tcG9uZW50TWlncmF0aW9uKElQcm9qZWN0IGFQcm9qLGJvb2xlYW4gbXVsdGlDb21wcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQotCQkJYm9vbGVhbiBuZWVkcyA9IHRydWU7Ci0JCQlpZiAobXVsdGlDb21wcykKLQkJCQlyZXR1cm4gKG5lZWRzICYmIG11bHRpQ29tcHMpOwotCQkJZWxzZQotCQkJCXJldHVybiAoKGFQcm9qLmZpbmRNZW1iZXIoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpID09IG51bGwpICYmIChhUHJvai5maW5kTWVtYmVyKCIuc2V0dGluZ3MvLmNvbXBvbmVudCIpID09IG51bGwpKSB8fCAKLQkJCQkJCShQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoYVByb2opID09IG51bGwpICYmIG5lZWRzOwotCQkJfQotCQl9OwotCQkKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbnVsbCxJV29ya3NwYWNlLkFWT0lEX1VQREFURSxudWxsKTsKLQkJCi0JCQotCQkKLQkJCi0JfQotCXByaXZhdGUgdm9pZCBtb3ZlTWV0YURhdGFGaWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVJlc291cmNlIG9sZGZpbGUgPSBwcm9qZWN0LmZpbmRNZW1iZXIoIi53dHBtb2R1bGVzIik7Ci0JCWlmIChvbGRmaWxlICE9IG51bGwgJiYgb2xkZmlsZS5leGlzdHMoKSkgewotCQkJCi0JCQl0cnkgewotCQkJCQlJRm9sZGVyIHNldHRpbmdzRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIi5zZXR0aW5ncyIpOwotCQkJCQlpZiAoIXNldHRpbmdzRm9sZGVyLmV4aXN0cygpKQotCQkJCQkJc2V0dGluZ3NGb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLQkJCQkJb2xkZmlsZS5tb3ZlKG5ldyBQYXRoKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKSx0cnVlLG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKE1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCX0KLQkJfSAKLQl9Ci0JcHJpdmF0ZSB2b2lkIG1vdmVPbGRNZXRhRGF0YUZpbGUoSVByb2plY3QgcHJvamVjdCkgewotCi0JCXRyeSB7Ci0JCQkJbW92ZU1ldGFEYXRhRmlsZShwcm9qZWN0KTsKLQkJCQlJRm9sZGVyIGRlcEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCIuZGVwbG95YWJsZXMiKTsKLQkJCQlpZiAoZGVwRm9sZGVyLmV4aXN0cygpKQotCQkJCQlkZXBGb2xkZXIuZGVsZXRlKHRydWUsIG51bGwpOwotCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc01pZ3JhdGluZygpIHsKLQkJcmV0dXJuIG1pZ3JhdGluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwNmU2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlU3RydWN0dXJhbE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBNb2R1bGVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuU2F2ZUZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0TmF0dXJlOwotLyoqCi0gKiBNYW5hZ2VzIHRoZSB1bmRlcmx5aW5nIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPGEgbmFtZT0ibW9kdWxlLXN0cnVjdHVyYWwtbW9kZWwiLz4KLSogPHA+Ci0qIEVhY2ggTW9kdWxlQ29yZU5hdHVyZSBmcm9tIGEgZ2l2ZW4gcHJvamVjdCBjYW4gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9Jm5ic3A7IG9mIHRoZSBwcm9qZWN0LgotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyBpcyBhIHN1YmNsYXNzIG9mCi0qIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbH0mbmJzcDt0aGF0IG1hbmFnZXMKLSogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTW9kdWxlIFN0cnVjdHVyYWwgTWV0YW1vZGVsLiBBcyBhbiBFZGl0TW9kZWwsIHRoZQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlU3RydWN0dXJhbE1vZGVsfSZuYnNwOyByZWZlcmVuY2VzIEVNRiByZXNvdXJjZXMsCi0qIHRoYXQgY29udGFpbiBFTUYgbW9kZWxzIC0tIGluIHRoaXMgY2FzZSwgdGhlIEVNRiBtb2RlbCBvZiA8aT4uY29tcG9uZW50IDwvaT4gZmlsZS4KLSogPC9wPgotKiA8cD4KLSogQ2xpZW50cyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIEVkaXQgRmFjYWRlIHBhdHRlcm4gKHZpYQotKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZX0mbmJzcDsgb3Igb25lIGlmIGl0cyByZWxldmFudCBzdWJjbGFzc2VzKQotKiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIE1vZHVsZSBTdHJ1Y3R1cmFsIE1ldGFtb2RlbC4KLSogPC9wPiAKLSogPHA+Ci0qIDxhIGhyZWY9Ik1vZHVsZUNvcmVOYXR1cmUuaHRtbCNtb2RlbC1kaXNjdXNzaW9uIj5TZWUgdGhlIGRpc2N1c3Npb248L2E+IG9mIGhvdyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgcmVsYXRlcyB0byB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgYW5kIE1vZHVsZUNvcmVOYXR1cmUuCi0qIDxhIG5hbWU9ImFjY2Vzc29yLWtleSIvPgotKiA8cD4KLSogQWxsIEVkaXRNb2RlbHMgaGF2ZSBhIGxpZmVjeWNsZSB0aGF0IG11c3QgYmUgZW5mb3JjZWQgdG8ga2VlcCB0aGUgcmVzb3VyY2VzIGxvYWRlZCB0aGF0IGFyZSBpbgotKiB1c2UsIGFuZCB0byB1bmxvYWQgcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiB1c2UuIFRvIGFjY2VzcyBhbiBFZGl0TW9kZWwsIGNsaWVudHMgYXJlIHJlcXVpcmVkIHRvCi0qIHN1cHBseSBhbiBvYmplY3QgdG9rZW4gcmVmZXJyZWQgdG8gYXMgYW4gYWNjZXNzb3Iga2V5LiBUaGUgYWNjZXNzb3Iga2V5IGFsbG93cyB0aGUgZnJhbWV3b3JrIHRvCi0qIGJldHRlciB0cmFjayB3aGljaCBjbGllbnRzIGFyZSB1c2luZyB0aGUgRWRpdE1vZGVsLCBhbmQgdG8gZW5zdXJlIHRoYXQgb25seSBhIGNsaWVudCB3aGljaCBoYXMKLSogYWNjZXNzZWQgdGhlIEVkaXRNb2RlbCB3aXRoIGFuIGFjY2Vzc29yIGtleSBtYXkgaW52b2tlIHNhdmUqKClzIG9uIHRoYXQgRWRpdE1vZGVsLgotKiA8L3A+Ci0qLyAKLXB1YmxpYyBjbGFzcyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZXh0ZW5kcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUjBfN19NT0RVTEVfTUVUQV9GSUxFX05BTUUgPSAiLmNvbXBvbmVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFIxX01PRFVMRV9NRVRBX0ZJTEVfTkFNRSA9ICIuc2V0dGluZ3MvLmNvbXBvbmVudCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0NPUkVfSUQgPSAibW9kdWxlQ29yZUlkIjsgLy8kTk9OLU5MUy0xJCAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9WRVJTSU9OXzFfNSA9ICIxLjUuMCI7Ci0JcHJpdmF0ZSBib29sZWFuIHVzZU9sZEZvcm1hdCA9IGZhbHNlOwotCXB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gcmVhZE9ubHkpIHsKLSAgICAgICAgc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHJlYWRPbmx5KTsKLSAgICB9Ci0gICAgLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGlzUmVhZE9ubHkoKSAmJiBhUmVzb3VyY2UuZ2V0UmVhZENvdW50KCkgIT0gMCkKLQkJCWFSZXNvdXJjZS5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJZWxzZQotCQkJYVJlc291cmNlLnJlbGVhc2VGcm9tV3JpdGUoKTsKLQotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFSZXNvdXJjZSkgewotCQkJCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VBZGFwdGVyKTsKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWwjZ2V0UHJpbWFyeVJvb3RPYmplY3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewotCQkKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlcyA9IHByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlFT2JqZWN0IG1vZGVsUm9vdCA9IG51bGw7Ci0JCW1vZGVsUm9vdCA9IHN1cGVyLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCWlmIChtb2RlbFJvb3QgIT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHdvcmtzcGFjZSB0cmVlIGlzIGxvY2tlZCB3ZSBjYW5ub3QgdHJ5IHRvIGNoYW5nZSB0aGUgLmNvbXBvbmVudCByZXNvdXJjZQotCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkKLQkJCQlyZXR1cm4gbW9kZWxSb290OwotCQkJTGlzdCBjb21wb25lbnRzID0gKChQcm9qZWN0Q29tcG9uZW50cyltb2RlbFJvb3QpLmdldENvbXBvbmVudHMoKTsKLQkJCWlmIChjb21wb25lbnRzLnNpemUoKT4wKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCA9IChXb3JrYmVuY2hDb21wb25lbnQpY29tcG9uZW50cy5nZXQoMCk7Ci0JCQkJLy8gQ2hlY2sgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIGNsZWFuIHVwIHNwdXJyaW91cyByZWR1bmRhbnQgbWFwIGVudHJpZXMKLQkJCQlpZiAoIWlzVmVyc2lvbjE1KG1vZGVsUm9vdCkpIHsKLQkJCQkJKChQcm9qZWN0Q29tcG9uZW50cyltb2RlbFJvb3QpLnNldFZlcnNpb24oUFJPSkVDVF9WRVJTSU9OXzFfNSk7Ci0JCQkJCWNsZWFudXBXVFBNb2R1bGVzKHdiQ29tcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFJvb3Q7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnNpb24xNShFT2JqZWN0IG1vZGVsUm9vdCl7Ci0JCXJldHVybiAoKFByb2plY3RDb21wb25lbnRzKW1vZGVsUm9vdCkuZ2V0VmVyc2lvbigpLmVxdWFscyhQUk9KRUNUX1ZFUlNJT05fMV81KTsKLQl9Ci0gICAgCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZW1vdmUgc3B1cnJpb3VzIHJlZHVuZGFudCBlbnRyaWVzIGZyb20gdGhlIC5jb21wb25lbnQgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB3YkNvbXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwV1RQTW9kdWxlcyhXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wKSB7Ci0JCWlmICh3YkNvbXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJUmVzb3VyY2VUcmVlUm9vdCByb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KHdiQ29tcCk7Ci0JCUxpc3Qgcm9vdFJlc291cmNlcyA9IGdldE1vZHVsZVJlc291cmNlcyhyb290KTsKLQkJLy8gT25seSBpZiB3ZSBuZWVkIHRvIGRvIGEgY2xlYW4sIGRvIHdlIGNsZWFyLCBhZGQgYWxsIHJlcXVpcmVkIHJvb3QgcmVzb3VyY2UgbWFwcGluZ3MsIGFuZCBzYXZlCi0JCWlmICghKHdiQ29tcC5nZXRSZXNvdXJjZXMoKS5jb250YWluc0FsbChyb290UmVzb3VyY2VzKSAmJiB3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuc2l6ZSgpPT1yb290UmVzb3VyY2VzLnNpemUoKSkpIHsKLQkJCWZpbmFsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBtb2RlbCA9IG5ldyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoZ2V0RWRpdE1vZGVsSUQoKSxnZXRFbWZDb250ZXh0KCksZmFsc2UpOwotCQkJaWYobW9kZWwgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYm9vbGVhbiBqb2JTY2hlZHVsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgT2JqZWN0IGtleSA9IG5ldyBPYmplY3QoKTsKLQkJCQltb2RlbC5hY2Nlc3Moa2V5KTsKLQkJCQkKLQkJCQl3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQl3YkNvbXAuZ2V0UmVzb3VyY2VzKCkuYWRkQWxsKHJvb3RSZXNvdXJjZXMpOwotCQkJCVVSSSB1cmkgPSB3YkNvbXAuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJLy9uZWVkIHRvIGdldCB0aGlzIHJlc291cmNlIGludG8gdGhlIG1vZGVsCi0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtb2RlbC5nZXRSZXNvdXJjZSh1cmkpOwotCQkJCS8vbmVlZCB0byBtYW51YWxseSBkaXJ0eSB0aGlzIHJlc291cmNlIGluIG9yZGVyIGZvciBpdCB0byBzYXZlLgotCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCS8vdGhpcyBqb2IgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIHRoZSBkZWFkbG9jayBpbiAKLQkJCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODEyNTMKLQkJCQljbGFzcyBTYXZlSm9iIGV4dGVuZHMgSm9iIHsKLQkJCQkJCi0JCQkJCXB1YmxpYyBTYXZlSm9iKCkgewotCQkJCQkJc3VwZXIoIlNhdmUgTW9kdWxlU3RydWN0dXJhbE1vZGVsIEpvYiIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1vZGVsLnNhdmUoa2V5KTsKLQkJCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlkaXNwb3NlT25jZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWRBbHJlYWR5ID0gZmFsc2U7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlT25jZSgpewotCQkJCQkJaWYoIWRpc3Bvc2VkQWxyZWFkeSl7Ci0JCQkJCQkJZGlzcG9zZWRBbHJlYWR5ID0gdHJ1ZTsKLQkJCQkJCQltb2RlbC5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZpbmFsIFNhdmVKb2Igc2F2ZUpvYiA9IG5ldyBTYXZlSm9iKCk7Ci0JCQkJc2F2ZUpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpewotCQkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJc2F2ZUpvYi5kaXNwb3NlT25jZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJc2F2ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJc2F2ZUpvYi5zY2hlZHVsZSgpOwotCQkJCWpvYlNjaGVkdWxlZCA9IHRydWU7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICgham9iU2NoZWR1bGVkICYmIG1vZGVsICE9IG51bGwpCi0JCQkJCW1vZGVsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSAKLQl9Ci0gICAgCi0JLyoqCi0JICogVGhpcyBpcyBhIHJlY3Vyc2l2ZSBtZXRob2QgdG8gZmluZCBhbGwgdGhlIHJvb3QgbGV2ZWwgcmVzb3VyY2VzIGluIHRoZSBjaGlsZHJlbidzIHJlc291cmNlIHRyZWUgcm9vdHMKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gTGlzdCBvZiBtb2R1bGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlUmVzb3VyY2VzKFJlc291cmNlVHJlZU5vZGUgbm9kZSkgewotCQkvLyBJZiB0aGUgcmVzb3VyY2Ugbm9kZSBoYXMgbW9kdWxlIHJlc291cmNlcyBqdXN0IHJldHVybiB0aGVtCi0JCWlmIChub2RlLmdldE1vZHVsZVJlc291cmNlcygpLmxlbmd0aD4wKQotCQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qobm9kZS5nZXRNb2R1bGVSZXNvdXJjZXMoKSk7Ci0JCS8vIE90aGVyd2lzZSwgdGhlIHJvb3QgcmVzb3VyY2UgbWFwcyBhcmUgcmVhbGx5IGF0IHRoZSBuZXh0IGxldmVsIG9yIGxvd2VyCi0JCUxpc3Qgcm9vdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWFwIGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZVRyZWVOb2RlIHN1Yk5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkvLyByZWN1cnNpdmVseSBjYWxsIG1ldGhvZCB0byBvYnRhaW4gbW9kdWxlIHJlc291cmNlcwotCQkJcm9vdFJlc291cmNlcy5hZGRBbGwoZ2V0TW9kdWxlUmVzb3VyY2VzKHN1Yk5vZGUpKTsKLQkJfQotCQlyZXR1cm4gcm9vdFJlc291cmNlczsKLQl9Ci0JcHVibGljIFJlc291cmNlIHByZXBhcmVQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlYTUlSZXNvdXJjZSByZXM7Ci0JCWlmICghaXNDb21wb25lbnRTeW5jaHJvbml6ZWRPck51bGwoKSkgewotCQkJLy9SZXR1cm4gaWYgY29tcG9uZW50IGZpbGUgaXMgb3V0IG9mIHN5bmMgZnJvbSB3b3Jrc3BhY2UKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJlcyA9IChYTUlSZXNvdXJjZSkgZ2V0UHJpbWFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXNOZWVkc01pZ3JhdGluZyhyZXMpICYmICF1c2VPbGRGb3JtYXQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYocmVzID09IG51bGwpCi0JCQlyZXMgPSBtYWtlV1RQTW9kdWxlc1Jlc291cmNlKCk7CQkKLQkJdHJ5IHsKLQkJCWFkZFByb2plY3RNb2R1bGVzSWZOZWNlc3NhcnkocmVzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewkJCi0JCQlQbGF0Zm9ybS5nZXRMb2coTW9kdWxlY29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9IAotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZHMgY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIGNvbXBvbmVudCBmaWxlLCBhbmQgZmlyc3QgY2hlY2tzIGZvciBleGlzdGFuY2UsIHRoZW4gaWYgaXRzIGxvY2FsbHkgc3luY2hyb25pemVkCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZW50U3luY2hyb25pemVkT3JOdWxsKCkgewotCQlJRmlsZSBjb21wb25lbnRGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQlJUGF0aCBjb21wb25lbnRGaWxlTG9jYXRpb24gPSBjb21wb25lbnRGaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChjb21wb25lbnRGaWxlTG9jYXRpb24gIT0gbnVsbCAmJiAhY29tcG9uZW50RmlsZUxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQljb21wb25lbnRGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoUjFfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCWNvbXBvbmVudEZpbGVMb2NhdGlvbiA9IGNvbXBvbmVudEZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChjb21wb25lbnRGaWxlTG9jYXRpb24gIT0gbnVsbCAmJiAhY29tcG9uZW50RmlsZUxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJY29tcG9uZW50RmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKFIwXzdfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKLQkJCQljb21wb25lbnRGaWxlTG9jYXRpb24gPSBjb21wb25lbnRGaWxlLmdldExvY2F0aW9uKCk7Ci0JCQkJaWYgKGNvbXBvbmVudEZpbGVMb2NhdGlvbiAhPSBudWxsICYmICFjb21wb25lbnRGaWxlTG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoY29tcG9uZW50RmlsZUxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSByZXR1cm4gY29tcG9uZW50RmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JfQotCXB1YmxpYyBXVFBNb2R1bGVzUmVzb3VyY2UgIG1ha2VXVFBNb2R1bGVzUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoV1RQTW9kdWxlc1Jlc291cmNlKSBjcmVhdGVSZXNvdXJjZShXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LldUUF9NT0RVTEVTX1VSSV9PQkopOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNoZWNrQWN0aXZhdGlvbihwcmVzZW50ZXIpOwotCX0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAtIGJ5IGRlZmF1bHQgdGhpcyB3aWxsIHJldHVybiB0aGUgZmlyc3QgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSB0aGUKLQkgKiBrbm93biByZXNvdXJjZSBVUklzIGZvciB0aGlzIEVkaXRNb2RlbAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UHJpbWFyeVJlc291cmNlKCkgewotCQkvLyBPdmVycmlkZW4gdG8gaGFuZGxlIGxvYWRpbmcgdGhlIC5jb21wb25lbnQgcmVzb3VyY2UgaW4gbmV3IGFuZCBvbGQgZm9ybXMKLQkJLy8gRmlyc3Qgd2lsbCB0cnkgdG8gbG9hZCBmcm9tIC5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudAotCQkvLyBTZWNvbmQgd2lsbCB0cnkgdG8gbG9hZCBmcm9tIHRoZSBvbGQgbG9jYXRpb24ocykgLnNldHRpbmdzLy5jb21wb25lbnQgb3IgLmNvbXBvbmVudAotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQlXVFBNb2R1bGVzUmVzb3VyY2UgcmVzID0gKFdUUE1vZHVsZXNSZXNvdXJjZSlnZXRSZXNvdXJjZSh1cmkpOwotCQlpZiAocmVzID09IG51bGwgfHwgIXJlcy5pc0xvYWRlZCgpKSB7Ci0JCQlyZW1vdmVSZXNvdXJjZShyZXMpOwotCQkJdXJpID0gVVJJLmNyZWF0ZVVSSShSMV9NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCQkJcmVzID0gKFdUUE1vZHVsZXNSZXNvdXJjZSlnZXRSZXNvdXJjZSh1cmkpOwotCQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNMb2FkZWQoKSkgewotCQkJCXJlbW92ZVJlc291cmNlKHJlcyk7Ci0JCQkJdXJpID0gVVJJLmNyZWF0ZVVSSShSMF83X01PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0JCQkJcmVzID0gKFdUUE1vZHVsZXNSZXNvdXJjZSlnZXRSZXNvdXJjZSh1cmkpOwotCQkJCWlmIChyZXMgPT0gbnVsbCB8fCAhcmVzLmlzTG9hZGVkKCkpIHsKLQkJCQkJcmVtb3ZlUmVzb3VyY2UocmVzKTsKLQkJCQkJcmVzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFuQWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFuQWRhcHRlcik7IAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0TW9kdWxlc0lmTmVjZXNzYXJ5KFhNSVJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgeyAKLQkJCWlmKGFSZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVByb2plY3RDb21wb25lbnRzIHByb2plY3RNb2R1bGVzID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudGNvcmVGYWN0b3J5KCkuY3JlYXRlUHJvamVjdENvbXBvbmVudHMoKTsKLQkJCQlwcm9qZWN0TW9kdWxlcy5zZXRQcm9qZWN0TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHByb2plY3RNb2R1bGVzKTsgCi0JCQkJYVJlc291cmNlLnNldElEKHByb2plY3RNb2R1bGVzLCBNT0RVTEVfQ09SRV9JRCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIHJlc05lZWRzTWlncmF0aW5nKFhNSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIG11bHRpQ29tcHMgPSBmYWxzZTsKLQkJaWYgKHByb2plY3Q9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJvb2xlYW4gbmVlZHNNaWdyYXRpbmcgPSAoIXByb2plY3QuaGFzTmF0dXJlKEZhY2V0ZWRQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkpIHx8IHJlcyA9PSBudWxsIHx8ICgocmVzICE9IG51bGwpICYmICgoV1RQTW9kdWxlc1Jlc291cmNlKXJlcykuZ2V0Um9vdE9iamVjdCgpID09IG51bGwpOyAKLQkJaWYgKCFuZWVkc01pZ3JhdGluZykgewotCQkJaWYgKHJlcyBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSAmJiAoKFRyYW5zbGF0b3JSZXNvdXJjZSlyZXMpLmdldFJvb3RPYmplY3QoKSBpbnN0YW5jZW9mIFByb2plY3RDb21wb25lbnRzKSB7Ci0JCQkJUHJvamVjdENvbXBvbmVudHMgY29tcG9uZW50cyA9IChQcm9qZWN0Q29tcG9uZW50cykgKChXVFBNb2R1bGVzUmVzb3VyY2UpcmVzKS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJaWYgKGNvbXBvbmVudHMuZ2V0Q29tcG9uZW50cygpICE9IG51bGwpIHsKLQkJCQkJbXVsdGlDb21wcyA9IGNvbXBvbmVudHMuZ2V0Q29tcG9uZW50cygpLnNpemUoKSA+IDE7Ci0JCQkJCXJldHVybiBtdWx0aUNvbXBzOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmVlZHNNaWdyYXRpbmc7Ci0JfQotCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShVUkkgYVVyaSkgewotCQkKLQkJCVJlc291cmNlIHJlc291cmNlID0gZ2V0TG9jYWxSZXNvdXJjZShhVXJpKTsKLQkJCWlmIChudWxsICE9IHJlc291cmNlKSB7Ci0JCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7IC8vIHJlbG9hZCBpdAotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBJZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlT2xkRm9ybWF0KGJvb2xlYW4gdXNlT2xkRm9ybWF0KSB7Ci0JCXRoaXMudXNlT2xkRm9ybWF0ID0gdXNlT2xkRm9ybWF0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVjb3JlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlY29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTg0ZTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVjb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBNb2R1bGVzSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Nb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVjb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTW9kdWxlY29yZVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkvL3BsdWdpbiBpZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNb2R1bGVjb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUlBZGFwdGVyTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKLQkJCi0JCW1hbmFnZXIucmVnaXN0ZXJBZGFwdGVycyhuZXcgTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeSgpLCBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuY2xhc3MpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IEFydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5KCksIEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBBcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeSgpLCBBcnRpZmFjdEVkaXQuY2xhc3MpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMobmV3IEFydGlmYWN0RWRpdEFkYXB0ZXJGYWN0b3J5KCksIElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQkJbWFuYWdlci5yZWdpc3RlckFkYXB0ZXJzKG5ldyBNb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5KCksIElSZXNvdXJjZS5jbGFzcyk7Ci0JCQotCQlQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uc3RhcnR1cCgpOwotCQlXVFBNb2R1bGVzSW5pdC5pbml0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZHVsZWNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IE1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm1vZHVsZWNvcmUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZWNvcmQgYW4gZXJyb3IgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGFuRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGFTdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN0YXR1cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbHVnaW4uCi0JICogIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIEEgc3RhdHVzIGNvbmZpZ3VyZWQgd2l0aCB0aGlzIHBsdWdpbidzIGlkIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGFDb2RlLAotCQkJU3RyaW5nIGFNZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIGFDb2RlLAotCQkJCWFNZXNzYWdlICE9IG51bGwgPyBhTWVzc2FnZSA6ICJObyBtZXNzYWdlLiIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdENvbXBvbmVudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0Q29tcG9uZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE4YTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Qcm9qZWN0Q29tcG9uZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gKiBQcm92aWRlcyBhIHJvb3Qgb2JqZWN0IHRvIHN0b3JlIGFuZCBtYW5hZ2UgdGhlCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fXMuICogCi0gKiA8cD4KLSAqIFNlZSB0aGUgcGFja2FnZSBvdmVydmlldyBmb3IgYW4gPGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiPm92ZXJ2aWV3IG9mIHRoZSBtb2RlbCBjb21wb25lbnRzIDwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHMjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldENvbXBvbmVudHMgPGVtPkNvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvamVjdENvbXBvbmVudHMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdENvbXBvbmVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcG9uZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tcG9uZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRDb21wb25lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFByb2plY3RDb21wb25lbnRzX1ZlcnNpb24oKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRXb3JrYmVuY2hNb2R1bGUoU3RyaW5nIGFEZXBsb3lOYW1lKTsKLQotfSAvLyBQcm9qZWN0Q29tcG9uZW50cwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb2plY3RNaWdyYXRvclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ODNjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBPY3QgMjksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9OQU1FID0gIkNvbXBvbmVudFByb2plY3RNaWdyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTUlHUkFUT1JfRVhURU5TSU9OID0gIm1pZ3JhdG9yRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUlHUkFUT1JfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0IHByb2plY3RNaWdyYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOwotCi0JcHVibGljIFByb2plY3RNaWdyYXRvclJlZ2lzdHJ5KCkgewotCQlzdXBlcihNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBQcm9qZWN0TWlncmF0b3JSZWdpc3RyeSgpOwotCQkJSU5TVEFOQ0UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3LyBhbiBleHRlbnNpb24gbGlrZTogPGVhck1vZHVsZUV4dGVuc2lvbiBleHRlbnNpb25DbGFzcyA9Ci0JICogImNvbS5pYm0uZXRvb2xzLndlYi5wbHVnaW4uV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbCIvPgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfTUlHUkFUT1JfRVhURU5TSU9OKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIG1pZ3JhdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1pZ3JhdG9yID0gKElDb21wb25lbnRQcm9qZWN0TWlncmF0b3IpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihNSUdSQVRPUl9DTEFTUyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAobWlncmF0b3IgIT0gbnVsbCkKLQkJCWFkZE1vZHVsZUV4dGVuc2lvbihtaWdyYXRvcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yW10gZ2V0UHJvamVjdE1pZ3JhdG9ycygpewotCQlyZXR1cm4gKElDb21wb25lbnRQcm9qZWN0TWlncmF0b3JbXSlwcm9qZWN0TWlncmF0b3JzLnRvQXJyYXkobmV3IElDb21wb25lbnRQcm9qZWN0TWlncmF0b3JbcHJvamVjdE1pZ3JhdG9ycy5zaXplKCldKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZE1vZHVsZUV4dGVuc2lvbihJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIGV4dCkgewotCQlwcm9qZWN0TWlncmF0b3JzLmFkZChleHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1Byb3BlcnR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwZjExMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvcGVydHkuamF2YSx2IDEuMiAyMDA2LzA0LzI3IDA0OjE3OjQwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvcGVydHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHkgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRQcm9wZXJ0eV9OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1JlZmVyZW5jZWRDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9SZWZlcmVuY2VkQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTVjZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1JlZmVyZW5jZWRDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gKiBVc2VkIHRvIHJlZmVyZW5jZSB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50fXMgZWl0aGVyIGNvbnRhaW5lZCBpbgotICogdGhlIHNhbWUgcHJvamVjdCBvciByZW1vdGVseS4gCi0gKiA8cD4KLSAqIEVhY2gge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgY29udGFpbnMgYSBsaXN0IG9mIGl0cwotICogRGVwZW5kZW50TW9kdWxlcy4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIFRoZSByZWZlcmVuY2VkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDsgbWF5IGJlIGluIHRoZSBzYW1lIHByb2plY3QgYXMgdGhlCi0gKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgUmVmZXJlbmNlZENvbXBvbmVudC4gVXNlCi0gKiB7QHNlZSBNb2R1bGVDb3JlI2lzTG9jYWxEZXBlbmRlbmN5KFJlZmVyZW5jZWRDb21wb25lbnQpfSZuYnNwOyB0byBtYWtlIHRoZSBkZXRlcm1pbmF0aW9uLgotICogPC9wPiAKLSAqIDxwPgotICogU2VlIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IGZvciBhbiA8YSBocmVmPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCI+b3ZlcnZpZXcgb2YgdGhlIG1vZGVsIGNvbXBvbmVudHMgPC9hPi4KLSAqIDwvcD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEhhbmRsZSA8ZW0+SGFuZGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbmN5VHlwZSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldEFyY2hpdmVOYW1lIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZWRDb21wb25lbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBmdWxseS1xdWFsaWZpZWQgVVJJIHRoYXQgY29uZm9ybXMgdG8gdGhlIHN0YW5kYXJkICJtb2R1bGU6IiBVUkkgZm9ybWF0LiBUaGUgaGFuZGxlCi0JICogcmVmZXJlbmNlcyB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXJlcHJlc2VudGVkIGJ5IHRoZSBjdXJyZW50IFJlZmVyZW5jZWRDb21wb25lbnQuCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhbmRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFuZGxlKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0hhbmRsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuVVJJIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldEhhbmRsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQjZ2V0SGFuZGxlIDxlbT5IYW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhhbmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFuZGxlKFVSSSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SdW50aW1lIFBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SdW50aW1lIFBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJ1bnRpbWVQYXRoKElQYXRoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklQYXRoIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSVBhdGggZ2V0UnVudGltZVBhdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJ1bnRpbWUgUGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlcGVuZGVuY3kgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLiBUaGUgbGl0ZXJhbHMgYXJlCi0JICogZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBTZWUgdGhlIGNsYXNzIGRvY3VtZW50YXRpb24ge0BzZWUgRGVwZW5kZW5jeVR5cGV9Zm9yIGluZm9ybWF0aW9uIG9uIHRoZSBwdXJwb3NlIG9mIHRoaXMKLQkgKiBmaWVsZC4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBzZWUgI3NldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZUNvcmVQYWNrYWdlI2dldERlcGVuZGVudE1vZHVsZV9EZXBlbmRlbmN5VHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlcGVuZGVuY3lUeXBlIGdldERlcGVuZGVuY3lUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXREZXBlbmRlbmN5VHlwZSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZQotCSAqIEBzZWUgI2dldERlcGVuZGVuY3lUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXBlbmRlbnQgT2JqZWN0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXBlbmRlbnQgT2JqZWN0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlcGVuZGVudE9iamVjdChFT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2dldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW50T2JqZWN0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU9iamVjdCBnZXREZXBlbmRlbnRPYmplY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50I2dldERlcGVuZGVudE9iamVjdCA8ZW0+RGVwZW5kZW50IE9iamVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVwZW5kZW50IE9iamVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVwZW5kZW50T2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXBlbmRlbnRPYmplY3QoRU9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcmNoaXZlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFyY2hpdmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcmNoaXZlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFyY2hpdmVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFyY2hpdmVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudCNnZXRBcmNoaXZlTmFtZSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcmNoaXZlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFyY2hpdmVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJlZmVyZW5jZWRDb21wb25lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9TdHJ1Y3R1cmVFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvU3RydWN0dXJlRWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODkxY2U2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9TdHJ1Y3R1cmVFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkVjbGlwc2VSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQ7Ci0KLS8qKgotICogPHA+Ci0gKiBQcm92aWRlcyBhIEZhY2FkZSBwYXR0ZXJuIGZvciBhY2Nlc3NpbmcgdGhlIFdlYiBUb29scyBQbGF0Zm9ybSBFTUYgTW9kdWxlIE1vZGVsLiBNb2R1bGVDb3JlIGNhbgotICogYmUgdXNlZCBhcyBhIHN0YXRpYyB1dGlsaXR5IG9yIGFuIGluc3RhbmNlIGFkYXB0ZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1vZHVsZUNvcmUgaGlkZXMgdGhlIG1hbmFnZW1lbnQgb2YgYWNjZXNzaW5nIEVkaXRNb2RlbHMgKAotICoge0BzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZVN0cnVjdHVyYWxNb2RlbH0pIGNvcnJlY3RseS4gRWFjaCBwcm9qZWN0IGhhcwotICogZXhhY3RseSBvbmUgKHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWx9KSBmb3IgcmVhZCBhbmQKLSAqIGV4YWN0bHkgb25lIGZvciB3cml0ZS4gRWFjaCBvZiB0aGVzZSBpcyBzaGFyZWQgYW1vbmcgYWxsIGNsaWVudHMgYW5kIHJlZmVyZW5jZSBjb3VudGVkIGFzCi0gKiBuZWNlc3NhcnkuIENsaWVudHMgc2hvdWxkIHVzZSBNb2R1bGVDb3JlIHdoZW4gd29ya2luZyB3aXRoIHRoZSBXVFAgTW9kdWxlcyBTdHJjdXRydWFsIE1vZGVsLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEVhY2ggTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyBkZXNpZ25lZCB0byBtYW5hZ2UgdGhlIEVkaXRNb2RlbCBsaWZlY3ljbGUgZm9yIGNsaWVudHMuIEhvd2V2ZXIsCi0gKiB3aGlsZSBlYWNoIE1vZHVsZUNvcmUgaXMgZGVzaWduZWQgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBuZWVkZWQsIGNsaWVudHMgbXVzdCBlbmZvcmNlIHRoZQotICogTW9kdWxlQ29yZSBsaWZlY3ljbGUuIFRoZSBtb3N0IGNvbW1vbiBtZXRob2Qgb2YgYWNxdWlyaW5nIGEgTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyB0byB1c2UKLSAqIHtAc2VlICNnZXRNb2R1bGVDb3JlRm9yUmVhZChJUHJvamVjdCl9Jm5ic3A7b3Ige0BzZWUgI2dldE1vZHVsZUNvcmVGb3JXcml0ZShJUHJvamVjdCl9LgotICogPC9wPgotICogPHA+Ci0gKiBXaGVuIGNsaWVudHMgaGF2ZSBjb25jbHVkZWQgdGhlaXIgdXNlIG9mIHRoZWlyIE1vZHVsZUNvcmUgaW5zdGFuY2UgYWRhcHRlciAsIDxiPmNsaWVudHMgbXVzdCBjYWxsCi0gKiB7QHNlZSAjZGlzcG9zZSgpfTwvYj4uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1bmRlcmx5aW5nIEVkaXRNb2RlbCwgc2VlIDxhCi0gKiBocmVmPSJNb2R1bGVDb3JlTmF0dXJlLmh0bWwjbW9kdWxlLXN0cnVjdHVyYWwtbW9kZWwiPnRoZSBkaXNjdXNzaW9uIG9mIHRoZSBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwKLSAqIDwvYT4uCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmUKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdCBpbXBsZW1lbnRzIElFZGl0TW9kZWxIYW5kbGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gU3RydWN0dXJlRWRpdC5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1PRFVMRV9NRVRBX0ZJTEVfTkFNRSA9ICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDb21wb25lbnRjb3JlRmFjdG9yeSBDT01QT05FTlRfRkFDVE9SWSA9IENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRSZXNvdXJjZVtdIE5PX1JFU09VUkNFUyA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVswXTsKLQkKLQlwcml2YXRlIGZpbmFsIE1vZHVsZVN0cnVjdHVyYWxNb2RlbCBzdHJ1Y3R1cmFsTW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgZGVwZW5kZW50Q29yZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSVByb2plY3QgYVByb2plY3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU3RydWN0dXJhbE1vZGVsU2VsZk1hbmFnZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVhZE9ubHk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrYmVuY2hDb21wb25lbnRbXSBOT19DT01QT05FTlRTID0gbmV3IFdvcmtiZW5jaENvbXBvbmVudFswXTsKLQotCS8qKgotCSAqIAotCSAqIDxwPgotCSAqIEVhY2ggTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSBpcyB0aWVkIHRvIGEgc3BlY2lmaWMgcHJvamVjdC4gQSBwcm9qZWN0Ci0JICogbWF5IGhhdmUgbXVsdGlwbGUgTW9kdWxlQ29yZSBlZGl0IGZhY2FkZXMgbGl2ZSBhdCBhbnkgZ2l2ZW4gdGltZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYSBNb2R1bGVDb3JlIGZhY2FkZSBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0IHRoYXQgd2lsbCBub3QKLQkgKiBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UKLQkgKiByZXR1cm5lZCBmcm9tIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgV1RQIE1vZHVsZXMgbW9kZWwgdG8gbG9hZAotCSAqIEByZXR1cm4gQSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRvIGFjY2VzcyB0aGUgV1RQIE1vZHVsZXMgTW9kZWwsIG51bGwKLQkgKiAgICAgICAgIGZvciBub24tZmxleGlibGUgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZUVkaXQgZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoYVByb2plY3QpOwotCQlyZXR1cm4gbmF0dXJlICE9IG51bGwgPyBuZXcgU3RydWN0dXJlRWRpdChuYXR1cmUsIHRydWUpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiA8cD4KLQkgKiBFYWNoIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGUgaXMgdGllZCB0byBhIHNwZWNpZmljIHByb2plY3QuIEEgcHJvamVjdCBtYXkgaGF2ZSBtdWx0aXBsZQotCSAqIE1vZHVsZUNvcmUgZWRpdCBmYWNhZGVzIGxpdmUgYXQgYW55IGdpdmVuIHRpbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGEgTW9kdWxlQ29yZSBmYWNhZGUgZm9yIGEgc3BlY2lmaWMgcHJvamVjdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUKLQkgKiBtb2RlbC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgV1RQIE1vZHVsZXMgbW9kZWwgdG8gbG9hZAotCSAqIEByZXR1cm4gQSBNb2R1bGVDb3JlIGVkaXQgZmFjYWRlIHRvIGFjY2VzcyB0aGUgV1RQIE1vZHVsZXMgTW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZUVkaXQgZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKGFQcm9qZWN0KTsKLQkJcmV0dXJuIG5hdHVyZSAhPSBudWxsID8gbmV3IFN0cnVjdHVyZUVkaXQobmF0dXJlLCBmYWxzZSkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEEgY29udmVuaWVuY2UgQVBJIHRvIGZldGNoIHRoZSB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfSZuYnNwO2ZvciBhIHBhcnRpY3VsYXIgbW9kdWxlIFVSSS4gVGhlCi0JICogbW9kdWxlIFVSSSBtdXN0IGJlIG9mIHRoZSB2YWxpZCBmb3JtLCBvciBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIFRoZSBtb2R1bGUgVVJJIG11c3QgYmUKLQkgKiBjb250YWluZWQgYnkgYSBwcm9qZWN0IHRoYXQgaGFzIGEge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX0mbmJzcDtvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGVDb3JlTmF0dXJlIG9mIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCBhTW9kdWxlVVJJCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlQ29yZU5hdHVyZSBnZXRNb2R1bGVDb3JlTmF0dXJlKFVSSSBhTW9kdWxlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5pbmdQcm9qZWN0KGFNb2R1bGVVUkkpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKGNvbnRhaW5lcik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEZvciB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGFyZSBjb250YWluZWQgd2l0aGluIGEgcHJvamVjdCwgdGhlIGNvbnRhaW5pbmcgcHJvamVjdAotCSAqIGNhbiBiZSBkZXRlcm1pbmVkIHdpdGggdGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0ncyBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgZm9yIHRoZSBzdXBwbGllZCBtb2R1bGUgVVJJLAotCSAqIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgbWV0aG9kIHdpbGwgbm90IHJldHVybiBhbiBpbmFjY2Vzc2libGUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIHJlZmVyZW5jZWQgYnkgdGhlIG1vZHVsZSBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCkgewkKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhQ29tcG9uZW50KTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBGb3Ige0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgdGhhdCBhcmUgY29udGFpbmVkIHdpdGhpbiBhIHByb2plY3QsIHRoZSBjb250YWluaW5nIHByb2plY3QKLQkgKiBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRoIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9J3MgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0IGZvciB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSwKLQkgKiBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gYW4gaW5hY2Nlc3NpYmxlIHByb2plY3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqICAgICAgICAgICAgQSB2YWxpZCwgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBVUkkKLQkgKiBAcmV0dXJuIFRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZSByZWZlcmVuY2VkIGJ5IHRoZSBtb2R1bGUgVVJJCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0Q29udGFpbmluZ1Byb2plY3QoVVJJIGFNb2R1bGVVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJTW9kdWxlVVJJVXRpbC5lbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhTW9kdWxlVVJJLnNlZ21lbnQoTW9kdWxlVVJJVXRpbC5Nb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJdGhyb3cgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oYU1vZHVsZVVSSSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBwcm9qZWN0OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEVjbGlwc2UgSVJlc291cmNlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4gVGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlI2dldFNvdXJjZVBhdGgoKX0gJm5ic3A7bXVzdCByZXR1cm4gYQotCSAqIHZhbGlkIHJlc291cmNlIHBhdGggZm9yIFRoaXMgbWV0aG9kIHRvIHJldHVybiBhIHZhbGlkIHZhbHVlLiBUaGUgcmV0dXJuZWQgdmFsdWUgbWF5IGJlIGVpdGhlcgotCSAqIGFuIHtAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlfSZuYnNwO29yIHtAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXJ9LgotCSAqIEEgY2xpZW50IG1heSB1c2UgdGhlIHJldHVybiB2YWx1ZSBvZiB7QHNlZSBJUmVzb3VyY2UjZ2V0VHlwZSgpfSZuYnNwO3RvIGRldGVybWluZSB3aGF0IHR5cGUKLQkgKiBvZiByZXNvdXJjZSB3YXMgcmV0dXJuZWQuIChAc2VlIElSZXNvdXJjZSNGSUxFfSBvciB7QHNlZSBJUmVzb3VyY2UjRk9MREVSfSkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZVJlc291cmNlCi0JICogICAgICAgICAgICBBIENvbXBvbmVudFJlc291cmNlIHdpdGggYSB2YWxpZCBzb3VyY2VQYXRoCi0JICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBFY2xpcHNlIElSZXNvdXJjZSwgaWYgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldEVjbGlwc2VSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsKLQkJRWNsaXBzZVJlc291cmNlQWRhcHRlciBlY2xpcHNlUmVzb3VyY2VBZGFwdGVyID0gKEVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIpIEV4dGVuZGVkRWNvcmVVdGlsLmdldEFkYXB0ZXIoYU1vZHVsZVJlc291cmNlLGFNb2R1bGVSZXNvdXJjZS5lQWRhcHRlcnMoKSwgRWNsaXBzZVJlc291cmNlQWRhcHRlci5BREFQVEVSX1RZUEUpOwotCQlpZiAoZWNsaXBzZVJlc291cmNlQWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuZ2V0RWNsaXBzZVJlc291cmNlKCk7Ci0JCWVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIgPSBuZXcgRWNsaXBzZVJlc291cmNlQWRhcHRlcigpOwotCQlhTW9kdWxlUmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKGVjbGlwc2VSZXNvdXJjZUFkYXB0ZXIpOwotCQlyZXR1cm4gZWNsaXBzZVJlc291cmNlQWRhcHRlci5nZXRFY2xpcHNlUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQYXJzZXMgdGhlIHN1cHBsaWVkIFVSSSBmb3IgdGhlIGRlcGxveWVkIG5hbWUgbmFtZSBvZiB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3JlZmVyZW5jZWQKLQkgKiBieSB0aGUgVVJJLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIGRlcGxveWVkIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBzdXBwbGllZCBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVwbG95ZWROYW1lKFVSSSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIE1vZHVsZVVSSVV0aWwuZ2V0RGVwbG95ZWROYW1lKGFGdWxseVF1YWxpZmllZE1vZHVsZVVSSSk7Ci0JfQotCi0JLy9wdWJsaWMgc3RhdGljIENvbXBvbmVudFR5cGUgZ2V0Q29tcG9uZW50VHlwZShJVmlydHVhbENvbnRhaW5lciBhQ29tcG9uZW50KSB7Ci0JcHVibGljIHN0YXRpYyBDb21wb25lbnRUeXBlIGdldENvbXBvbmVudFR5cGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvbXBvbmVudENvcmUgPSBudWxsOwotCQlDb21wb25lbnRUeXBlIGNvbXBvbmVudFR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJY29tcG9uZW50Q29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gY29tcG9uZW50Q29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWNvbXBvbmVudFR5cGUgPSB3YkNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29tcG9uZW50Q29yZSAhPSBudWxsKQotCQkJCWNvbXBvbmVudENvcmUuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBjb21wb25lbnRUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgY3JlYXRlVmlydHVhbFJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBjb250ZXh0LCBSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgPSBudWxsOwotCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gbnVsbDsKLQkJVVJJIHVyaSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCk7Ci0JCWlmICh1cmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIGlzQ2xhc3NQYXRoVVJJID0gTW9kdWxlVVJJVXRpbC5pc0NsYXNzUGF0aFVSSSh1cmkpOwotCQlpZiggIWlzQ2xhc3NQYXRoVVJJICl7Ci0JCQl0cnkgeyAKLQkJCQl0YXJnZXRQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdCh1cmkpOwotCQkJfSBjYXRjaChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHV1cmllKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0gCi0JCQkvLyBpZiB0aGUgcHJvamVjdCBjYW5ub3QgYmUgcmVzb2x2ZWQsIGFzc3VtZSBpdCdzIGxvY2FsIC0gcmVhbGx5IGl0IHByb2JhYmx5IGRlbGV0ZWQgCi0JCQkKLQkJCXRhcmdldENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHRhcmdldFByb2plY3QpOyAgCi0JCQkJCi0KLQkJfWVsc2V7Ci0JCQlTdHJpbmcgYXJjaGl2ZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJYXJjaGl2ZVR5cGUgPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVUeXBlKHVyaSk7Ci0JCQkJYXJjaGl2ZU5hbWUgPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVOYW1lKHVyaSk7Ci0JCQkJCi0JCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJdGFyZ2V0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KGNvbnRleHQuZ2V0UHJvamVjdCgpLCBhcmNoaXZlVHlwZSArIElQYXRoLlNFUEFSQVRPUiArIGFyY2hpdmVOYW1lICk7IAotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbFJlZmVyZW5jZShjb250ZXh0LCB0YXJnZXRDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0UnVudGltZVBhdGgoKSwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbmN5VHlwZSgpLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJaWYgKHRvQWNjZXNzQXNSZWFkT25seSkKLQkJCXN0cnVjdHVyYWxNb2RlbCA9IGFOYXR1cmUuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCh0aGlzKTsKLQkJZWxzZQotCQkJc3RydWN0dXJhbE1vZGVsID0gYU5hdHVyZS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkJYVByb2plY3QgPSBhTmF0dXJlLmdldFByb2plY3QoKTsKLQkJaXNSZWFkT25seSA9IHRvQWNjZXNzQXNSZWFkT25seTsKLQkJaXNTdHJ1Y3R1cmFsTW9kZWxTZWxmTWFuYWdlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIG1hbmFnZSBhbiBhbHJlYWR5IGxvYWRlZCBtb2RlbC4gQ2xpZW50cyBzaG91bGQgdXNlIHRoZQotCSAqIGZvbGxvd2luZyBsaW5lIGlmIHRoZXkgaW50ZW5kIHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yOiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPk1vZHVsZUNvcmUgY29tcG9uZW50Q29yZSA9IChNb2R1bGVDb3JlKSBhU3RydWN0dXJhbE1vZGVsLmdldEFkYXB0ZXIoTW9kdWxlQ29yZS5BREFQVEVSX1RZUEUpPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFTdHJ1Y3R1cmFsTW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBlZGl0IG1vZGVsIHRvIGJlIG1hbmFnZWQgYnkgdGhpcyBNb2R1bGVDb3JlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZUVkaXQoTW9kdWxlU3RydWN0dXJhbE1vZGVsIGFTdHJ1Y3R1cmFsTW9kZWwpIHsKLQkJc3RydWN0dXJhbE1vZGVsID0gYVN0cnVjdHVyYWxNb2RlbDsKLQkJYVByb2plY3QgPSBhU3RydWN0dXJhbE1vZGVsLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBGb3JjZSBhIHNhdmUgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwuIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gVW5sZXNzCi0JICogcmVxdWlyZWQsIHVzZSB7QHNlZSAjc2F2ZUlmTmVjZXNzYXJ5KElQcm9ncmVzc01vbml0b3IpIGluc3RlYWQuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNzYXZlKCkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBNb2R1bGVDb3JlIG9iamVjdCB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJaWYgKGlzUmVhZE9ubHkpCi0JCQl0aHJvd0F0dGVtcHRlZFJlYWRPbmx5TW9kaWZpY2F0aW9uKCk7Ci0JCWVsc2UgaWYgKHZhbGlkYXRlRWRpdCgpLmlzT0soKSkgeyAKLQkJCXN5bmNocm9uaXplZCAoc3RydWN0dXJhbE1vZGVsKSB7Ci0JCQkJaWYgKCFzdHJ1Y3R1cmFsTW9kZWwuaXNEaXNwb3NlZCgpKQotCQkJCQlzdHJ1Y3R1cmFsTW9kZWwuc2F2ZShhTW9uaXRvciwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTYXZlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIG9ubHkgaWYgbm8gb3RoZXIgY2xpZW50cyBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBtb2RlbC4gSWYgdGhlCi0JICogbW9kZWwgaXMgbm90IHNoYXJlZCwgaXQgd2lsbCBiZSBzYXZlZC4gSWYgaXQgaXMgc2hhcmVkLCB0aGUgc2F2ZSB3aWxsIGJlIGRlZmVycmVkLgotCSAqIDwvcD4KLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuSUVkaXRNb2RlbEhhbmRsZXIjc2F2ZUlmTmVjZXNzYXJ5KCkKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBNb2R1bGVDb3JlIG9iamVjdCB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQlpZiAoaXNSZWFkT25seSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQkJZWxzZSBpZiAodmFsaWRhdGVFZGl0KCkuaXNPSygpKSB7IAotCQkJCWlmICghc3RydWN0dXJhbE1vZGVsLmlzRGlzcG9zZWQoKSkKLQkJCQkJc3RydWN0dXJhbE1vZGVsLnNhdmVJZk5lY2Vzc2FyeShhTW9uaXRvciwgdGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDbGllbnRzIG11c3QgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZCB3aGVuIHRoZXkgaGF2ZSBmaW5pc2hlZCB1c2luZyB0aGUgbW9kZWwsIGV2ZW4gaWYgdGhlCi0JICogTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkuCi0JICogPC9wPgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5JRWRpdE1vZGVsSGFuZGxlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkKLQkJaWYgKGlzU3RydWN0dXJhbE1vZGVsU2VsZk1hbmFnZWQgJiYgc3RydWN0dXJhbE1vZGVsIT1udWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHN0cnVjdHVyYWxNb2RlbCkgewotCQkJCWlmICghc3RydWN0dXJhbE1vZGVsLmlzRGlzcG9zZWQoKSkKLQkJCQkJc3RydWN0dXJhbE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQl9CQotCQl9Ci0JCWlmIChkZXBlbmRlbnRDb3JlcyE9bnVsbCAmJiBkZXBlbmRlbnRDb3Jlcy5zaXplKCkgPiAwKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGRlcGVuZGVudENvcmVzKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBjb3JlcyA9IGRlcGVuZGVudENvcmVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGNvcmVzLmhhc05leHQoKTspIHsKLQkJCQkJU3RydWN0dXJlRWRpdCBjb3JlID0gKFN0cnVjdHVyZUVkaXQpIGNvcmVzLm5leHQoKTsKLQkJCQkJaWYgKGNvcmUgIT0gbnVsbCkKLQkJCQkJCWNvcmUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IFdUUCBNb2R1bGUgU3RydWN0dXJhbCBNZXRhbW9kZWwgZmlsZSBpZiBuZWNlc3NhcnkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHByZXBhcmVQcm9qZWN0Q29tcG9uZW50c0lmTmVjZXNzYXJ5KCkgewotCQkKLQkJc3luY2hyb25pemVkIChzdHJ1Y3R1cmFsTW9kZWwpIHsKLQkJCWlmICghc3RydWN0dXJhbE1vZGVsLmlzRGlzcG9zZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cnVjdHVyYWxNb2RlbC5wcmVwYXJlUHJvamVjdE1vZHVsZXNJZk5lY2Vzc2FyeSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogV2hlbiBsb2FkZWQgZm9yIHdyaXRlLCB0aGUgY3VycmVudCBNb2R1bGVDb3JlIG1heSByZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZAotCSAqIHRvIGFkZCBvciByZW1vdmUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMuIElmIGEgY2xpZW50IG5lZWRzIHRvIGp1c3QgcmVhZCB0aGUgZXhpc3RpbmcKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cywgdXNlIHtAc2VlICNnZXRXb3JrYmVuY2hNb2R1bGVzKCl9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSByb290IG9iamVjdCBvZiB0aGUgdW5kZXJseWluZyBtb2RlbAotCSAqLwotCXB1YmxpYyBQcm9qZWN0Q29tcG9uZW50cyBnZXRDb21wb25lbnRNb2RlbFJvb3QoKSB7Ci0JCVByb2plY3RDb21wb25lbnRzIGNvbXBzID0gbnVsbDsKLQkJSUxvY2sgbG9jayA9IEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeS5nZXRQcm9qZWN0TG9ja09iamVjdChzdHJ1Y3R1cmFsTW9kZWwuZ2V0UHJvamVjdCgpKTsKLQkJdHJ5ewotCQkJaWYobnVsbCAhPSBsb2NrKXsKLQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplZChzdHJ1Y3R1cmFsTW9kZWwpewotCQkJCWlmICghc3RydWN0dXJhbE1vZGVsLmlzRGlzcG9zZWQoKSkKLQkJCQkJY29tcHMgPSAoUHJvamVjdENvbXBvbmVudHMpIHN0cnVjdHVyYWxNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQkJfQotCQl9IGZpbmFsbHl7Ci0JCQlpZihudWxsICE9IGxvY2spewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY29tcHM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHRoZSBhbiBhcnJheSBvZiBDb21wb25lbnRSZXNvdXJjZSB3aGljaCBiYXNpY2FsbHkgcmVwcmVzZW50IHRoZSBzb3VyY2UgY29udGFpbmVycyBvZiBhCi0JICogV29ya2JlbmNoUmVzb3VyY2UuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBnZXRTb3VyY2VDb250YWluZXJzKFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJLy8gVE9ETyBBcGkgaW4gcHJvZ3Jlc3M6IE5lZWQgdG8gcmV0dXJuIHRoZSBKYXZhIFNvdXJjZSBjb250YWluZXJzIG9mIHRoZSBwcm9qZWN0Ci0JCS8vIFRPRE8gTURFOiBJIGRvbid0IGtub3cgaWYgSSBhZ3JlZSB3aXRoIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyBtZXRob2QuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENsaWVudHMgdGhhdCB3aXNoIHRvIG1vZGlmeSB0aGUgaW5kaXZpZHVhbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7aW5zdGFuY2VzIG1heSB1c2UKLQkgKiB0aGlzIG1ldGhvZC4gSWYgY2xpZW50cyBuZWVkIHRvIGFkZCBvciByZW1vdmUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO2luc3RhbmNlcywgdXNlCi0JICoge0BzZWUgI2dldFByb2plY3RNb2R1bGVzKCl9Jm5ic3A7dG8gZ2V0IHRoZSByb290IG9iamVjdCBhbmQgdGhlbiBhY2Nlc3MgdGhlIGNvbnRhaW5lZAotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zIHRocm91Z2gge0BzZWUgUHJvamVjdENvbXBvbmVudHMjZ2V0V29ya2JlbmNoTW9kdWxlcygpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBXb3JrYmVuY2hNb2R1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsLCBpZiBhbnkuCi0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudFtdIGdldFdvcmtiZW5jaE1vZHVsZXMoKSB7Ci0JCVByb2plY3RDb21wb25lbnRzIHBjID0gZ2V0Q29tcG9uZW50TW9kZWxSb290KCk7Ci0JCWlmKHBjICE9IG51bGwpIHsKLQkJCUxpc3Qgd2JNb2R1bGVzID0gcGMuZ2V0Q29tcG9uZW50cygpOwotCQkJcmV0dXJuIChXb3JrYmVuY2hDb21wb25lbnRbXSkgd2JNb2R1bGVzLnRvQXJyYXkobmV3IFdvcmtiZW5jaENvbXBvbmVudFt3Yk1vZHVsZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIE5PX0NPTVBPTkVOVFM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggdGhlIGdpdmVuIGRlcGxveWVkIG5hbWUuIFRoZSByZXR1cm5lZCBtb2R1bGUKLQkgKiB3aWxsIGJlIGNvbnRhaW5lZCBieSB0aGUgcm9vdCBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSAoc28gbm8gbmVlZCB0byByZS1hZGQgaXQgdG8KLQkgKiB0aGUgTW9kdWxlIE1vZHVsZSByb290IG9iamVjdCkuIFRoZSBjdXJyZW50IE1vZHVsZUNvcmUgbXVzdCBub3QgYmUgcmVhZC1vbmx5IHRvIGludm9rZSBUaGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYURlcGxveU5hbWUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgU3RyaW5nIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCBhcyB0aGUgZGVwbG95ZWQtbmFtZQotCSAqIEByZXR1cm4gQSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9YXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IE1vZHVsZUNvcmUgd2l0aCB0aGUgc3VwcGxpZWQKLQkgKiAgICAgICAgIGRlcGxveWVkIG5hbWUKLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIElmIHRoZSBjdXJyZW50IE1vZHVsZUNvcmUgd2FzIGNyZWF0ZWQgYXMgcmVhZC1vbmx5Ci0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBjcmVhdGVXb3JrYmVuY2hNb2R1bGUoU3RyaW5nIGFEZXBsb3lOYW1lKSB7Ci0JCWlmIChpc1JlYWRPbmx5KQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gQ09NUE9ORU5UX0ZBQ1RPUlkuY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCk7Ci0JCW1vZHVsZS5zZXROYW1lKGFEZXBsb3lOYW1lKTsKLQkJZ2V0Q29tcG9uZW50TW9kZWxSb290KCkuZ2V0Q29tcG9uZW50cygpLmFkZChtb2R1bGUpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZSBhIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpdGggdGhlIHNvdXJjZVBhdGggb2YgYVJlc291cmNlLiBUaGUgY3VycmVudAotCSAqIE1vZHVsZUNvcmUgbXVzdCBub3QgYmUgcmVhZC1vbmx5IHRvIGludm9rZSBUaGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXRvIGNvbnRhaW4gdGhlIGNyZWF0ZWQKLQkgKiAgICAgICAgICAgIHtAc2VlIENvbXBvbmVudFJlc291cmNlfQotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgSVJlc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgc291cmNlUGF0aAotCSAqIEByZXR1cm4gQSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1hc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIGl0cyBzb3VyY2VQYXRoCi0JICogICAgICAgICBlcXVpdmFsZW50IHRvIGFSZXNvdXJjZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2UgY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UoSVJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoaXNSZWFkT25seSkKLQkJCXRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKTsKLQotCQlDb21wb25lbnRSZXNvdXJjZSBtb2R1bGVSZXNvdXJjZSA9IENPTVBPTkVOVF9GQUNUT1JZLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7IAotCQltb2R1bGVSZXNvdXJjZS5zZXRTb3VyY2VQYXRoKGFSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkubWFrZUFic29sdXRlKCkpOwotCQlyZXR1cm4gbW9kdWxlUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlIGEge0BzZWUgQ29tcG9uZW50VHlwZX0mbmJzcDt3aXRoIHRoZSBzb3VyY2VQYXRoIG9mIGFSZXNvdXJjZS4gVGhlIHJldHVybmVkIHJlc291cmNlCi0JICogd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgTW9kdWxlQ29yZS4gVGhlIGN1cnJlbnQgTW9kdWxlQ29yZSBtdXN0IG5vdCBiZSByZWFkLW9ubHkKLQkgKiB0byBpbnZva2UgVGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhUmVzb3VyY2UKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgSVJlc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgc291cmNlUGF0aAotCSAqIEByZXR1cm4gQSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1hc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIGl0cyBzb3VyY2VQYXRoCi0JICogICAgICAgICBlcXVpdmFsZW50IHRvIGFSZXNvdXJjZQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3YXMgY3JlYXRlZCBhcyByZWFkLW9ubHkKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50VHlwZSBjcmVhdGVNb2R1bGVUeXBlKFN0cmluZyBhTW9kdWxlVHlwZUlkKSB7Ci0JCWlmIChpc1JlYWRPbmx5KQotCQkJdGhyb3dBdHRlbXB0ZWRSZWFkT25seU1vZGlmaWNhdGlvbigpOwotCi0JCUNvbXBvbmVudFR5cGUgbW9kdWxlVHlwZSA9IENPTVBPTkVOVF9GQUNUT1JZLmNyZWF0ZUNvbXBvbmVudFR5cGUoKTsKLQkJbW9kdWxlVHlwZS5zZXRDb21wb25lbnRUeXBlSWQoYU1vZHVsZVR5cGVJZCk7Ci0JCXJldHVybiBtb2R1bGVUeXBlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNlYXJjaCB0aGUgZ2l2ZW4gbW9kdWxlIChpbmRpY2F0ZWQgYnkgYU1vZHVsZVVSSSkgZm9yIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogaWRlbnRpZmllZCBieSB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggKGluZGljYXRlZCBieSBhRGVwbG95ZWRSZXNvdXJjZVBhdGgpLgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkIGF0IG5leHQgSW50ZWdyYXRpb24gQnVpbGQgMDQvMTQvMDUgTURFLiBObyBzdWJzdGl0dXRlLiAoTm8gY2xpZW50cykuCi0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHBhcmFtIGFEZXBsb3llZFJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgQSBtb2R1bGUtcmVsYXRpdmUgcGF0aCB0byBhIGRlcGxveWVkIGZpbGUKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB0aGF0IGNvbnRhaW4gdGhlIFVSSSBzcGVjaWZpZWQgYnkgdGhlCi0JICogICAgICAgICBtb2R1bGUtcmVsYXRpdmUgYURlcGxveWVkUmVzb3VyY2VQYXRoCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFVSSSBhTW9kdWxlVVJJLCBVUkkgYURlcGxveWVkUmVzb3VyY2VQYXRoKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBnZXRDb21wb25lbnQoKTsKLQkJcmV0dXJuIG1vZHVsZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChuZXcgUGF0aChhRGVwbG95ZWRSZXNvdXJjZVBhdGgucGF0aCgpKSk7Ci0JfSAKLQotCS8qKgotCSAqIDxwPgotCSAqIFNlYXJjaCB0aGUgdGhlIG1vZHVsZSAoaW5kaWNhdGVkIGJ5IHRoZSByb290IG9mIGFNb2R1bGVSZXNvdXJjZVBhdGgpIGZvciB0aGUKLQkgKiB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zIGlkZW50aWZpZWQgYnkgdGhlIG1vZHVsZS1xdWFsaWZpZWQgcGF0aCAoaW5kaWNhdGVkIGJ5Ci0JICogYURlcGxveWVkUmVzb3VyY2VQYXRoKS4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBhdCBuZXh0IEludGVncmF0aW9uIEJ1aWxkIDA0LzE0LzA1IE1ERSBVc2UgSVBhdGggU2lnbmF0dXJlIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgZnVsbHktcXVhbGlmaWVkIFVSSSBvZiBhIGRlcGxveWVkIHJlc291cmNlIHdpdGhpbiBhIHNwZWNpZmljCi0JICogICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB0aGF0IGNvbnRhaW4gdGhlIFVSSSBzcGVjaWZpZWQgYnkKLQkgKiAgICAgICAgIGFNb2R1bGVSZXNvdXJjZVBhdGgKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoVVJJIGFNb2R1bGVSZXNvdXJjZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQotCQlVUkkgZGVwbG95ZWRVUkkgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KGFNb2R1bGVSZXNvdXJjZVBhdGgpOwotCQlJUGF0aCBkZXBsb3llZFBhdGggPSBuZXcgUGF0aChkZXBsb3llZFVSSS5wYXRoKCkpOwotCQlyZXR1cm4gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoTW9kdWxlVVJJVXRpbC5nZXREZXBsb3llZE5hbWUoYU1vZHVsZVJlc291cmNlUGF0aCksIGRlcGxveWVkUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFNlYXJjaCB0aGUgdGhlIG1vZHVsZSAoaW5kaWNhdGVkIGJ5IHRoZSByb290IG9mIGFNb2R1bGVSZXNvdXJjZVBhdGgpIGZvciB0aGUKLQkgKiB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zIGlkZW50aWZpZWQgYnkgdGhlIG1vZHVsZS1xdWFsaWZpZWQgcGF0aCAoaW5kaWNhdGVkIGJ5Ci0JICogYURlcGxveWVkUmVzb3VyY2VQYXRoKS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlUmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICBBIHZhbGlkIGZ1bGx5LXF1YWxpZmllZCBVUkkgb2YgYSBkZXBsb3llZCByZXNvdXJjZSB3aXRoaW4gYSBzcGVjaWZpYwotCSAqICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50Ci0JICogQHJldHVybiBBbiBhcnJheSBvZiBXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZXMgdGhhdCBjb250YWluIHRoZSBVUkkgc3BlY2lmaWVkIGJ5Ci0JICogICAgICAgICBhTW9kdWxlUmVzb3VyY2VQYXRoCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFN0cmluZyBhTW9kdWxlTmFtZSwgSVBhdGggYU1vZHVsZVJlc291cmNlUGF0aCkgeyAgIAotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gZ2V0Q29tcG9uZW50KCk7Ci0JCXJldHVybiBtb2R1bGUuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoYU1vZHVsZVJlc291cmNlUGF0aCk7Ci0JfQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoVVJJIGFXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVdvcmtzcGFjZVJlbGF0aXZlUGF0aCxSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQl9Ci0JLyoqCi0JICogPHA+Ci0JICogTG9jYXRlcyB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9cyB0aGF0IGNvbnRhaW4gdGhlIHN1cHBsaWVkIHJlc291cmNlIGluIHRoZWlyIHNvdXJjZQotCSAqIHBhdGguIFRoZXJlIGFyZSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIGNvbnRhaW5tZW50IG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX1zCi0JICogd2hpY2ggYXJlIHJldHVybmVkLiBUaGUgb25seSBndWFyYW50ZWUgaXMgdGhhdCB0aGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogc2FtZSBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgc291cmNlUGF0aCBvZiBlYWNoIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO3dpbGwgYmUgbWFwcGVkIHRvIGVpdGhlciBhbiBJRmlsZSBvciBhbgotCSAqIElGb2xkZXIuIEFzIGEgcmVzdWx0LCBpZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9Jm5ic3A7aXMgYSBjb250YWluZXIgbWFwcGluZywgdGhlIHBhdGgKLQkgKiBvZiB0aGUgc3VwcGxpZWQgcmVzb3VyY2UgbWF5IG5vdCBiZSBpZGVudGljYWwgdGhlIHNvdXJjZVBhdGggb2YgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfS4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCBhdCBuZXh0IEludGVncmF0aW9uIEJ1aWxkIDA0LzE0LzA1IE1ERSBVc2UgSVBhdGggU2lnbmF0dXJlIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGFXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgZnVsbHktcXVhbGlmaWVkIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIG9mIGEgZ2l2ZW4gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB3aGljaCBoYXZlIHNvdXJjZVBhdGhzIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHJlc291cmNlCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoVVJJIGFXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgsIGludCByZXNvdXJjZUZsYWcpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgobmV3IFBhdGgoYVdvcmtzcGFjZVJlbGF0aXZlUGF0aC5wYXRoKCkpLHJlc291cmNlRmxhZyk7Ci0JfQkKLQlwdWJsaWMgQ29tcG9uZW50UmVzb3VyY2VbXSBmaW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVQYXRoKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaW5kUmVzb3VyY2VzQnlTb3VyY2VQYXRoKGFQcm9qZWN0UmVsYXRpdmVQYXRoLFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCX0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb2NhdGVzIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGNvbnRhaW5zIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBzb3VyY2UKLQkgKiBwYXRoLiBUaGVyZSBhcmUgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBjb250YWlubWVudCBvZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9cwotCSAqIHdoaWNoIGFyZSByZXR1cm5lZC4gVGhlIG9ubHkgZ3VhcmFudGVlIGlzIHRoYXQgdGhlIHJldHVybmVkIGVsZW1lbnRzIGFyZSBjb250YWluZWQgd2l0aGluIHRoZQotCSAqIHNhbWUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHNvdXJjZVBhdGggb2YgZWFjaCB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0mbmJzcDt3aWxsIGJlIG1hcHBlZCB0byBlaXRoZXIgYW4gSUZpbGUgb3IgYW4KLQkgKiBJRm9sZGVyLiBBcyBhIHJlc3VsdCwgaWYgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO2lzIGEgY29udGFpbmVyIG1hcHBpbmcsIHRoZSBwYXRoCi0JICogb2YgdGhlIHN1cHBsaWVkIHJlc291cmNlIG1heSBub3QgYmUgaWRlbnRpY2FsIHRoZSBzb3VyY2VQYXRoIG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0uCi0JICogPC9wPiAKLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgcHJvamVjdC1yZWxhdGl2ZSBwYXRoIG9mIGEgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAgICAgICAgcmVzb3VyY2VGbGFnCi0JICogICAgICAgIAkgIEEgYml0IGZsYWcgdGhhdCBkZXRlcm1pbmVzIGlmIFJlc291cmNlcyBzaG91bGQgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIHNlYXJjaAotCSAqICAgICAgICAJCUNSRUFURV9OT05FIAotCSAqIAkJCQlDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTCi0JICogCQkJCUNSRUFURV9UUkVFTk9ERV9JRk5FQwotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VzIHdoaWNoIGhhdmUgc291cmNlUGF0aHMgdGhhdCBjb250YWluIHRoZSBnaXZlbgotCSAqICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBmaW5kQ29tcG9uZW50KElQYXRoIGFQcm9qZWN0UmVsYXRpdmVSZXNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJUHJvamVjdENvbXBvbmVudHMgcHJvamVjdE1vZHVsZXMgPSBnZXRDb21wb25lbnRNb2RlbFJvb3QoKTsKLQkJaWYgKHByb2plY3RNb2R1bGVzID09IG51bGwpIHJldHVybiBudWxsOwotCQlFTGlzdCBtb2R1bGVzID0gcHJvamVjdE1vZHVsZXMuZ2V0Q29tcG9uZW50cygpOwotCi0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQlib29sZWFuIHJlc291cmNlRXhpc3RzID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJbW9kdWxlID0gKFdvcmtiZW5jaENvbXBvbmVudCkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlyZXNvdXJjZUV4aXN0cyA9IG1vZHVsZS5leGlzdHMoYVByb2plY3RSZWxhdGl2ZVJlc291cmNlUGF0aCxyZXNvdXJjZUZsYWcpOwotCQkJaWYgKCFyZXNvdXJjZUV4aXN0cyAmJiBhUHJvamVjdFJlbGF0aXZlUmVzb3VyY2VQYXRoLnNlZ21lbnRzKCkubGVuZ3RoID4gMSkgeyAKLQkJCQlyZXNvdXJjZUV4aXN0cyA9IG1vZHVsZS5leGlzdHMoYVByb2plY3RSZWxhdGl2ZVJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLHJlc291cmNlRmxhZyk7Ci0JCQl9Ci0JCWlmIChyZXNvdXJjZUV4aXN0cykKLQkJCXJldHVybiBtb2R1bGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIDxwPgotCSAqIExvY2F0ZXMgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfXMgdGhhdCBjb250YWluIHRoZSBzdXBwbGllZCByZXNvdXJjZSBpbiB0aGVpciBzb3VyY2UKLQkgKiBwYXRoLiBUaGVyZSBhcmUgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBjb250YWlubWVudCBvZiB0aGUge0BzZWUgQ29tcG9uZW50UmVzb3VyY2V9cwotCSAqIHdoaWNoIGFyZSByZXR1cm5lZC4gVGhlIG9ubHkgZ3VhcmFudGVlIGlzIHRoYXQgdGhlIHJldHVybmVkIGVsZW1lbnRzIGFyZSBjb250YWluZWQgd2l0aGluIHRoZQotCSAqIHNhbWUgcHJvamVjdC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHNvdXJjZVBhdGggb2YgZWFjaCB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0mbmJzcDt3aWxsIGJlIG1hcHBlZCB0byBlaXRoZXIgYW4gSUZpbGUgb3IgYW4KLQkgKiBJRm9sZGVyLiBBcyBhIHJlc3VsdCwgaWYgdGhlIHtAc2VlIENvbXBvbmVudFJlc291cmNlfSZuYnNwO2lzIGEgY29udGFpbmVyIG1hcHBpbmcsIHRoZSBwYXRoCi0JICogb2YgdGhlIHN1cHBsaWVkIHJlc291cmNlIG1heSBub3QgYmUgaWRlbnRpY2FsIHRoZSBzb3VyY2VQYXRoIG9mIHRoZSB7QHNlZSBDb21wb25lbnRSZXNvdXJjZX0uCi0JICogPC9wPiAKLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIEEgdmFsaWQgcHJvamVjdC1yZWxhdGl2ZSBwYXRoIG9mIGEgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAgICAgICAgIHJlc291cmNlRmxhZwotCSAqICAgICAgICAJICBBIGJpdCBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiBSZXNvdXJjZXMgc2hvdWxkIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBzZWFyY2gKLQkgKiAgICAgICAgCQlDUkVBVEVfTk9ORSAKLQkgKiAJCQkJQ1JFQVRFX1JFU09VUkNFX0FMV0FZUwotCSAqIAkJCQlDUkVBVEVfVFJFRU5PREVfSUZORUMKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdvcmtiZW5jaE1vZHVsZVJlc291cmNlcyB3aGljaCBoYXZlIHNvdXJjZVBhdGhzIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHJlc291cmNlCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhlIHN1cHBsaWVkIG1vZHVsZSBVUkkgaXMgaW52YWxpZCBvciB1bnJlc29sdmVhYmxlLgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVByb2plY3RSZWxhdGl2ZVBhdGgsIGludCByZXNvdXJjZUZsYWcpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJUHJvamVjdENvbXBvbmVudHMgcHJvamVjdE1vZHVsZXMgPSBnZXRDb21wb25lbnRNb2RlbFJvb3QoKTsKLQkJaWYgKHByb2plY3RNb2R1bGVzPT1udWxsKQotCQkJcmV0dXJuIE5PX1JFU09VUkNFUzsKLQkJRUxpc3QgbW9kdWxlcyA9IHByb2plY3RNb2R1bGVzLmdldENvbXBvbmVudHMoKTsKLQotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBudWxsOwotCQlMaXN0IGZvdW5kUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIG1vZHVsZXMuZ2V0KGkpOwotCQkJcmVzb3VyY2VzID0gbW9kdWxlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVByb2plY3RSZWxhdGl2ZVBhdGgscmVzb3VyY2VGbGFnKTsKLQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCAmJiByZXNvdXJjZXMubGVuZ3RoICE9IDApCi0JCQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VzKSk7Ci0JCQllbHNlIGlmIChhUHJvamVjdFJlbGF0aXZlUGF0aC5zZWdtZW50cygpLmxlbmd0aCA+IDEpIHsgCi0JCQkJcmVzb3VyY2VzID0gbW9kdWxlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVByb2plY3RSZWxhdGl2ZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSxyZXNvdXJjZUZsYWcpOwotCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCAmJiByZXNvdXJjZXMubGVuZ3RoICE9IDApCi0JCQkJCWZvdW5kUmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZFJlc291cmNlcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChDb21wb25lbnRSZXNvdXJjZVtdKSBmb3VuZFJlc291cmNlcy50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVtmb3VuZFJlc291cmNlcy5zaXplKCldKTsKLQkJcmV0dXJuIE5PX1JFU09VUkNFUzsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7Y29udGFpbmVkIGJ5IHRoZSBjdXJyZW50IE1vZHVsZUNvcmUgd2l0aCB0aGUKLQkgKiBkZXBsb3kgbmFtZSBhTW9kdWxlTmFtZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlTmFtZQotCSAqIEByZXR1cm4gVGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1jb250YWluZWQgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSB3aXRoIHRoZSBkZXBsb3kKLQkgKiAgICAgICAgIG5hbWUgYU1vZHVsZU5hbWUKLQkgKiBAc2VlIFdvcmtiZW5jaENvbXBvbmVudCNnZXREZXBsb3llZE5hbWUoKQotCSAqIEBkZXByZWNhdGVkIC0gVXNlIGdldENvbXBvbmVudCgpIC0gT25seSBvbmUgY29tcG9uZW50IHBlciBwcm9qZWN0Ci0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBmaW5kQ29tcG9uZW50QnlOYW1lKFN0cmluZyBhTW9kdWxlTmFtZSkgewotCQlyZXR1cm4gZ2V0Q29tcG9uZW50TW9kZWxSb290KCkgIT0gbnVsbCA/IGdldENvbXBvbmVudE1vZGVsUm9vdCgpLmZpbmRXb3JrYmVuY2hNb2R1bGUoYU1vZHVsZU5hbWUpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBMb2NhdGUgYW5kIHJldHVybiB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3JlZmVyZW5jZWQgYnkgdGhlIGZ1bGx5LXF1YWxpZmllZAotCSAqIGFNb2R1bGVVUkkuIFRoZSBtZXRob2Qgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIGlmIHRoZSByZXF1ZXN0ZWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqICZuYnNwO2lzIGNvbnRhaW5lZCBieSBhbm90aGVyIHByb2plY3QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlVVJJCi0JICogICAgICAgICAgICBBIHZhbGlkLCBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIFVSSQotCSAqIEByZXR1cm4gVGhlIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1yZWZlcmVuY2VkIGJ5IGFNb2R1bGVVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICogQHNlZSBXb3JrYmVuY2hDb21wb25lbnQjZ2V0SGFuZGxlKCkKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGZpbmRDb21wb25lbnRCeVVSSShVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlpZiAoYU1vZHVsZVVSSSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmKGFNb2R1bGVVUkkuc2NoZW1lKCkgPT0gbnVsbCAmJiBhTW9kdWxlVVJJLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCk7Ci0JCU1vZHVsZVVSSVV0aWwuZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlVVJJKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gYU1vZHVsZVVSSS5zZWdtZW50KE1vZHVsZVVSSVV0aWwuTW9kdWxlVVJJLlBST0pFQ1RfTkFNRV9JTkRYKTsKLQkJLyogQWNjZXNzaW5nIGEgbG9jYWwgbW9kdWxlICovCi0JCWlmIChnZXRQcm9qZWN0KCkhPW51bGwgJiYgZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKQotCQkJcmV0dXJuIGdldENvbXBvbmVudCgpOwotCQlTdHJ1Y3R1cmVFZGl0IGRlcGVuZGVudENvcmUgPSBnZXREZXBlbmRlbnRNb2R1bGVDb3JlKGFNb2R1bGVVUkkpOwotCQlpZiAoZGVwZW5kZW50Q29yZSAhPSBudWxsKQotCQkJcmV0dXJuIGRlcGVuZGVudENvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNlYXJjaGVzIHRoZSBhdmFpbGFibGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgYXMgYXZhaWxhYmxlIHRocm91Z2gKLQkgKiB7QHNlZSAjZ2V0V29ya2JlbmNoTW9kdWxlcygpfSZuYnNwO2ZvciB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cyB0aGF0IGhhdmUgYQotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudCNnZXRNb2R1bGVUeXBlKCl9d2l0aCBhIGEgbW9kdWxlIHR5cGUgSWQgYXMgc3BlY2lmaWVkIGJ5Ci0JICogYU1vZHVsZVR5cGVJZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVUeXBlSWQKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgbW9kdWxlIHR5cGUgaWQgKHtAc2VlIENvbXBvbmVudFR5cGUjZ2V0TW9kdWxlVHlwZUlkKCl9KQotCSAqIEByZXR1cm4gQSBub24tbnVsbCBhcnJheSBvZiB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gbW9kdWxlIHR5cGUKLQkgKiAgICAgICAgIGlkCi0JICovCi0vLwlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50W10gZmluZENvbXBvbmVudHNCeVR5cGUoU3RyaW5nIGFNb2R1bGVUeXBlSWQpIHsKLS8vCQlXb3JrYmVuY2hDb21wb25lbnRbXSBhdmFpbGFibGVNb2R1bGVzID0gZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotLy8JCUNvbXBvbmVudFR5cGUgbW9kdWxlVHlwZTsKLS8vCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVNb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCW1vZHVsZVR5cGUgPSBhdmFpbGFibGVNb2R1bGVzW2ldLmdldENvbXBvbmVudFR5cGUoKTsKLS8vCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCAmJiBhTW9kdWxlVHlwZUlkLmVxdWFscyhtb2R1bGVUeXBlLmdldENvbXBvbmVudFR5cGVJZCgpKSkKLS8vCQkJCXJlc3VsdHMuYWRkKGF2YWlsYWJsZU1vZHVsZXNbaV0pOwotLy8JCX0KLS8vCQlpZiAocmVzdWx0cy5zaXplKCkgPT0gMCkKLS8vCQkJcmV0dXJuIE5PX01PRFVMRVM7Ci0vLwkJcmV0dXJuIChXb3JrYmVuY2hDb21wb25lbnRbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBXb3JrYmVuY2hDb21wb25lbnRbcmVzdWx0cy5zaXplKCldKTsKLS8vCX0KLQkKLQkvKioKLQkgKiBGaW5kIGFuZCByZXR1cm4gdGhlIFJlZmVyZW5jZWRDb21wb25lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBkZXBlZGVuY3kgZnJvbSBhQ29tcG9uZW50IHRvIGFSZWZlcmVuY2VkQ29tcG9uZW50LgotCSAqIDxwPlRoaXMgbWV0aG9kIGNvdWxkIHJldHVybiBudWxsLjwvcD4KLQkgKiBAcGFyYW0gYUNvbXBvbmVudAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlZENvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudCBmaW5kUmVmZXJlbmNlZENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCwgV29ya2JlbmNoQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCWlmKGFDb21wb25lbnQgPT0gbnVsbCB8fCBhUmVmZXJlbmNlZENvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCA9IGdldENvbnRhaW5pbmdQcm9qZWN0KGFSZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJRUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBhQ29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCVN0cmluZyBkZXBlbmRlbnRQcm9qZWN0TmFtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJZGVwZW5kZW50UHJvamVjdE5hbWUgPSByZWZlcmVuY2VkQ29tcG9uZW50LmdldEhhbmRsZSgpLnNlZ21lbnQoTW9kdWxlVVJJVXRpbC5Nb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwotCQkJaWYocmVmZXJlbmNlZFByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhkZXBlbmRlbnRQcm9qZWN0TmFtZSkpIAotCQkJCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50OwkJCQotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB7QHNlZSBSZWZlcmVuY2VkQ29tcG9uZW50fSZuYnNwO3JlZmVyZW5jZXMgYSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9KAotCSAqIHtAc2VlIFJlZmVyZW5jZWRDb21wb25lbnQjZ2V0SGFuZGxlKCl9KSB3aGljaCBpcyBjb250YWluZWQgYnkgdGhlIHByb2plY3QgdGhhdCB0aGUgY3VycmVudAotCSAqIE1vZHVsZUNvcmUgaXMgbWFuYWdpbmcuIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgZGV0ZXJtaW5lIGlmIHRoZSBkZXBlbmRlbmN5IGNhbiBiZQotCSAqIHNhdGlzZmllZCBieSB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYURlcGVuZGVudE1vZHVsZQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUge0BzZWUgUmVmZXJlbmNlZENvbXBvbmVudH1yZWZlcmVuY2VzIGEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fW1hbmFnZWQKLQkgKiAgICAgICAgIGRpcmVjdGx5IGJ5IHRoZSBjdXJyZW50IE1vZHVsZUNvcmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsRGVwZW5kZW5jeShSZWZlcmVuY2VkQ29tcG9uZW50IGFEZXBlbmRlbnRNb2R1bGUpIHsKLQkJaWYgKGFEZXBlbmRlbnRNb2R1bGUgPT0gbnVsbCB8fCBhRGVwZW5kZW50TW9kdWxlLmdldEhhbmRsZSgpPT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlVUkkgZGVwZW5kZW50SGFuZGxlID0gYURlcGVuZGVudE1vZHVsZS5nZXRIYW5kbGUoKTsKLQkJLy8gd2l0aCBubyBzY2hlbWUgYW5kIGEgc2ltcGxlIG5hbWUsIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCBtdXN0IGJlIGxvY2FsCi0JCWlmKGRlcGVuZGVudEhhbmRsZS5zY2hlbWUoKSA9PSBudWxsICYmIGRlcGVuZGVudEhhbmRsZS5zZWdtZW50Q291bnQoKSA9PSAxKSAgCi0JCQlyZXR1cm4gdHJ1ZTsgCi0JCXRyeSB7Ci0KLQkJCVN0cmluZyBsb2NhbFByb2plY3ROYW1lID0gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWlmKE1vZHVsZVVSSVV0aWwuZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShkZXBlbmRlbnRIYW5kbGUsIGZhbHNlKSkgewotCQkJCVN0cmluZyBkZXBlbmRlbnRQcm9qZWN0TmFtZSA9IGFEZXBlbmRlbnRNb2R1bGUuZ2V0SGFuZGxlKCkuc2VnbWVudChNb2R1bGVVUklVdGlsLk1vZHVsZVVSSS5QUk9KRUNUX05BTUVfSU5EWCk7Ci0JCQkJcmV0dXJuIGxvY2FsUHJvamVjdE5hbWUuZXF1YWxzKGRlcGVuZGVudFByb2plY3ROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUgTW9kdWxlQ29yZSBmYWNhZGUgZm9yIHRoZSBzdXBwbGllZCBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVFZGl0IGdldERlcGVuZGVudE1vZHVsZUNvcmUoVVJJIGFNb2R1bGVVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBkZXBlbmRlbnRDb3JlID0gKFN0cnVjdHVyZUVkaXQpIGRlcGVuZGVudENvcmVzLmdldChhTW9kdWxlVVJJKTsKLQkJaWYgKGRlcGVuZGVudENvcmUgIT0gbnVsbCkKLQkJCXJldHVybiBkZXBlbmRlbnRDb3JlOwotCQlzeW5jaHJvbml6ZWQgKGRlcGVuZGVudENvcmVzKSB7Ci0JCQlkZXBlbmRlbnRDb3JlID0gKFN0cnVjdHVyZUVkaXQpIGRlcGVuZGVudENvcmVzLmdldChhTW9kdWxlVVJJKTsKLQkJCWlmIChkZXBlbmRlbnRDb3JlID09IG51bGwpIHsKLQkJCQlJUHJvamVjdCBjb250YWluZXIgPSBnZXRDb250YWluaW5nUHJvamVjdChhTW9kdWxlVVJJKTsKLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJZGVwZW5kZW50Q29yZSA9IGdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGNvbnRhaW5lcik7Ci0JCQkJCWRlcGVuZGVudENvcmVzLnB1dChhTW9kdWxlVVJJLCBkZXBlbmRlbnRDb3JlKTsKLQkJCQl9IGVsc2UKLQkJCQkJdGhyb3cgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oYU1vZHVsZVVSSSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZGVudENvcmU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRocm93QXR0ZW1wdGVkUmVhZE9ubHlNb2RpZmljYXRpb24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkF0dGVtcHQgdG8gbW9kaWZ5IGEgTW9kdWxlQ29yZSBlZGl0IGZhY2FkZSB0aGF0IHdhcyBsb2FkZWQgYXMgcmVhZC1vbmx5LiIpOwotCX0KLQotCS8qKgotCSAqIHRlbXBvcmFyeSBtZXRob2QgdG8gcmV0dXJuIGZpcnN0IG1vZHVsZSBpbiB0aGUgcHJvamVjdAotCSAqIAotCSAqIEByZXR1cm4gZmlyc3QgbW9kdWxlIGluIHRoZSBwcm9qZWN0Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGdldEZpcnN0TW9kdWxlKCkgewotCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCk7Ci0JfQotCS8qKgotCSAqIHJldHVybnMgdGhlIG9uZSBhbmQgb25seSBjb21wb25lbnQgaW4gdGhlIHByb2plY3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wb25lbnQgaW4gdGhlIHByb2plY3QgaWYgZXhpc3RzIG9yIG51bGwKLQkgKiAKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50W10gY29tcHMgPSBnZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCWlmIChjb21wcy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIGNvbXBzWzBdOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVDb21wb25lbnRVUkkoSVByb2plY3QgYUNvbnRhaW5pbmdQcm9qZWN0LCBTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCArIElQYXRoLlNFUEFSQVRPUiArIFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5SRVNPVVJDRV9NT0RVTEUgKyBhQ29udGFpbmluZ1Byb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYUNvbXBvbmVudE5hbWUpOwotCX0KLQotCQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gYVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwgZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCkgewotCQlyZXR1cm4gc3RydWN0dXJhbE1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBlZGl0IGZvciByZXNvdXJjZSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdCgpIHsKLQkJSVZhbGlkYXRlRWRpdENvbnRleHQgdmFsaWRhdG9yID0gKElWYWxpZGF0ZUVkaXRDb250ZXh0KSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElWYWxpZGF0ZUVkaXRDb250ZXh0LkNMQVNTX0tFWSk7Ci0JCXJldHVybiB2YWxpZGF0b3IudmFsaWRhdGVTdGF0ZShnZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1dvcmtiZW5jaENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1dvcmtiZW5jaENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ3NTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Xb3JrYmVuY2hDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICogQW4gRU1GIHJlcHJlc2VudGF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQtdGltZSBtb2R1bGUgY29udGFpbmVkIGJ5IGFuIEVjbGlwc2UgcHJvamVjdC4gCi0gKiA8cD4gCi0gKiBTZWUgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgZm9yIGFuIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5vdmVydmlldyBvZiB0aGUgbW9kZWwgY29tcG9uZW50czwvYT4uCi0gKiA8L3A+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0Q29tcG9uZW50VHlwZSA8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50I2dldE1ldGFkYXRhUmVzb3VyY2VzIDxlbT5NZXRhZGF0YSBSZXNvdXJjZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2JlbmNoQ29tcG9uZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSNnZXRDb21wb25lbnQgPGVtPkNvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UjZ2V0Q29tcG9uZW50Ci0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZSIgb3Bwb3NpdGU9ImNvbXBvbmVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFJlc291cmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tcG9uZW50IFR5cGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvbmVudFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudCNnZXRDb21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcG9uZW50IFR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Y29yZVBhY2thZ2UjZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfUHJvcGVydGllcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0YWRhdGEgUmVzb3VyY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRofS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRjb3JlUGFja2FnZSNnZXRXb3JrYmVuY2hDb21wb25lbnRfTWV0YWRhdGFSZXNvdXJjZXMoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSVBhdGgiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1ldGFkYXRhUmVzb3VyY2VzKCk7Ci0KLQlVUkkgZ2V0SGFuZGxlKCk7Ci0KLQlDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKElQYXRoIGFEZXBsb3lQYXRoKTsKLQkKLQlDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpOwotCQotCWJvb2xlYW4gZXhpc3RzKElQYXRoIGFTb3VyY2VQYXRoLCBpbnQgcmVzb3VyY2VGbGFnKTsKLQotfSAvLyBXb3JrYmVuY2hDb21wb25lbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTFmMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2J1aWxkZXIvRGVwZW5kZW5jeUdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUdyYXBoIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZXBlbmRlbmN5R3JhcGggSU5TVEFOQ0UgPSBuZXcgRGVwZW5kZW5jeUdyYXBoKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgc3RhdGljIERlcGVuZGVuY3lHcmFwaCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhJUHJvamVjdCB0YXJnZXQpIHsKLQkJU2V0IHJlZmVyZW5jaW5nQ29tcG9uZW50cyA9IGludGVybmFsR2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKHRhcmdldCk7Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVmZXJlbmNpbmdDb21wb25lbnRzLnRvQXJyYXkobmV3IElQcm9qZWN0W3JlZmVyZW5jaW5nQ29tcG9uZW50cy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKElQcm9qZWN0IHRhcmdldCwgSVByb2plY3QgcmVmZXJlbmNpbmdDb21wb25lbnQpIHsKLQkJaW50ZXJuYWxHZXRSZWZlcmVuY2luZ0NvbXBvbmVudHModGFyZ2V0KS5hZGQocmVmZXJlbmNpbmdDb21wb25lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoSVByb2plY3QgdGFyZ2V0LCBJUHJvamVjdCByZWZlcmVuY2luZ0NvbXBvbmVudCkgewotCQlpbnRlcm5hbEdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyh0YXJnZXQpLnJlbW92ZShyZWZlcmVuY2luZ0NvbXBvbmVudCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgU2V0IGludGVybmFsR2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKElQcm9qZWN0IHRhcmdldCkgewotCQlTZXQgcmVmZXJlbmNpbmdDb21wb25lbnRzID0gKFNldCkgZGVwZW5kZW5jaWVzLmdldCh0YXJnZXQpOwotCQlpZihyZWZlcmVuY2luZ0NvbXBvbmVudHMgPT0gbnVsbCkgCi0JCQlkZXBlbmRlbmNpZXMucHV0KHRhcmdldCwgKHJlZmVyZW5jaW5nQ29tcG9uZW50cyA9IG5ldyBIYXNoU2V0KCkpKTsKLQkJcmV0dXJuIHJlZmVyZW5jaW5nQ29tcG9uZW50czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWRlcGVuZGVuY2llcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9idWlsZGVyL0RlcGVuZGVuY3lHcmFwaE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5NTE2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvYnVpbGRlci9EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyIHsKLQkKLQlwcml2YXRlIGNsYXNzIERlcGVuZGVuY3lSZWZlcmVuY2UgewotCQkKLQkJcHVibGljIElQcm9qZWN0IGNvbXBvbmVudFByb2plY3Q7Ci0JCXB1YmxpYyBJUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCQkKLQkJcHVibGljIERlcGVuZGVuY3lSZWZlcmVuY2UoSVByb2plY3QgdGFyZ2V0LCBJUHJvamVjdCBjb21wb25lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQljb21wb25lbnRQcm9qZWN0PWNvbXBvbmVudDsKLQkJCXRhcmdldFByb2plY3Q9dGFyZ2V0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVwZW5kZW5jeUdyYXBoTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX1VSSSA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7Ci0JcHJpdmF0ZSBIYXNoTWFwIHd0cE1vZHVsZVRpbWVTdGFtcHMgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBtYW5pZmVzdFRpbWVTdGFtcHMgPSBudWxsOwotCXByaXZhdGUgbG9uZyBtb2RTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQotCXByaXZhdGUgRGVwZW5kZW5jeUdyYXBoTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeUdyYXBoTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKElOU1RBTkNFID09IG51bGwpCi0JCQlJTlNUQU5DRSA9IG5ldyBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyKCk7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29uc3RydWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QhPW51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBnZXRDb21wb25lbnRGaWxlKHByb2plY3QpICE9bnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJY29uc3RydWN0SWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRDb21wb25lbnRGaWxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVJlc291cmNlIGNvbXBvbmVudEZpbGUgPSBwcm9qZWN0LmZpbmRNZW1iZXIoSU1vZHVsZUNvbnN0YW50cy5DT01QT05FTlRfRklMRV9QQVRIKTsKLQkJaWYgKGNvbXBvbmVudEZpbGUgPT0gbnVsbCkKLQkJCWNvbXBvbmVudEZpbGUgPSBwcm9qZWN0LmZpbmRNZW1iZXIoSU1vZHVsZUNvbnN0YW50cy5SMV9NT0RVTEVfTUVUQV9GSUxFX1BBVEgpOwotCQlyZXR1cm4gY29tcG9uZW50RmlsZTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjb25zdHJ1Y3RJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG1ldGFkYXRhQ2hhbmdlZCgpKSB7Ci0JCQlidWlsZERlcGVuZGVuY3lHcmFwaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG1ldGFkYXRhQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIG1vZHVsZVRpbWVTdGFtcHNDaGFuZ2VkKCkgfHwgbWFuaWZlc3RUaW1lU3RhbXBzQ2hhbmdlZCgpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWFuaWZlc3RUaW1lU3RhbXBzQ2hhbmdlZCgpIHsKLQkJSGFzaE1hcCB3b3Jrc3BhY2VUaW1lU3RhbXBzID0gY29sbGVjdE1hbmlmZXN0VGltZVN0YW1wcygpOwotCQlpZiAodGltZXN0YW1wc01hdGNoKGdldE1hbmlmZXN0VGltZVN0YW1wcygpLHdvcmtzcGFjZVRpbWVTdGFtcHMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgZ2V0TWFuaWZlc3RUaW1lU3RhbXBzKCkgewotCQlpZiAobWFuaWZlc3RUaW1lU3RhbXBzID09IG51bGwpCi0JCQltYW5pZmVzdFRpbWVTdGFtcHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gbWFuaWZlc3RUaW1lU3RhbXBzOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBjb2xsZWN0TWFuaWZlc3RUaW1lU3RhbXBzKCkgewotCQlIYXNoTWFwIHRpbWVTdGFtcHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQlmb3IgKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7Ci0JCQlpZiAocHJvamVjdHNbaV09PW51bGwgfHwgIXByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJbWFuaWZlc3RGaWxlID0gZ2V0VGltZVN0YW1wRmlsZShwcm9qZWN0c1tpXSk7Ci0JCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpICYmIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RzW2ldKSAhPSBudWxsKSB7Ci0JCQkJTG9uZyBjdXJyZW50VGltZVN0YW1wID0gbmV3IExvbmcobWFuaWZlc3RGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJCXRpbWVTdGFtcHMucHV0KHByb2plY3RzW2ldLGN1cnJlbnRUaW1lU3RhbXApOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aW1lU3RhbXBzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGZpbGUgdXNlZCBmb3IgdGltZSBzdGFtcCBwdXJwb3Nlcy4gIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIG1hbmlmZXN0IGZpbGUuCi0JICogQHBhcmFtIHAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRUaW1lU3RhbXBGaWxlKElQcm9qZWN0IHApIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocCk7Ci0JCWlmKG51bGwgPT0gY29tcG9uZW50KXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmKGNvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCXJldHVybiAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJSUZpbGUgZmlsZSA9IENvbXBvbmVudFV0aWxpdGllcy5maW5kRmlsZShjb21wb25lbnQsIG5ldyBQYXRoKE1BTklGRVNUX1VSSSkpOwotCQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJCXJldHVybiBmaWxlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtb2R1bGVUaW1lU3RhbXBzQ2hhbmdlZCgpIHsKLQkJSGFzaE1hcCB3b3Jrc3BhY2VUaW1lU3RhbXBzID0gY29sbGVjdE1vZHVsZVRpbWVTdGFtcHMoKTsKLQkJaWYgKHRpbWVzdGFtcHNNYXRjaChnZXRXdHBNb2R1bGVUaW1lU3RhbXBzKCksd29ya3NwYWNlVGltZVN0YW1wcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0aW1lc3RhbXBzTWF0Y2goSGFzaE1hcCBzYXZlZFRpbWVTdGFtcHMsIEhhc2hNYXAgd29ya3NwYWNlVGltZVN0YW1wcykgewotCQlyZXR1cm4gc2F2ZWRUaW1lU3RhbXBzLmVxdWFscyh3b3Jrc3BhY2VUaW1lU3RhbXBzKTsKLQkJCi0JfQotCQotCXByaXZhdGUgSGFzaE1hcCBjb2xsZWN0TW9kdWxlVGltZVN0YW1wcygpIHsKLQkJSGFzaE1hcCB0aW1lU3RhbXBzID0gbmV3IEhhc2hNYXAoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocHJvamVjdHNbaV09PW51bGwgfHwgIXByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKQotCQkJCWNvbnRpbnVlOwotCQkJSVJlc291cmNlIHd0cE1vZHVsZXNGaWxlID0gZ2V0Q29tcG9uZW50RmlsZShwcm9qZWN0c1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh3dHBNb2R1bGVzRmlsZSAhPSBudWxsICYmIHd0cE1vZHVsZXNGaWxlLmV4aXN0cygpICYmIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RzW2ldKSAhPSBudWxsKSB7Ci0JCQkJTG9uZyBjdXJyZW50VGltZVN0YW1wID0gbmV3IExvbmcod3RwTW9kdWxlc0ZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJdGltZVN0YW1wcy5wdXQocHJvamVjdHNbaV0sY3VycmVudFRpbWVTdGFtcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRpbWVTdGFtcHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZERlcGVuZGVuY3lHcmFwaCgpIHsKLQkJLy8gUHJvY2VzcyBhbmQgY29sbGVjdCBkZXBlbmRlbmN5IHJlZmVyZW5jZXMgdG8gYWRkCi0JCUxpc3QgcmVmZXJlbmNlc1RvQWRkID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNvbXBvbmVudFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUHJvamVjdFV0aWxpdGllcy5nZXRBbGxQcm9qZWN0cygpOwotCQkKLQkJZm9yIChpbnQgaz0wOyBrPHByb2plY3RzLmxlbmd0aDsgaysrKSB7Ci0JCQlpZiAoIXByb2plY3RzW2tdLmlzQWNjZXNzaWJsZSgpIHx8IGdldENvbXBvbmVudEZpbGUocHJvamVjdHNba10pPT1udWxsKSAKLQkJCQljb250aW51ZTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudD0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdHNba10pOwotCQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSBjb250aW51ZTsKLQkJCXJlZmVyZW5jZXNUb0FkZC5hZGRBbGwoZ2V0RGVwZW5kZW5jeVJlZmVyZW5jZXMoY29tcG9uZW50KSk7Ci0JCQljb21wb25lbnRQcm9qZWN0cy5hZGQocHJvamVjdHNba10pOwotCQl9Ci0JCQotCQkvL1VwZGF0ZSB0aGUgYWN0dWFsIGdyYXBoL3RpbWVzdGFtcHMgYW5kIGJsb2NrIG90aGVyIHRocmVhZHMgaGVyZQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWNsZWFuRGVwZW5kZW5jeUdyYXBoKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb25lbnRQcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUHJvamVjdCBwcm9qID0gKElQcm9qZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkvL0ZvciBBbGwgcHJvamVjdHMgKHJlZ2FyZGxlc3MgaWYgaW52b2x2ZWQgaW4gcmVmZXJlbmNlcyksIHVwZGF0ZSB0aW1lc3RhbXBzCi0JCQkJYWRkVGltZVN0YW1wKHByb2opOwotCQkJfQotCQkJZm9yIChpbnQgaT0wOyBpPHJlZmVyZW5jZXNUb0FkZC5zaXplKCk7IGkrKykgewotCQkJCURlcGVuZGVuY3lSZWZlcmVuY2UgcmVmID0gKERlcGVuZGVuY3lSZWZlcmVuY2UpIHJlZmVyZW5jZXNUb0FkZC5nZXQoaSk7Ci0JCQkJaWYgKHJlZi50YXJnZXRQcm9qZWN0ID09IG51bGwgfHwgcmVmLmNvbXBvbmVudFByb2plY3QgPT0gbnVsbCB8fCByZWYudGFyZ2V0UHJvamVjdC5lcXVhbHMocmVmLmNvbXBvbmVudFByb2plY3QpKQotCQkJCQljb250aW51ZTsKLQkJCQlEZXBlbmRlbmN5R3JhcGguZ2V0SW5zdGFuY2UoKS5hZGRSZWZlcmVuY2UocmVmLnRhcmdldFByb2plY3QscmVmLmNvbXBvbmVudFByb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXREZXBlbmRlbmN5UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJTGlzdCByZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBkZXBSZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yKGludCBpID0gMDsgaTxkZXBSZWZzLmxlbmd0aDsgaSsrKXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCA9IGRlcFJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYgKHRhcmdldENvbXBvbmVudCE9bnVsbCkgewotCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCXJlZnMuYWRkKG5ldyBEZXBlbmRlbmN5UmVmZXJlbmNlKHRhcmdldFByb2plY3QsY29tcG9uZW50UHJvamVjdCkpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gcmVmczsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkZFRpbWVTdGFtcChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIEdldCB0aGUgLmNvbXBvbmVudCBmaWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCQlJUmVzb3VyY2Ugd3RwTW9kdWxlc0ZpbGUgPSBnZXRDb21wb25lbnRGaWxlKHByb2plY3QpOwotCQlpZiAod3RwTW9kdWxlc0ZpbGU9PW51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxvbmcgY3VycmVudFRpbWVTdGFtcCA9IG5ldyBMb25nKHd0cE1vZHVsZXNGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQlnZXRXdHBNb2R1bGVUaW1lU3RhbXBzKCkucHV0KHByb2plY3QsY3VycmVudFRpbWVTdGFtcCk7Ci0JCS8vCQkgR2V0IHRoZSBNQU5JRkVTVCBmaWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCQlJUmVzb3VyY2UgbWFuaWZlc3RGaWxlID0gZ2V0VGltZVN0YW1wRmlsZShwcm9qZWN0KTsKLQotCQlpZiAobWFuaWZlc3RGaWxlPT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQljdXJyZW50VGltZVN0YW1wID0gbmV3IExvbmcobWFuaWZlc3RGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQlnZXRNYW5pZmVzdFRpbWVTdGFtcHMoKS5wdXQocHJvamVjdCxjdXJyZW50VGltZVN0YW1wKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhbkRlcGVuZGVuY3lHcmFwaCgpIHsKLQkJRGVwZW5kZW5jeUdyYXBoLmdldEluc3RhbmNlKCkuY2xlYXIoKTsKLQkJZ2V0V3RwTW9kdWxlVGltZVN0YW1wcygpLmNsZWFyKCk7Ci0JCWdldE1hbmlmZXN0VGltZVN0YW1wcygpLmNsZWFyKCk7Ci0JCXNldE1vZFN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemF0aW9uIGFuZCByZXR1cm4gb2YgdGhlIGtleSB2YWx1ZWQgcGFpciBvZiBwcm9qZWN0cyBhbmQgd3RwIG1vZHVsZXMgZmlsZQotCSAqIHRpbWVzdGFtcHMuCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIG9mIHByb2plY3RzIHRvIC5jb21wb25lbnQgZmlsZSBzdGFtcHMKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0V3RwTW9kdWxlVGltZVN0YW1wcygpIHsKLQkJaWYgKHd0cE1vZHVsZVRpbWVTdGFtcHMgPT0gbnVsbCkKLQkJCXd0cE1vZHVsZVRpbWVTdGFtcHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gd3RwTW9kdWxlVGltZVN0YW1wczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHdoaWNoIHdhcyBpbml0aWFsaXplZCBpZiBuZWVkIGJlIGluIHRoZSAKLQkgKiBzaW5nbGV0b24gbWFuYWdlciBtZXRob2QuCi0JICovIAotCXB1YmxpYyBEZXBlbmRlbmN5R3JhcGggZ2V0RGVwZW5kZW5jeUdyYXBoKCkgewotCQljb25zdHJ1Y3RJZk5lY2Vzc2FyeSgpOwotCQlyZXR1cm4gRGVwZW5kZW5jeUdyYXBoLmdldEluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZvcmNlUmVmcmVzaCgpIHsKLQkJYnVpbGREZXBlbmRlbmN5R3JhcGgoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgbG9uZyBnZXRNb2RTdGFtcCgpIHsKLQkJcmV0dXJuIG1vZFN0YW1wOwotCX0KLQotCQotCXByaXZhdGUgdm9pZCBzZXRNb2RTdGFtcChsb25nIG1vZFN0YW1wKSB7Ci0JCXRoaXMubW9kU3RhbXAgPSBtb2RTdGFtcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0lmU3RpbGxWYWxpZChsb25nIHRpbWVTdGFtcCkgewotCQlyZXR1cm4gKGdldE1vZFN0YW1wKCkgPT0gdGltZVN0YW1wICYmICFtZXRhZGF0YUNoYW5nZWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkODhlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5IGV4dGVuZHMgRWRpdE1vZGVsRmFjdG9yeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0VESVRfTU9ERUxfSUQgPSAib3JnLmVjbGlwc2Uud3N0Lm1vZHVsZWNvcmUuZWRpdE1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX01PRFVMRV9VUkkgPSAiTU9EVUxFX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5I2NyZWF0ZUVkaXRNb2RlbEZvclJlYWQoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQotCQlyZXR1cm4gIG5ldyBBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCXJldHVybiAgbmV3IEFydGlmYWN0RWRpdE1vZGVsKGVkaXRNb2RlbElELCBjb250ZXh0LCBmYWxzZSxmYWxzZSwgbW9kdWxlVVJJKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNnZXRDYWNoZUlEKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgeyAKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKTsKLQkJaWYobW9kdWxlVVJJICE9IG51bGwpCi0JCQlyZXR1cm4gZWRpdE1vZGVsSUQrIjoiK21vZHVsZVVSSS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlZGl0TW9kZWxJRCsiOk5PVVJJIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE1YjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklNYXBwaW5nUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkNvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbCB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBjb250YWluaW5nUHJvamVjdDsKLS8vCXByaXZhdGUgSUZvbGRlciBhcmNoaXZlUm9vdDsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbXBvbmVudENvcmVVUklDb252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Q29yZVVSSUNvbnZlcnRlcihJUHJvamVjdCBhQ29udGFpbmluZ1Byb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJY29udGFpbmluZ1Byb2plY3QgPSBhQ29udGFpbmluZ1Byb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFDb250YWluZXIKLQkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgotCSAqLwotCXB1YmxpYyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKElQcm9qZWN0IGFDb250YWluaW5nUHJvamVjdCwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgewotCQlzdXBlcihhQ29udGFpbmluZ1Byb2plY3QsIGFTeW5jaHJvbml6ZXIpOwotCQljb250YWluaW5nUHJvamVjdCA9IGFDb250YWluaW5nUHJvamVjdDsKLQl9IAotIAotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KElSZXNvdXJjZSByZXMpIHsKLQkJCi0JCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXhpc3RzKCkpCi0JCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwjbm9ybWFsaXplKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFVSSSBub3JtYWxpemUoVVJJIGFVUkkpIHsKLQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSBudWxsOwotCQlpZihQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFLmVxdWFscyhhVVJJLnNjaGVtZSgpKSkgeyAJCQotCQkJdHJ5IHsKLQkJCQlub3JtYWxpemVkVVJJID0gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLnJlc29sdmUoYVVSSSk7Ci0JCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gCi0JCX0gZWxzZSB7Ci0JCQlub3JtYWxpemVkVVJJID0gc3VwZXIubm9ybWFsaXplKGFVUkkpOwotCQl9Ci0JCWlmKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJbm9ybWFsaXplZFVSSSA9IG5ld1BsYXRmb3JtVVJJKGFVUkkpOwotCQl9Ci0JCWVsc2UgaWYobm9ybWFsaXplZFVSSS5zY2hlbWUoKSA9PSBudWxsIHx8IG5vcm1hbGl6ZWRVUkkuc2NoZW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJbm9ybWFsaXplZFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldElucHV0Q29udGFpbmVyKCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQobm9ybWFsaXplZFVSSS50b1N0cmluZygpKS50b1N0cmluZygpKTsJCi0JCX0KLQkJcmV0dXJuIG5vcm1hbGl6ZWRVUkk7Ci0JfQotCQotCXByaXZhdGUgVVJJIG5ld1BsYXRmb3JtVVJJKFVSSSBhTmV3VVJJKSB7Ci0JCQotCQl0cnkgewotLy8JCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RGVwbG95ZWROYW1lKGFOZXdVUkkpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoY29udGFpbmluZ1Byb2plY3QpOwotCi0JCQlVUkkgZGVwbG95UGF0aFNlZ21lbnQgPSBNb2R1bGVVUklVdGlsLnRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KGFOZXdVUkkpOwotCQkJCi0JCQkvL0lWaXJ0dWFsRmlsZSBuZXdGaWxlID0gY29tcG9uZW50LmdldEZpbGUobmV3IFBhdGgoZGVwbG95UGF0aFNlZ21lbnQucGF0aCgpKSk7CQkJCi0JCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCUlWaXJ0dWFsRmlsZSBuZXdGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGRlcGxveVBhdGhTZWdtZW50LnBhdGgoKSkpOwotCQkJCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobmV3RmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCSAKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnhtaS5oZWxwZXJzLkNvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIjZGVOb3JtYWxpemUoVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgZGVOb3JtYWxpemUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFBsYXRmb3JtRmlsZSh1cmkpOwotCQkJCi0JCQlpZiAoYUZpbGUgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldENvbnRhaW5pbmdQcm9qZWN0KCkpOwotCQkJCQotCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQlJUHJvamVjdCBmaWxlUHJvamVjdCA9IGdldENvbnRhaW5pbmdQcm9qZWN0KCk7Ci0JCQkJCQotCQkJCQlpZiAocmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIuZ2V0UHJvamVjdCgpID09IGZpbGVQcm9qZWN0KXsKLQkJCQkJCUxpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QoY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVycygpKTsKLQkJCQkJCUlQYXRoIHBhdGggPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UGF0aEZyb21Db250YWluZXJzKGxpc3QsIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShwYXRoLnRvU3RyaW5nKCkpOwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIHN1cGVyLmRlTm9ybWFsaXplKHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFVSSSBnZXRDb250YWluZXJSZWxhdGl2ZVVSSShJRmlsZSBhRmlsZSkgewotCQlJUGF0aCBwYXRoID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFBhdGhGcm9tQ29udGFpbmVycyhpbnB1dENvbnRhaW5lcnMsIGFGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKQotCQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocGF0aC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCBVUkkgZ2V0QXJjaGl2ZVJlbGF0aXZlVVJJKElGaWxlIGFGaWxlLCBJQ29udGFpbmVyIGFDb250YWluZXIpIHsKLQkJSVBhdGggcGF0aCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQYXRoRnJvbUNvbnRhaW5lcnMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhQ29udGFpbmVyKSwgYUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShwYXRoLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkKLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0Q29udGFpbmluZ1Byb2plY3QoKSB7Ci0JCXJldHVybiBjb250YWluaW5nUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVVJJTWFwIGdldEludGVybmFsVVJJTWFwKCkgewotCi0JICAgIGlmICh1cmlNYXAgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIFVSSU1hcHBpbmdSZWdpc3RyeUltcGwgbWFwcGluZ1JlZ2lzdHJ5SW1wbCA9IAotCSAgICAgICAgbmV3IFVSSU1hcHBpbmdSZWdpc3RyeUltcGwoKQotCSAgICAgICAgewotCSAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCSAgICAgICAgICBAT3ZlcnJpZGUKLQkgICAgICAgICAgcHJvdGVjdGVkIFVSSSBkZWxlZ2F0ZWRHZXRVUkkoVVJJIHVyaSkKLQkgICAgICAgICAgewotCSAgICAgICAgCWlmIChNb2R1bGVVUklVdGlsLmhhc0NvbnRlbnRUeXBlTmFtZSh1cmkpKQotCSAgICAgICAgCQlyZXR1cm4gbmV3UGxhdGZvcm1VUkkodXJpKTsKLQkgICAgICAgICAgICByZXR1cm4gVVJJTWFwcGluZ1JlZ2lzdHJ5SW1wbC5JTlNUQU5DRS5nZXRVUkkodXJpKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfTsKLQotCSAgICAgIHVyaU1hcCA9IChVUklNYXApbWFwcGluZ1JlZ2lzdHJ5SW1wbC5tYXAoKTsKLQkgICAgfQotCi0JICAgIHJldHVybiB1cmlNYXA7Ci0JICAKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50UmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0NzQ2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvbmVudFJlc291cmNlSW1wbC5qYXZhLHYgMS4zIDIwMDYvMDEvMTEgMTg6NDA6MzEgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtiZW5jaCBNb2R1bGUgUmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCNnZXRTb3VyY2VQYXRoIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQ29tcG9uZW50UmVzb3VyY2VJbXBsI2dldFJ1bnRpbWVQYXRoIDxlbT5SdW50aW1lIFBhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCNnZXRFeGNsdXNpb25zIDxlbT5FeGNsdXNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRSZXNvdXJjZUltcGwjZ2V0Q29tcG9uZW50IDxlbT5Db21wb25lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudFJlc291cmNlSW1wbCNnZXRSZXNvdXJjZVR5cGUgPGVtPlJlc291cmNlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRSZXNvdXJjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudFJlc291cmNlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlUGF0aCgpIDxlbT5Tb3VyY2UgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBTT1VSQ0VfUEFUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2VQYXRoKCkgPGVtPlNvdXJjZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggc291cmNlUGF0aCA9IFNPVVJDRV9QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bnRpbWVQYXRoKCkgPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggUlVOVElNRV9QQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bnRpbWVQYXRoKCkgPGVtPlJ1bnRpbWUgUGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UnVudGltZVBhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBydW50aW1lUGF0aCA9IFJVTlRJTUVfUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1c2lvbnMoKSA8ZW0+RXhjbHVzaW9uczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdXNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXhjbHVzaW9ucyA9IG51bGw7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVHlwZSgpIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1RZUEVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVHlwZSgpIDxlbT5SZXNvdXJjZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VUeXBlID0gUkVTT1VSQ0VfVFlQRV9FREVGQVVMVDsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBvd25pbmdQcm9qZWN0OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZJUlRVQUwgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFRCA9IDE7Ci0JCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IFBFUlNJU1RFRDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0U291cmNlUGF0aCgpIHsKLQkJcmV0dXJuIHNvdXJjZVBhdGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlUGF0aChJUGF0aCBuZXdTb3VyY2VQYXRoKSB7Ci0JCUlQYXRoIG9sZFNvdXJjZVBhdGggPSBzb3VyY2VQYXRoOwotCQlzb3VyY2VQYXRoID0gbmV3U291cmNlUGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSCwgb2xkU291cmNlUGF0aCwgc291cmNlUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIG5ld1J1bnRpbWVQYXRoKSB7Ci0JCUlQYXRoIG9sZFJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGg7Ci0JCXJ1bnRpbWVQYXRoID0gbmV3UnVudGltZVBhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRILCBvbGRSdW50aW1lUGF0aCwgcnVudGltZVBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhjbHVzaW9ucygpIHsKLQkJaWYgKGV4Y2x1c2lvbnMgPT0gbnVsbCkgewotCQkJZXhjbHVzaW9ucyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fRVhDTFVTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGV4Y2x1c2lvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXb3JrYmVuY2hDb21wb25lbnQpZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnQoV29ya2JlbmNoQ29tcG9uZW50IG5ld0NvbXBvbmVudCkgewotCQlpZiAobmV3Q29tcG9uZW50ICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQgJiYgbmV3Q29tcG9uZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Q29tcG9uZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb21wb25lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29tcG9uZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVMsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3Q29tcG9uZW50LCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVCwgbmV3Q29tcG9uZW50LCBuZXdDb21wb25lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIG5ld1Jlc291cmNlVHlwZSkgewotCQlTdHJpbmcgb2xkUmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQlyZXNvdXJjZVR5cGUgPSBuZXdSZXNvdXJjZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRSwgb2xkUmVzb3VyY2VUeXBlLCByZXNvdXJjZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fQ09NUE9ORU5UOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVMsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZVBhdGgoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fRVhDTFVTSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVzaW9ucygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUkVTT1VSQ0VfVFlQRToKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRIOgotCQkJCXNldFNvdXJjZVBhdGgoKElQYXRoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIOgotCQkJCXNldFJ1bnRpbWVQYXRoKChJUGF0aCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0VYQ0xVU0lPTlM6Ci0JCQkJZ2V0RXhjbHVzaW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXhjbHVzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQlzZXRDb21wb25lbnQoKFdvcmtiZW5jaENvbXBvbmVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9SRVNPVVJDRV9fU09VUkNFX1BBVEg6Ci0JCQkJc2V0U291cmNlUGF0aChTT1VSQ0VfUEFUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JVTlRJTUVfUEFUSDoKLQkJCQlzZXRSdW50aW1lUGF0aChSVU5USU1FX1BBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TOgotCQkJCWdldEV4Y2x1c2lvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQ6Ci0JCQkJc2V0Q29tcG9uZW50KChXb3JrYmVuY2hDb21wb25lbnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEU6Ci0JCQkJc2V0UmVzb3VyY2VUeXBlKFJFU09VUkNFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX1NPVVJDRV9QQVRIOgotCQkJCXJldHVybiBTT1VSQ0VfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gc291cmNlUGF0aCAhPSBudWxsIDogIVNPVVJDRV9QQVRIX0VERUZBVUxULmVxdWFscyhzb3VyY2VQYXRoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SVU5USU1FX1BBVEg6Ci0JCQkJcmV0dXJuIFJVTlRJTUVfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcnVudGltZVBhdGggIT0gbnVsbCA6ICFSVU5USU1FX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJ1bnRpbWVQYXRoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TOgotCQkJCXJldHVybiBleGNsdXNpb25zICE9IG51bGwgJiYgIWV4Y2x1c2lvbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0VfX0NPTVBPTkVOVDoKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19SRVNPVVJDRV9UWVBFOgotCQkJCXJldHVybiBSRVNPVVJDRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZVR5cGUgIT0gbnVsbCA6ICFSRVNPVVJDRV9UWVBFX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc291cmNlUGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc291cmNlUGF0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcnVudGltZVBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJ1bnRpbWVQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdXNpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdXNpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0T3duaW5nUHJvamVjdCgpIHsKLQkJcmV0dXJuIG93bmluZ1Byb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duaW5nUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewotCQlvd25pbmdQcm9qZWN0ID0gYVByb2plY3Q7Ci0JfQotCQotCi19IC8vQ29tcG9uZW50UmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvQ29tcG9uZW50VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjMmYyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50VHlwZUltcGwuamF2YSx2IDEuMSAyMDA1LzA0LzA0IDA3OjA0OjU5IGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1vZHVsZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCNnZXRDb21wb25lbnRUeXBlSWQgPGVtPkNvbXBvbmVudCBUeXBlIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Db21wb25lbnRUeXBlSW1wbCNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50VHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudFR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnRUeXBlSWQoKSA8ZW0+Q29tcG9uZW50IFR5cGUgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudFR5cGVJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbXBvbmVudFR5cGVJZCgpIDxlbT5Db21wb25lbnQgVHlwZSBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZUlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvbmVudFR5cGVJZCA9IENPTVBPTkVOVF9UWVBFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcm9wZXJ0aWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkgPGVtPk1ldGFkYXRhIFJlc291cmNlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRhZGF0YVJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGFkYXRhUmVzb3VyY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb25lbnRUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlSWQoKSB7Ci0JCXJldHVybiBjb21wb25lbnRUeXBlSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZUlkKFN0cmluZyBuZXdDb21wb25lbnRUeXBlSWQpIHsKLQkJU3RyaW5nIG9sZENvbXBvbmVudFR5cGVJZCA9IGNvbXBvbmVudFR5cGVJZDsKLQkJY29tcG9uZW50VHlwZUlkID0gbmV3Q29tcG9uZW50VHlwZUlkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fQ09NUE9ORU5UX1RZUEVfSUQsIG9sZENvbXBvbmVudFR5cGVJZCwgY29tcG9uZW50VHlwZUlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1ldGFkYXRhUmVzb3VyY2VzKCkgewotCQlpZiAobWV0YWRhdGFSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbWV0YWRhdGFSZXNvdXJjZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoSVBhdGguY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19NRVRBREFUQV9SRVNPVVJDRVMpOwotCQl9Ci0JCXJldHVybiBtZXRhZGF0YVJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUHJvcGVydHkuY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRDoKLQkJCQlyZXR1cm4gZ2V0Q29tcG9uZW50VHlwZUlkKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19NRVRBREFUQV9SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIGdldE1ldGFkYXRhUmVzb3VyY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fQ09NUE9ORU5UX1RZUEVfSUQ6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZUlkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRDoKLQkJCQlzZXRDb21wb25lbnRUeXBlSWQoQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlnZXRNZXRhZGF0YVJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkNPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRDoKLQkJCQlyZXR1cm4gQ09NUE9ORU5UX1RZUEVfSURfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBvbmVudFR5cGVJZCAhPSBudWxsIDogIUNPTVBPTkVOVF9UWVBFX0lEX0VERUZBVUxULmVxdWFscyhjb21wb25lbnRUeXBlSWQpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfVFlQRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEVfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gbWV0YWRhdGFSZXNvdXJjZXMgIT0gbnVsbCAmJiAhbWV0YWRhdGFSZXNvdXJjZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tcG9uZW50VHlwZUlkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb21wb25lbnRUeXBlSWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGFkYXRhUmVzb3VyY2VzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRhZGF0YVJlc291cmNlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbXBvbmVudFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRjb3JlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmNhYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsLmphdmEsdiAxLjggMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudGNvcmVGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudGNvcmVGYWN0b3J5IHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb25lbnRjb3JlRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJQ29tcG9uZW50Y29yZUZhY3RvcnkgdGhlQ29tcG9uZW50Y29yZUZhY3RvcnkgPSAoQ29tcG9uZW50Y29yZUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImNvbXBvbmVudGNvcmUueG1pIik7IAotCQkJaWYgKHRoZUNvbXBvbmVudGNvcmVGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdGhlQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlQ6IHJldHVybiBjcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFOiByZXR1cm4gY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEU6IHJldHVybiBjcmVhdGVDb21wb25lbnRUeXBlKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZOiByZXR1cm4gY3JlYXRlUHJvcGVydHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlQ6IHJldHVybiBjcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UUzogcmV0dXJuIGNyZWF0ZVByb2plY3RDb21wb25lbnRzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5ERVBFTkRFTkNZX1RZUEU6IHsKLQkJCQlEZXBlbmRlbmN5VHlwZSByZXN1bHQgPSBEZXBlbmRlbmN5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5JUEFUSDoKLQkJCQlyZXR1cm4gY3JlYXRlSVBhdGhGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuVVJJOgotCQkJCXJldHVybiBjcmVhdGVVUklGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLkRFUEVOREVOQ1lfVFlQRToKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuSVBBVEg6Ci0JCQkJcmV0dXJuIGNvbnZlcnRJUGF0aFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlVSSToKLQkJCQlyZXR1cm4gY29udmVydFVSSVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudCgpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50SW1wbCB3b3JrYmVuY2hDb21wb25lbnQgPSBuZXcgV29ya2JlbmNoQ29tcG9uZW50SW1wbCgpOwotCQlyZXR1cm4gd29ya2JlbmNoQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVDb21wb25lbnRSZXNvdXJjZSgpIHsKLQkJQ29tcG9uZW50UmVzb3VyY2VJbXBsIGNvbXBvbmVudFJlc291cmNlID0gbmV3IENvbXBvbmVudFJlc291cmNlSW1wbCgpOwotCQlyZXR1cm4gY29tcG9uZW50UmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFR5cGUgY3JlYXRlQ29tcG9uZW50VHlwZSgpIHsKLQkJQ29tcG9uZW50VHlwZUltcGwgY29tcG9uZW50VHlwZSA9IG5ldyBDb21wb25lbnRUeXBlSW1wbCgpOwotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKSB7Ci0JCVByb3BlcnR5SW1wbCBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50IGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKSB7Ci0JCVJlZmVyZW5jZWRDb21wb25lbnRJbXBsIHJlZmVyZW5jZWRDb21wb25lbnQgPSBuZXcgUmVmZXJlbmNlZENvbXBvbmVudEltcGwoKTsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2plY3RDb21wb25lbnRzIGNyZWF0ZVByb2plY3RDb21wb25lbnRzKCkgewotCQlQcm9qZWN0Q29tcG9uZW50c0ltcGwgcHJvamVjdENvbXBvbmVudHMgPSBuZXcgUHJvamVjdENvbXBvbmVudHNJbXBsKCk7Ci0JCXJldHVybiBwcm9qZWN0Q29tcG9uZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhdGggY3JlYXRlSVBhdGhGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChJUGF0aClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJUGF0aFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVVSSUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFVSSSlzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRVUklUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudGNvcmVQYWNrYWdlIGdldENvbXBvbmVudGNvcmVQYWNrYWdlKCkgewotCQlyZXR1cm4gKENvbXBvbmVudGNvcmVQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudGNvcmVQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vQ29tcG9uZW50Y29yZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRjb3JlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhiYTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0NvbXBvbmVudGNvcmVQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsLmphdmEsdiAxLjkgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbXBvbmVudGNvcmVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29tcG9uZW50VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2plY3RDb21wb25lbnRzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZGVwZW5kZW5jeVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBpUGF0aEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1cmlFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudGNvcmVQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wb25lbnRjb3JlUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvbmVudGNvcmVQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChDb21wb25lbnRjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21wb25lbnRjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbXBvbmVudGNvcmVQYWNrYWdlSW1wbCB0aGVDb21wb25lbnRjb3JlUGFja2FnZSA9IChDb21wb25lbnRjb3JlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQ29tcG9uZW50Y29yZVBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21wb25lbnRjb3JlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUNvbXBvbmVudGNvcmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZUNvbXBvbmVudGNvcmVQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVDb21wb25lbnRjb3JlUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtiZW5jaENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaENvbXBvbmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrYmVuY2hDb21wb25lbnRfQ29tcG9uZW50VHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9SZWZlcmVuY2VkQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtiZW5jaENvbXBvbmVudF9Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb25lbnRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFJlc291cmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1NvdXJjZVBhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRSZXNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1J1bnRpbWVQYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRSZXNvdXJjZV9FeGNsdXNpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb21wb25lbnRSZXNvdXJjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFJlc291cmNlX1Jlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFJlc291cmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gY29tcG9uZW50VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvbmVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb25lbnRUeXBlX1ZlcnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9uZW50VHlwZV9Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9uZW50VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvbmVudFR5cGVfTWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb25lbnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlZmVyZW5jZWRDb21wb25lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfSGFuZGxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZWRDb21wb25lbnRfUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVudE9iamVjdCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXJlZmVyZW5jZWRDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdENvbXBvbmVudHMoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q29tcG9uZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0Q29tcG9uZW50c19Qcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2plY3RDb21wb25lbnRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERlcGVuZGVuY3lUeXBlKCkgewotCQlyZXR1cm4gZGVwZW5kZW5jeVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldElQYXRoKCkgewotCQlyZXR1cm4gaVBhdGhFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmlFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudGNvcmVGYWN0b3J5IGdldENvbXBvbmVudGNvcmVGYWN0b3J5KCkgewotCQlyZXR1cm4gKENvbXBvbmVudGNvcmVGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXdvcmtiZW5jaENvbXBvbmVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLQkVOQ0hfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtiZW5jaENvbXBvbmVudEVDbGFzcywgV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX1JFRkVSRU5DRURfQ09NUE9ORU5UUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLCBXT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrYmVuY2hDb21wb25lbnRFQ2xhc3MsIFdPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUyk7Ci0KLQkJY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9ORU5UX1JFU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19TT1VSQ0VfUEFUSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50UmVzb3VyY2VFQ2xhc3MsIENPTVBPTkVOVF9SRVNPVVJDRV9fUlVOVElNRV9QQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19FWENMVVNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFJlc291cmNlRUNsYXNzLCBDT01QT05FTlRfUkVTT1VSQ0VfX1JFU09VUkNFX1RZUEUpOwotCi0JCWNvbXBvbmVudFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9ORU5UX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENPTVBPTkVOVF9UWVBFX19DT01QT05FTlRfVFlQRV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9uZW50VHlwZUVDbGFzcywgQ09NUE9ORU5UX1RZUEVfX1ZFUlNJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENPTVBPTkVOVF9UWVBFX19QUk9QRVJUSUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb21wb25lbnRUeXBlRUNsYXNzLCBDT01QT05FTlRfVFlQRV9fTUVUQURBVEFfUkVTT1VSQ0VTKTsKLQotCQlwcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFRkVSRU5DRURfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fUlVOVElNRV9QQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWZlcmVuY2VkQ29tcG9uZW50RUNsYXNzLCBSRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcywgUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSk7Ci0KLQkJcHJvamVjdENvbXBvbmVudHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPSkVDVF9DT01QT05FTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9qZWN0Q29tcG9uZW50c0VDbGFzcywgUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2plY3RDb21wb25lbnRzRUNsYXNzLCBQUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2plY3RDb21wb25lbnRzRUNsYXNzLCBQUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT04pOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkZXBlbmRlbmN5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oREVQRU5ERU5DWV9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlpUGF0aEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJUEFUSCk7Ci0JCXVyaUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Mod29ya2JlbmNoQ29tcG9uZW50RUNsYXNzLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICJXb3JrYmVuY2hDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtiZW5jaENvbXBvbmVudF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgIiIsIDEsIDEsIFdvcmtiZW5jaENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Jlc291cmNlcygpLCB0aGlzLmdldENvbXBvbmVudFJlc291cmNlKCksIHRoaXMuZ2V0Q29tcG9uZW50UmVzb3VyY2VfQ29tcG9uZW50KCksICJyZXNvdXJjZXMiLCBudWxsLCAwLCAtMSwgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X0NvbXBvbmVudFR5cGUoKSwgdGhpcy5nZXRDb21wb25lbnRUeXBlKCksIG51bGwsICJjb21wb25lbnRUeXBlIiwgbnVsbCwgMSwgMSwgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X1JlZmVyZW5jZWRDb21wb25lbnRzKCksIHRoaXMuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLCBudWxsLCAicmVmZXJlbmNlZENvbXBvbmVudHMiLCBudWxsLCAwLCAtMSwgV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya2JlbmNoQ29tcG9uZW50X1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtiZW5jaENvbXBvbmVudF9NZXRhZGF0YVJlc291cmNlcygpLCB0aGlzLmdldElQYXRoKCksICJtZXRhZGF0YVJlc291cmNlcyIsIG51bGwsIDAsIC0xLCBXb3JrYmVuY2hDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wb25lbnRSZXNvdXJjZUVDbGFzcywgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICJDb21wb25lbnRSZXNvdXJjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpLCB0aGlzLmdldElQYXRoKCksICJzb3VyY2VQYXRoIiwgbnVsbCwgMSwgMSwgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFJlc291cmNlX1J1bnRpbWVQYXRoKCksIHRoaXMuZ2V0SVBhdGgoKSwgInJ1bnRpbWVQYXRoIiwgbnVsbCwgMSwgMSwgQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4Y2x1c2lvbnMiLCAiIiwgMCwgLTEsIENvbXBvbmVudFJlc291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRSZXNvdXJjZV9Db21wb25lbnQoKSwgdGhpcy5nZXRXb3JrYmVuY2hDb21wb25lbnQoKSwgdGhpcy5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVzb3VyY2VzKCksICJjb21wb25lbnQiLCBudWxsLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRSZXNvdXJjZV9SZXNvdXJjZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVHlwZSIsICIiLCAxLCAxLCBDb21wb25lbnRSZXNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbXBvbmVudFR5cGVFQ2xhc3MsIENvbXBvbmVudFR5cGUuY2xhc3MsICJDb21wb25lbnRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tcG9uZW50VHlwZUlkIiwgIiIsIDEsIDEsIENvbXBvbmVudFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBvbmVudFR5cGVfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsICIiLCAxLCAxLCBDb21wb25lbnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb25lbnRUeXBlX1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRQcm9wZXJ0eSgpLCBudWxsLCAicHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBDb21wb25lbnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb25lbnRUeXBlX01ldGFkYXRhUmVzb3VyY2VzKCksIHRoaXMuZ2V0SVBhdGgoKSwgIm1ldGFkYXRhUmVzb3VyY2VzIiwgbnVsbCwgMCwgLTEsIENvbXBvbmVudFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9wZXJ0eUVDbGFzcywgUHJvcGVydHkuY2xhc3MsICJQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsICIiLCAxLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgIiIsIDEsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVmZXJlbmNlZENvbXBvbmVudEVDbGFzcywgUmVmZXJlbmNlZENvbXBvbmVudC5jbGFzcywgIlJlZmVyZW5jZWRDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlZmVyZW5jZWRDb21wb25lbnRfSGFuZGxlKCksIHRoaXMuZ2V0VVJJKCksICJoYW5kbGUiLCBudWxsLCAxLCAxLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCksIHRoaXMuZ2V0SVBhdGgoKSwgInJ1bnRpbWVQYXRoIiwgbnVsbCwgMSwgMSwgUmVmZXJlbmNlZENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbmN5VHlwZSgpLCB0aGlzLmdldERlcGVuZGVuY3lUeXBlKCksICJkZXBlbmRlbmN5VHlwZSIsIG51bGwsIDEsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlZmVyZW5jZWRDb21wb25lbnRfRGVwZW5kZW50T2JqZWN0KCksIGVjb3JlUGFja2FnZS5nZXRFT2JqZWN0KCksIG51bGwsICJkZXBlbmRlbnRPYmplY3QiLCBudWxsLCAwLCAxLCBSZWZlcmVuY2VkQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhcmNoaXZlTmFtZSIsIG51bGwsIDAsIDEsIFJlZmVyZW5jZWRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9qZWN0Q29tcG9uZW50c0VDbGFzcywgUHJvamVjdENvbXBvbmVudHMuY2xhc3MsICJQcm9qZWN0Q29tcG9uZW50cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvamVjdENvbXBvbmVudHNfUHJvamVjdE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb2plY3ROYW1lIiwgIiIsIDEsIDEsIFByb2plY3RDb21wb25lbnRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9qZWN0Q29tcG9uZW50c19Db21wb25lbnRzKCksIHRoaXMuZ2V0V29ya2JlbmNoQ29tcG9uZW50KCksIG51bGwsICJjb21wb25lbnRzIiwgbnVsbCwgMCwgLTEsIFByb2plY3RDb21wb25lbnRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvamVjdENvbXBvbmVudHNfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDEsIDEsIFByb2plY3RDb21wb25lbnRzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShkZXBlbmRlbmN5VHlwZUVFbnVtLCBEZXBlbmRlbmN5VHlwZS5jbGFzcywgIkRlcGVuZGVuY3lUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXBlbmRlbmN5VHlwZUVFbnVtLCBEZXBlbmRlbmN5VHlwZS5VU0VTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGVwZW5kZW5jeVR5cGVFRW51bSwgRGVwZW5kZW5jeVR5cGUuQ09OU1VNRVNfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoaVBhdGhFRGF0YVR5cGUsIElQYXRoLmNsYXNzLCAiSVBhdGgiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RURhdGFUeXBlKHVyaUVEYXRhVHlwZSwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSS5jbGFzcywgIlVSSSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBrZXl3b3JkcwotCQljcmVhdGVLZXl3b3Jkc0Fubm90YXRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5rZXl3b3JkczwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlS2V5d29yZHNBbm5vdGF0aW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9ICJrZXl3b3JkcyI7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpUGF0aEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImRhdGF0eXBlIiwgbnVsbAotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHVyaUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImRhdGF0eXBlIiwgbnVsbAotCQkgICB9KTsKLQl9Ci0KLX0gLy9Db21wb25lbnRjb3JlUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0lNb2R1bGVTdHJ1Y3R1cmVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSU1vZHVsZVN0cnVjdHVyZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTk3ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvSU1vZHVsZVN0cnVjdHVyZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlU3RydWN0dXJlTGlzdGVuZXIgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0cnVjdHVyZUNoYW5nZWQoTW9kdWxlU3RydWN0dXJlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9JUmVzb3VyY2VGYWN0b3J5RXh0UHRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0lSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGExYTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL0lSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzIHsKLQkKLQotCVN0cmluZyBFWFRQVF9SRVNPVVJDRV9GQUNUT1JJRVMgPSAicmVzb3VyY2VGYWN0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRBR19SRVNPVVJDRV9GQUNUT1JZID0gInJlc291cmNlRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRfU0hPUlRfU0VHTUVOVCA9ICJzaG9ydFNlZ21lbnQiOyAvLyROT04tTkxTLTEkIAotCQotCVN0cmluZyBUQUdfQ09OVEVOVFRZUEUgPSAiY29udGVudFR5cGVCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQlTdHJpbmcgQVRUX0NPTlRFTlRUWVBFSUQgPSAiY29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JU3RyaW5nIEFUVF9JU0RFRkFVTFQgPSAiaXNEZWZhdWx0IjsgLy8kTk9OLU5MUy0xJCAKLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01hcHBlZENvbXBvbmVudFhNSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGNjYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTWFwcGVkQ29tcG9uZW50WE1JSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5NYXBwZWRYTUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRDb21wb25lbnRYTUlIZWxwZXIgZXh0ZW5kcyBNYXBwZWRYTUlIZWxwZXIgewotCi0JcHVibGljIE1hcHBlZENvbXBvbmVudFhNSUhlbHBlcihYTUxSZXNvdXJjZSByZXNvdXJjZSwgTWFwIHByZWZpeGVzVG9VUklzKSB7Ci0JCXN1cGVyKHJlc291cmNlLCBwcmVmaXhlc1RvVVJJcyk7Ci0JfQotCi0JcHVibGljIFVSSSByZXNvbHZlKFVSSSByZWxhdGl2ZSwgVVJJIGJhc2UpIHsKLQkJVVJJIHJlc29sdmVkID0gbnVsbDsKLQkJaWYgKCFpc01hcHBlZChyZWxhdGl2ZSkpCi0JCQlyZXNvbHZlZCA9IHJlc29sdmVVUklGcm9tQ29tcG9uZW50KHJlbGF0aXZlLGJhc2UpOwotCQllbHNlCi0JCQlyZXNvbHZlZCA9IHJlbGF0aXZlOwotCQkKLQkJcmV0dXJuIHJlc29sdmVkID09IG51bGwgPyBzdXBlci5yZXNvbHZlKHJlbGF0aXZlLCBiYXNlKSA6IHJlc29sdmVkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNNYXBwZWQoVVJJIHJlbGF0aXZlKSB7Ci0JCWJvb2xlYW4gaXNNYXBwZWQgPSBmYWxzZTsKLQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZiAoc2V0ICE9IG51bGwpIHsKLQkJCVVSSSBsb2NhbHJlc291cmNlVVJJID0gcmVsYXRpdmU7Ci0JCQlpZiAocmVsYXRpdmUuaGFzRnJhZ21lbnQoKSkKLQkJCQlsb2NhbHJlc291cmNlVVJJID0gcmVsYXRpdmUudHJpbUZyYWdtZW50KCk7Ci0JCQlpc01hcHBlZCA9ICEoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKSBzZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSShsb2NhbHJlc291cmNlVVJJKS5lcXVhbHMobG9jYWxyZXNvdXJjZVVSSSk7Ci0JCX0KLQkJcmV0dXJuIGlzTWFwcGVkOwotCX0KLQkKLQlwcml2YXRlIFVSSSByZXNvbHZlVVJJRnJvbUNvbXBvbmVudChVUkkgcmVsYXRpdmUsIFVSSSBiYXNlKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudChiYXNlKTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgocmVsYXRpdmUudG9TdHJpbmcoKSkpOwotCQkJaWYgKHZpcnR1YWxGaWxlICE9IG51bGwpIHsKLQkJCQlJUGF0aCByZXNvbHZpbmdQYXRoID0gdmlydHVhbEZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCQkJaWYgKHJlc29sdmluZ1BhdGggIT1udWxsKSAKLQkJCQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHJlc29sdmluZ1BhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KFVSSSBiYXNlKSB7Ci0JCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKHNldCA9PSBudWxsIHx8IHNldC5nZXRVUklDb252ZXJ0ZXIoKT09bnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlVUkkgbm9ybWFsaXplZCA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoYmFzZSk7Ci0JCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKG5vcm1hbGl6ZWQpKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UGxhdGZvcm1GaWxlKG5vcm1hbGl6ZWQpOwotCQkJaWYgKGZpbGUgIT1udWxsKSB7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhmaWxlKTsKLQkJCQlpZiAodmlydHVhbFJlc291cmNlcy5sZW5ndGg+MCkKLQkJCQkJcmV0dXJuIHZpcnR1YWxSZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlSW5kZXhpbmdBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbmRleGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0NmU1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbmRleGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlSW5kZXhpbmdBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgTU9EVUxFX0lOREVYSU5HX0FEQVBURVJfQ0xBU1MgPSBNb2R1bGVJbmRleGluZ0FkYXB0ZXIuY2xhc3M7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gYU5vdGlmaWNhdGlvbikgewotCQlpZiAoYU5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBub3RpZmllciA9IChFT2JqZWN0KSBhTm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTKSB7Ci0JCQkJUHJvamVjdENvbXBvbmVudHNJbXBsIHByb2plY3RNb2R1bGVzID0gKFByb2plY3RDb21wb25lbnRzSW1wbCkgbm90aWZpZXI7Ci0JCQkJc3luY2hyb25pemVkIChwcm9qZWN0TW9kdWxlcy5nZXRNb2R1bGVzSW5kZXgoKSkgewotCQkJCQlzd2l0Y2ggKGFOb3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6Ci0JCQkJCQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGFOb3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCQlwcm9qZWN0TW9kdWxlcy5nZXRNb2R1bGVzSW5kZXgoKS5wdXQobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlKTsKLQkJCQkJfQotCQkJCX0gCi0JCQl9Ci0JCX0gCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IE1PRFVMRV9JTkRFWElOR19BREFQVEVSX0NMQVNTOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMjIxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlU3RydWN0dXJhbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlU3RydWN0dXJhbE1vZGVsRmFjdG9yeSBleHRlbmRzIEVkaXRNb2RlbEZhY3RvcnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9TVFJVQ1RVUkFMX01PREVMX0lEID0gIm9yZy5lY2xpcHNlLndzdC5tb2R1bGVjb3JlLnN0cnVjdHVyYWxNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgYW5FZGl0TW9kZWxJZCwgRU1GV29ya2JlbmNoQ29udGV4dCBhQ29udGV4dCwgTWFwIHRoZVBhcmFtcykgewotCQlyZXR1cm4gbmV3IE1vZHVsZVN0cnVjdHVyYWxNb2RlbChhbkVkaXRNb2RlbElkLCBhQ29udGV4dCwgdHJ1ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dCwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBNYXAgdGhlUGFyYW1zKSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlU3RydWN0dXJhbE1vZGVsKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCBmYWxzZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJlRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVN0cnVjdHVyZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTJlM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlU3RydWN0dXJlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI2LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLQotLy9pbiBwcm9ncmVzcy4uLgotCi1wdWJsaWMgY2xhc3MgTW9kdWxlU3RydWN0dXJlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0gICAgLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlczsKLQotICAgIHB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmVFdmVudChPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNb2R1bGVTdHJ1Y3R1cmVFdmVudChPYmplY3Qgc291cmNlLCBDb21wb25lbnRSZXNvdXJjZVtdIHRoZU1vZHVsZVJlc291cmNlcykgewotICAgICAgICBzdXBlcihzb3VyY2UpOwotICAgICAgICByZXNvdXJjZXMgPSB0aGVNb2R1bGVSZXNvdXJjZXM7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGdldE1vdWRsZVJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlczsKLSAgICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlVVJJVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlVVJJVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBjNTEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZVVSSVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVVUklVdGlsIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9QUk9UT0NPTCA9IFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5NT0RVTEVfUFJPVE9DT0wrSVBhdGguU0VQQVJBVE9SK1BsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5SRVNPVVJDRV9NT0RVTEUrSVBhdGguU0VQQVJBVE9SOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV9VUklfUFJPVE9DT0wgPSBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFX1BST1RPQ09MK0lQYXRoLlNFUEFSQVRPUitQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQ0xBU1NQQVRIICtJUGF0aC5TRVBBUkFUT1I7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTW9kdWxlVVJJIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCX1BST1RPQ09MX0lORFggPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9KRUNUX05BTUVfSU5EWCA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRFVMRV9OQU1FX0lORFggPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1RZUEVfSU5EWCA9IDM7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9TQ0hFTUUgPSAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUFJPVE9DT0wgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBBIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJIHdpbGwgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBkZXBsb3llZCBuYW1lCi0JICogb2YgdGhlIG1vZHVsZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKiAgICAgICAgICAgIEEgdmFsaWQsIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgVVJJCi0JICogQHJldHVybiBUaGUgZGVwbG95ZWQgbmFtZSBvZiB0aGUge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXJlZmVyZW5jZWQgYnkgdGhlIG1vZHVsZSBVUkkKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBJZiB0aGUgc3VwcGxpZWQgbW9kdWxlIFVSSSBpcyBpbnZhbGlkIG9yIHVucmVzb2x2ZWFibGUuCi0JICovIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlcGxveWVkTmFtZShVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQllbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFNb2R1bGVVUkkpOwotCQlyZXR1cm4gYU1vZHVsZVVSSS5zZWdtZW50KE1vZHVsZVVSSS5NT0RVTEVfTkFNRV9JTkRYKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShVUkkgYU1vZHVsZVVSSSkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotCQlyZXR1cm4gZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlVVJJLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShVUkkgYU1vZHVsZVVSSSwgYm9vbGVhbiB0b1Rocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPCAzKSB7Ci0JCQlpZih0b1Rocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkpCi0JCQkJdGhyb3cgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oYU1vZHVsZVVSSSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoVVJJIGFNb2R1bGVVUkkpIHsKLQkJaWYgKGFNb2R1bGVVUkkuc2VnbWVudENvdW50KCkgPCAzKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShVUkkgYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkksIGJvb2xlYW4gdG9UaHJvd0V4Y2VwdGlvbklmTmVjZXNzYXJ5KSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWlmIChhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zZWdtZW50Q291bnQoKSA8IDIgfHwgIVBMQVRGT1JNX1NDSEVNRS5lcXVhbHMoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkuc2NoZW1lKCkpIHx8ICFSRVNPVVJDRV9QUk9UT0NPTC5lcXVhbHMoYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkuc2VnbWVudCgwKSkpIHsKLQkJCWlmICh0b1Rocm93RXhjZXB0aW9uSWZOZWNlc3NhcnkpCi0JCQkJdGhyb3cgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24oYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkUGxhdGZvcm1VUkkoVVJJIGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgdHJpbU1vZHVsZVJlc291cmNlUGF0aFRvTW9kdWxlVVJJKFVSSSBhTW9kdWxlUmVzb3VyY2VQYXRoKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7Ci0JCWVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkoYU1vZHVsZVJlc291cmNlUGF0aCk7Ci0JCWludCB0cmltSW5kZXggPSAoaGFzQ29udGVudFR5cGVOYW1lKGFNb2R1bGVSZXNvdXJjZVBhdGgpID8gNCA6IDMpOwotCQlyZXR1cm4gYU1vZHVsZVJlc291cmNlUGF0aC50cmltU2VnbWVudHMoYU1vZHVsZVJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSAtIHRyaW1JbmRleCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgdHJpbVdvcmtzcGFjZVBhdGhUb1Byb2plY3RSZWxhdGl2ZVVSSShVUkkgYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJVVJJIHByb2plY3RSZWxhdGl2ZVBhdGggPSBudWxsOwotCQkvKiBDaGVjayBmb3IgYSBub24taGllcmFjaGljYWwgV29ya3NwYWNlLXJlbGF0aXZlIHBhdGggb2YgdGhlIGZvcm0gcGxhdGZvcm06L3Jlc291cmNlLzxwcm9qZWN0Pi8uLi4qLwotCQlpZiAoZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZFBsYXRmb3JtVVJJKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLCBmYWxzZSkpIHsKLQkJCWlmIChhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSS5zZWdtZW50Q291bnQoKSA9PSAyKQotCQkJCS8qIFRoZSBVUkkgcG9pbnRzIHRvIGEgcHJvamVjdCwgcmVzb2x2ZSB0byBhbiBlbXB0eSBVUkkgKi8KLQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLyoKLQkJCSAqIFRoZSBVUkkgaGFzIHRvIGJlID4gMiBzaW5jZSB0aGUgdmFsaWRhdGlvbiBtZXRob2QgYWJvdmUgY2hlY2tzIGZvciA8IDIsIGFuZCBqdXN0Ci0JCQkgKiBjaGVja2VkIGZvciA9PSAyIHNvIGlmIFggTk9UIDwgMiBhbmQgWCBOT1QgPT0gMiwgVEhFTiA+IDIKLQkJCSAqLwotCQkJcHJvamVjdFJlbGF0aXZlUGF0aCA9IHRyaW1Ub1JlbGF0aXZlUGF0aChhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSwgMik7Ci0KLQkJfSBlbHNlIGlmKGFGdWxseVF1YWxpZmllZFJlc291cmNlVVJJLmlzSGllcmFyY2hpY2FsKCkgJiYgYUZ1bGx5UXVhbGlmaWVkUmVzb3VyY2VVUkkucGF0aCgpLnN0YXJ0c1dpdGgoIiIrSVBhdGguU0VQQVJBVE9SKSkgewotCQkJcHJvamVjdFJlbGF0aXZlUGF0aCA9IHRyaW1Ub1JlbGF0aXZlUGF0aChhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbihhRnVsbHlRdWFsaWZpZWRSZXNvdXJjZVVSSSk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RSZWxhdGl2ZVBhdGg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJIHRyaW1Ub1JlbGF0aXZlUGF0aChVUkkgYVVSSSwgaW50IGFTdGFydEluZGV4KSB7Ci0JCVN0cmluZ0J1ZmZlciByZWxhdGl2ZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IHNlZ21lbnRJbmRleCA9IGFTdGFydEluZGV4OyBzZWdtZW50SW5kZXggPCBhVVJJLnNlZ21lbnRDb3VudCgpOyBzZWdtZW50SW5kZXgrKykgewotCQkJcmVsYXRpdmVQYXRoLmFwcGVuZChhVVJJLnNlZ21lbnQoc2VnbWVudEluZGV4KSk7Ci0JCQlpZiAoc2VnbWVudEluZGV4IDwgKGFVUkkuc2VnbWVudENvdW50KCkgLSAxKSkKLQkJCQlyZWxhdGl2ZVBhdGguYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkocmVsYXRpdmVQYXRoLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gYU1vZHVsZVJlc291cmNlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSSSB0cmltVG9EZXBsb3lQYXRoU2VnbWVudChVUkkgYUZ1bGx5UXVhbGlmaWVkTW9kdWxlUmVzb3VyY2VQYXRoKSB7Ci0JCWludCBzZWdtZW50Q291bnQgPSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVSZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCk7Ci0JCVVSSSB1cmk7Ci0JCWludCB0cmltSW5kZXggPSAoaGFzQ29udGVudFR5cGVOYW1lKGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aCkgPyA1IDogNCk7Ci0JCWlmKHNlZ21lbnRDb3VudCA+IHRyaW1JbmRleCl7Ci0JCQl1cmkgPSBhRnVsbHlRdWFsaWZpZWRNb2R1bGVSZXNvdXJjZVBhdGguZGVyZXNvbHZlKGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC50cmltU2VnbWVudHMoc2VnbWVudENvdW50IC0gdHJpbUluZGV4KSwgZmFsc2UsZmFsc2UsdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cmkgPSBVUkkuY3JlYXRlVVJJKGFGdWxseVF1YWxpZmllZE1vZHVsZVJlc291cmNlUGF0aC5zZWdtZW50KHNlZ21lbnRDb3VudC0xKSk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjb25jYXQoVVJJIHVyaTEsIFVSSSB1cmkyKXsKLQkgICAgVVJJIGNvbmNhdFVSSSA9IHVyaTEuYXBwZW5kU2VnbWVudHModXJpMi5zZWdtZW50cygpKTsKLQkgICAgcmV0dXJuIGNvbmNhdFVSSTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUkkgZnVsbHlRdWFsaWZ5VVJJKFdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZihlbnN1cmVWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKGFDb21wb25lbnQuZ2V0SGFuZGxlKCksIGZhbHNlKSkKLQkJCQlyZXR1cm4gYUNvbXBvbmVudC5nZXRIYW5kbGUoKTsgCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChhQ29tcG9uZW50KTsKLQkJCWlmKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBVUkkuY3JlYXRlVVJJKFJFU09VUkNFX1VSSV9QUk9UT0NPTCArIHByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgYUNvbXBvbmVudC5nZXROYW1lKCkpOwotCQkJfSAKLQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsgCi0JfQotCQotCi0JcHVibGljIHN0YXRpYyBVUkkgZnVsbHlRdWFsaWZ5VVJJKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKFJFU09VUkNFX1VSSV9QUk9UT0NPTCArIGFQcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVVJJIGZ1bGx5UXVhbGlmeVVSSShJUHJvamVjdCBhUHJvamVjdCwgU3RyaW5nIGNvbnRlbnRUeXBlRGVzY3JpYmVyKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKFJFU09VUkNFX1VSSV9QUk9UT0NPTCArIGFQcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGFQcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGNvbnRlbnRUeXBlRGVzY3JpYmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBhcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKFN0cmluZyBhQ29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShBUkNISVZFX1VSSV9QUk9UT0NPTCArIGFDb21wb25lbnROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NQYXRoVVJJKFVSSSB1cmkpewotCQlpZih1cmkhPW51bGwgJiYgUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLkNMQVNTUEFUSC5lcXVhbHModXJpLnNlZ21lbnQoMCkgKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVUeXBlKFVSSSBhTW9kdWxlVVJJKXRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlVVJJKTsKLQkJcmV0dXJuIGFNb2R1bGVVUkkuc2VnbWVudChNb2R1bGVVUkkuUFJPSkVDVF9OQU1FX0lORFgpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVOYW1lKFVSSSBhTW9kdWxlVVJJKXRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJZW5zdXJlVmFsaWRGdWxseVF1YWxpZmllZE1vZHVsZVVSSShhTW9kdWxlVVJJKTsKLQkJVVJJIHVyaSA9IHRyaW1Ub1JlbGF0aXZlUGF0aChhTW9kdWxlVVJJLCBNb2R1bGVVUkkuTU9EVUxFX05BTUVfSU5EWCk7Ci0JCXJldHVybiB1cmkudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SGFuZGxlU3RyaW5nKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpewotCQlpZiAoYUNvbXBvbmVudC5pc0JpbmFyeSgpKQotCQkJcmV0dXJuIE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShhQ29tcG9uZW50LmdldE5hbWUoKSkudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuICJbIiArIGFDb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkgKyAiXToiICsgYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnRUeXBlTmFtZShVUkkgdXJpKSB7Ci0JCQotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpIHx8ICFpc1ZhbGlkRnVsbHlRdWFsaWZpZWRNb2R1bGVVUkkodXJpKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyID0gKHVyaS5zZWdtZW50Q291bnQoKSA+IDMgPyB1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpIDogbnVsbCk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSh1cmkuc2VnbWVudChNb2R1bGVVUkkuQ09OVEVOVF9UWVBFX0lORFgpKSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250ZW50VHlwZU5hbWUoVVJJIHVyaSkgewotCQkKLQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllciA9ICh1cmkuc2VnbWVudENvdW50KCkgPiAzID8gdXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSA6IG51bGwpOwotCQlpZiAoY29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwgJiYgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSkgIT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExZWZjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9QbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5QbGF0Zm9ybVVSTENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24gZXh0ZW5kcyBQbGF0Zm9ybVVSTENvbm5lY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFID0gIm1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfUFJPVE9DT0wgPSBNT0RVTEUgKyBQbGF0Zm9ybVVSTEhhbmRsZXIuUFJPVE9DT0xfU0VQQVJBVE9SOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSCA9ICJjbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9NT0RVTEUgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZX01PRFVMRSA9ICJiaW5hcnkiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24oVVJMIGFVUkwpIHsKLQkJc3VwZXIoYVVSTCk7Ci0JfQotIAotCXB1YmxpYyBzdGF0aWMgVVJJIHJlc29sdmUoVVJJIGFNb2R1bGVSZXNvdXJjZVJ1bnRpbWVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJSVByb2plY3QgY29tcG9uZW50UHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QoYU1vZHVsZVJlc291cmNlUnVudGltZVBhdGgpOwotCQkJLy9TdHJpbmcgY29tcG9uZW50TmFtZSA9IE1vZHVsZVVSSVV0aWwuZ2V0RGVwbG95ZWROYW1lKGFNb2R1bGVSZXNvdXJjZVJ1bnRpbWVQYXRoKTsKLQkJCVVSSSBydW50aW1lVVJJID0gTW9kdWxlVVJJVXRpbC50cmltVG9EZXBsb3lQYXRoU2VnbWVudChhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aCk7Ci0JCQlJUGF0aCBydW50aW1lUGF0aCA9IG5ldyBQYXRoKHJ1bnRpbWVVUkkucGF0aCgpKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFByb2plY3QpOwotCQkJLy9JVmlydHVhbEZpbGUgdkZpbGUgPSBjb21wb25lbnQuZ2V0RmlsZShydW50aW1lUGF0aCk7Ci0JCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCWludCBtYXRjaGluZ1NlZ3MgPSBydW50aW1lUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocm9vdEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJaWYobWF0Y2hpbmdTZWdzID4gMCkKLQkJCQlydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmdTZWdzKTsKLQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShydW50aW1lUGF0aCk7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkodkZpbGUuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBhTW9kdWxlUmVzb3VyY2VSdW50aW1lUGF0aDsKLQkJIAotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgVVJJIG5vcm1hbGl6ZVRvV29ya3NwYWNlUmVsYXRpdmUoSVByb2plY3QgcHJvamVjdCwgSVBhdGggc291cmNlUGF0aCwgVVJJIG1vZHVsZVJlc291cmNlRGVwbG95UGF0aCkgdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gewotLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotLy8JCXJldHVybiBVUkkuY3JlYXRlVVJJKHByb2plY3ROYW1lICsgJy8nICsgc291cmNlUGF0aC50b1N0cmluZygpKTsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LlBsYXRmb3JtVVJMQ29ubmVjdGlvbiNyZXNvbHZlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgVVJMIHJlc29sdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVSTDogIiArIGdldFVSTCgpKTsKLQkJLy9JUGF0aCBtb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJLy9TdHJpbmcgbW9kdWxlTmFtZSA9IG1vZHVsZVJlbGF0aXZlUGF0aC5zZWdtZW50KDEpOwotCi0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IG51bGw7IC8vIGhhbmRsZS5nZXRSZXNvbHZlZFBhdGgoKS5hcHBlbmQobW9kdWxlUmVsYXRpdmVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMikpOwotCi0JCWludCBjb3VudCA9IHJlc29sdmVkUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJLy8gaWYgdGhlcmUgYXJlIHR3byBzZWdtZW50cyB0aGVuIHRoZSBzZWNvbmQgaXMgYSBwcm9qZWN0IG5hbWUuCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocmVzb2x2ZWRQYXRoLnNlZ21lbnQoMCkpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCS8vIFRPRE8gRml4IHRoaXMgc3RyaW5nCi0JCQlTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3QgcmVzb2x2ZSBVUkwiOyAvL1BvbGljeS5iaW5kKCJ1cmwuY291bGROb3RSZXNvbHZlIiwgcHJvamVjdC5nZXROYW1lKCksIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCUlQYXRoIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjb3VudCA9PSAyKQotCQkJcmVzdWx0ID0gcHJvamVjdC5nZXRMb2NhdGlvbigpOwotCQllbHNlIHsKLQkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQkJcmVzdWx0ID0gcHJvamVjdC5nZXRGaWxlKHJlc29sdmVkUGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVSTCgiZmlsZSIsICIiLCByZXN1bHQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCVBsYXRmb3JtVVJMSGFuZGxlci5yZWdpc3RlcihQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uTU9EVUxFLCBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uY2xhc3MpOwotCX0KLQotCS8vIHByaXZhdGUgSVByb2plY3QgZ2V0UmVsZXZhbnRQcm9qZWN0KFVSSSBhTW9kdWxlVVJJKSB7Ci0JLy8gYU1vZHVsZVVSSS5zZWdtZW50KCkKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9qZWN0Q29tcG9uZW50c0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Byb2plY3RDb21wb25lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY0NWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Byb2plY3RDb21wb25lbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdENvbXBvbmVudHNJbXBsLmphdmEsdiAxLjMgMjAwNi8wNC8yNyAwNDoxNzo0MCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvamVjdCBNb2R1bGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9qZWN0Q29tcG9uZW50c0ltcGwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvamVjdENvbXBvbmVudHNJbXBsI2dldENvbXBvbmVudHMgPGVtPkNvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlByb2plY3RDb21wb25lbnRzSW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdENvbXBvbmVudHNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQcm9qZWN0Q29tcG9uZW50cyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50cygpIDxlbT5Db21wb25lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb21wb25lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMS4wLjAiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5kZXhlZDsKLQotCXByaXZhdGUgZmluYWwgTWFwIG1vZHVsZXNJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RDb21wb25lbnRzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5MaXRlcmFscy5QUk9KRUNUX0NPTVBPTkVOVFM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldENvbXBvbmVudHMoKSB7Ci0JCWlmIChjb21wb25lbnRzID09IG51bGwpIHsKLQkJCWNvbXBvbmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV29ya2JlbmNoQ29tcG9uZW50LmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFMpOwotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENvbXBvbmVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBnZXRQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudHMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0UHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX0NPTVBPTkVOVFM6Ci0JCQkJZ2V0Q29tcG9uZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29tcG9uZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFNfX1BST0pFQ1RfTkFNRToKLQkJCQlzZXRQcm9qZWN0TmFtZShQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19DT01QT05FTlRTOgotCQkJCWdldENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fUFJPSkVDVF9OQU1FOgotCQkJCXJldHVybiBQUk9KRUNUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHByb2plY3ROYW1lICE9IG51bGwgOiAhUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhwcm9qZWN0TmFtZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST0pFQ1RfQ09NUE9ORU5UU19fQ09NUE9ORU5UUzoKLQkJCQlyZXR1cm4gY29tcG9uZW50cyAhPSBudWxsICYmICFjb21wb25lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPSkVDVF9DT01QT05FTlRTX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFdvcmtiZW5jaENvbXBvbmVudCBmaW5kV29ya2JlbmNoTW9kdWxlKFN0cmluZyBhRGVwbG95TmFtZSkgewotCQlpZiAoZ2V0Q29tcG9uZW50cygpLnNpemUoKSA9PSAxKQotCQkJcmV0dXJuICgoV29ya2JlbmNoQ29tcG9uZW50KWdldENvbXBvbmVudHMoKS5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMoYURlcGxveU5hbWUpID8gKFdvcmtiZW5jaENvbXBvbmVudClnZXRDb21wb25lbnRzKCkuZ2V0KDApIDogbnVsbDsKLQkJaWYgKCFpc0luZGV4ZWQoKSkgCi0JCQlpbmRleE1vZHVsZXMoKTsgCi0JCXJldHVybiAoV29ya2JlbmNoQ29tcG9uZW50KSBnZXRNb2R1bGVzSW5kZXgoKS5nZXQoYURlcGxveU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkKCkgewotCQlyZXR1cm4gaXNJbmRleGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleE1vZHVsZXMoKSB7Ci0JCWlmIChpc0luZGV4ZWQpCi0JCQlyZXR1cm47Ci0KLQkJc3luY2hyb25pemVkIChtb2R1bGVzSW5kZXgpIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGVBZGFwdGVycygpLCBNb2R1bGVJbmRleGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgCi0JCQkJZUFkYXB0ZXJzKCkuYWRkKChhZGFwdGVyID0gbmV3IE1vZHVsZUluZGV4aW5nQWRhcHRlcigpKSk7Ci0JCQkKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBudWxsOwotCQkJZm9yKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb21wb25lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCW1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJCW1vZHVsZXNJbmRleC5wdXQobW9kdWxlLmdldE5hbWUoKSwgbW9kdWxlKTsKLQkJCX0KLQkJfQotCQlpc0luZGV4ZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQkvKiBwYWNrYWdlICovIE1hcCBnZXRNb2R1bGVzSW5kZXgoKSB7Ci0JCXJldHVybiBtb2R1bGVzSW5kZXg7Ci0JfQotCi19IC8vIFByb2plY3RDb21wb25lbnRzSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlOGE5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb3BlcnR5SW1wbC5qYXZhLHYgMS4xIDIwMDUvMDQvMDQgMDc6MDQ6NTkgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUHJvcGVydHlJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YjNkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVmZXJlbmNlZENvbXBvbmVudEltcGwuamF2YSx2IDEuNCAyMDA3LzAyLzE0IDE2OjAwOjUyIGpzaG9sbCBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGVuZGVudCBNb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsI2dldEhhbmRsZSA8ZW0+SGFuZGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXRSdW50aW1lUGF0aCA8ZW0+UnVudGltZSBQYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXREZXBlbmRlbmN5VHlwZSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZWZlcmVuY2VkQ29tcG9uZW50SW1wbCNnZXREZXBlbmRlbnRPYmplY3QgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlZmVyZW5jZWRDb21wb25lbnRJbXBsI2dldEFyY2hpdmVOYW1lIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlZENvbXBvbmVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZSgpIDxlbT5IYW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgSEFORExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZSgpIDxlbT5IYW5kbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhbmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBoYW5kbGUgPSBIQU5ETEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBSVU5USU1FX1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UnVudGltZVBhdGgoKSA8ZW0+UnVudGltZSBQYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIHJ1bnRpbWVQYXRoID0gUlVOVElNRV9QQVRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlcGVuZGVuY3lUeXBlKCkgPGVtPkRlcGVuZGVuY3kgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVwZW5kZW5jeVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVwZW5kZW5jeVR5cGUgREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUID0gRGVwZW5kZW5jeVR5cGUuVVNFU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwZW5kZW5jeVR5cGUoKSA8ZW0+RGVwZW5kZW5jeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXBlbmRlbmN5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lUeXBlIGRlcGVuZGVuY3lUeXBlID0gREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwZW5kZW50T2JqZWN0KCkgPGVtPkRlcGVuZGVudCBPYmplY3Q8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlcGVuZGVudE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZGVwZW5kZW50T2JqZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcmNoaXZlTmFtZSgpIDxlbT5BcmNoaXZlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFyY2hpdmVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJjaGl2ZU5hbWUoKSA8ZW0+QXJjaGl2ZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmNoaXZlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlTmFtZSA9IEFSQ0hJVkVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWZlcmVuY2VkQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRIYW5kbGUoKSB7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFuZGxlKFVSSSBuZXdIYW5kbGUpIHsKLQkJVVJJIG9sZEhhbmRsZSA9IGhhbmRsZTsKLQkJaGFuZGxlID0gbmV3SGFuZGxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFLCBvbGRIYW5kbGUsIGhhbmRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVQYXRoKElQYXRoIG5ld1J1bnRpbWVQYXRoKSB7Ci0JCUlQYXRoIG9sZFJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGg7Ci0JCXJ1bnRpbWVQYXRoID0gbmV3UnVudGltZVBhdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEgsIG9sZFJ1bnRpbWVQYXRoLCBydW50aW1lUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5VHlwZSBnZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlIG5ld0RlcGVuZGVuY3lUeXBlKSB7Ci0JCURlcGVuZGVuY3lUeXBlIG9sZERlcGVuZGVuY3lUeXBlID0gZGVwZW5kZW5jeVR5cGU7Ci0JCWRlcGVuZGVuY3lUeXBlID0gbmV3RGVwZW5kZW5jeVR5cGUgPT0gbnVsbCA/IERFUEVOREVOQ1lfVFlQRV9FREVGQVVMVCA6IG5ld0RlcGVuZGVuY3lUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5DWV9UWVBFLCBvbGREZXBlbmRlbmN5VHlwZSwgZGVwZW5kZW5jeVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXREZXBlbmRlbnRPYmplY3QoKSB7Ci0JCWlmIChkZXBlbmRlbnRPYmplY3QgIT0gbnVsbCAmJiBkZXBlbmRlbnRPYmplY3QuZUlzUHJveHkoKSkgewotCQkJRU9iamVjdCBvbGREZXBlbmRlbnRPYmplY3QgPSBkZXBlbmRlbnRPYmplY3Q7Ci0JCQlkZXBlbmRlbnRPYmplY3QgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZGVwZW5kZW50T2JqZWN0KTsKLQkJCWlmIChkZXBlbmRlbnRPYmplY3QgIT0gb2xkRGVwZW5kZW50T2JqZWN0KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QsIG9sZERlcGVuZGVudE9iamVjdCwgZGVwZW5kZW50T2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlcGVuZGVudE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldERlcGVuZGVudE9iamVjdCgpIHsKLQkJcmV0dXJuIGRlcGVuZGVudE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRlbnRPYmplY3QoRU9iamVjdCBuZXdEZXBlbmRlbnRPYmplY3QpIHsKLQkJRU9iamVjdCBvbGREZXBlbmRlbnRPYmplY3QgPSBkZXBlbmRlbnRPYmplY3Q7Ci0JCWRlcGVuZGVudE9iamVjdCA9IG5ld0RlcGVuZGVudE9iamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1QsIG9sZERlcGVuZGVudE9iamVjdCwgZGVwZW5kZW50T2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZSgpIHsKLQkJcmV0dXJuIGFyY2hpdmVOYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVOYW1lKFN0cmluZyBuZXdBcmNoaXZlTmFtZSkgewotCQlTdHJpbmcgb2xkQXJjaGl2ZU5hbWUgPSBhcmNoaXZlTmFtZTsKLQkJYXJjaGl2ZU5hbWUgPSBuZXdBcmNoaXZlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRSwgb2xkQXJjaGl2ZU5hbWUsIGFyY2hpdmVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fSEFORExFOgotCQkJCXJldHVybiBnZXRIYW5kbGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSDoKLQkJCQlyZXR1cm4gZ2V0UnVudGltZVBhdGgoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGVwZW5kZW5jeVR5cGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1Q6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZXBlbmRlbnRPYmplY3QoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXREZXBlbmRlbnRPYmplY3QoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0FSQ0hJVkVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19IQU5ETEU6Ci0JCQkJc2V0SGFuZGxlKChVUkkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX1JVTlRJTUVfUEFUSDoKLQkJCQlzZXRSdW50aW1lUGF0aCgoSVBhdGgpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlzZXREZXBlbmRlbmN5VHlwZSgoRGVwZW5kZW5jeVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOVF9PQkpFQ1Q6Ci0JCQkJc2V0RGVwZW5kZW50T2JqZWN0KChFT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJc2V0QXJjaGl2ZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRToKLQkJCQlzZXRIYW5kbGUoSEFORExFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJc2V0UnVudGltZVBhdGgoUlVOVElNRV9QQVRIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTkNZX1RZUEU6Ci0JCQkJc2V0RGVwZW5kZW5jeVR5cGUoREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19ERVBFTkRFTlRfT0JKRUNUOgotCQkJCXNldERlcGVuZGVudE9iamVjdCgoRU9iamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJc2V0QXJjaGl2ZU5hbWUoQVJDSElWRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0hBTkRMRToKLQkJCQlyZXR1cm4gSEFORExFX0VERUZBVUxUID09IG51bGwgPyBoYW5kbGUgIT0gbnVsbCA6ICFIQU5ETEVfRURFRkFVTFQuZXF1YWxzKGhhbmRsZSk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19SVU5USU1FX1BBVEg6Ci0JCQkJcmV0dXJuIFJVTlRJTUVfUEFUSF9FREVGQVVMVCA9PSBudWxsID8gcnVudGltZVBhdGggIT0gbnVsbCA6ICFSVU5USU1FX1BBVEhfRURFRkFVTFQuZXF1YWxzKHJ1bnRpbWVQYXRoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuUkVGRVJFTkNFRF9DT01QT05FTlRfX0RFUEVOREVOQ1lfVFlQRToKLQkJCQlyZXR1cm4gZGVwZW5kZW5jeVR5cGUgIT0gREVQRU5ERU5DWV9UWVBFX0VERUZBVUxUOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5SRUZFUkVOQ0VEX0NPTVBPTkVOVF9fREVQRU5ERU5UX09CSkVDVDoKLQkJCQlyZXR1cm4gZGVwZW5kZW50T2JqZWN0ICE9IG51bGw7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UX19BUkNISVZFX05BTUU6Ci0JCQkJcmV0dXJuIEFSQ0hJVkVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gYXJjaGl2ZU5hbWUgIT0gbnVsbCA6ICFBUkNISVZFX05BTUVfRURFRkFVTFQuZXF1YWxzKGFyY2hpdmVOYW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaGFuZGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBydW50aW1lUGF0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocnVudGltZVBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlcGVuZGVuY3lUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXBlbmRlbmN5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXJjaGl2ZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFyY2hpdmVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlZENvbXBvbmVudEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1JlZmVyZW5jZWRDb21wb25lbnRYTUlSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNTdhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMKLQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIHsKLQotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gYWN0dWFsbHkgaW5zdGFudGlhdGUgYSBuZXcgUmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkb0NyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2I0YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuTWFwcGVkWE1JSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMKLQkJUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIFJlc291cmNlIHsKLQotCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50WE1JUmVzb3VyY2VJbXBsKCkgewotCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZENvbXBvbmVudFhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgTWFwcGVkWE1JSGVscGVyIGRvQ3JlYXRlWE1MSGVscGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBlZENvbXBvbmVudFhNSUhlbHBlcih0aGlzLCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWFiNDFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSVBhdGhQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVRyZWVOb2RlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfTk9ORSA9IDB4MDsKLQkvKiogCi0JICogVHlwZSBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMSkgd2hpY2ggaWRlbnRpZmllcyBjcmVhdGluZyBjaGlsZCBub2Rlcy4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURV9UUkVFTk9ERV9JRk5FQyA9IDB4MTsKLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDIpIHdoaWNoIGlkZW50aWZpZXMgYWx3YXlzIGNyZWF0aW5nIGEgdmlydHVhbCByZXNvdXJjZS4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFURV9SRVNPVVJDRV9BTFdBWVMgPSAweDI7Ci0KLQlwcml2YXRlIGZpbmFsIFNldCBtb2R1bGVSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IExpbmtlZEhhc2hTZXQoKSk7CQotCXByaXZhdGUgZmluYWwgTWFwIGNoaWxkcmVuID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW5rZWRIYXNoTWFwKCkpOwotCXByaXZhdGUgZmluYWwgTWFwIHRyYW5zaWVudENoaWxkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBMaW5rZWRIYXNoTWFwKCkpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudFJlc291cmNlW10gTk9fTU9EVUxFX1JFU09VUkNFUyA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVtde307Ci0JcHJpdmF0ZSBJUGF0aFByb3ZpZGVyIHBhdGhQcm92aWRlcjsKLS8vCXByaXZhdGUgUmVzb3VyY2VUcmVlTm9kZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcGF0aFNlZ21lbnQ7Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZShTdHJpbmcgYVBhdGhTZWdtZW50LCBSZXNvdXJjZVRyZWVOb2RlIHBhcmVudCwgSVBhdGhQcm92aWRlciBhUGF0aFByb3ZpZGVyKSB7Ci0JCXBhdGhTZWdtZW50ID0gYVBhdGhTZWdtZW50OwotCQlwYXRoUHJvdmlkZXIgPSBhUGF0aFByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIGFkZENoaWxkKFJlc291cmNlVHJlZU5vZGUgYUNoaWxkKSB7Ci0JCWNoaWxkcmVuLnB1dChhQ2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSwgYUNoaWxkKTsKLQkJcmV0dXJuIGFDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlTm9kZSBhZGRDaGlsZChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VUcmVlTm9kZSBuZXdDaGlsZCA9IGZpbmRDaGlsZChnZXRQYXRoUHJvdmlkZXIoKS5nZXRQYXRoKGFNb2R1bGVSZXNvdXJjZSksIENSRUFURV9UUkVFTk9ERV9JRk5FQyk7Ci0JCWlmKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCW5ld0NoaWxkLmFkZE1vZHVsZVJlc291cmNlKGFNb2R1bGVSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgcmVtb3ZlQ2hpbGQoUmVzb3VyY2VUcmVlTm9kZSBhQ2hpbGQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVRyZWVOb2RlKSBjaGlsZHJlbi5yZW1vdmUoYUNoaWxkLmdldFBhdGhTZWdtZW50KCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZVRyZWVOb2RlIHJlbW92ZUNoaWxkKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgeyAKLQkJUmVzb3VyY2VUcmVlTm9kZSBjb250YWluaW5nQ2hpbGQgPSBmaW5kQ2hpbGQoZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0UGF0aChhTW9kdWxlUmVzb3VyY2UpLCBDUkVBVEVfTk9ORSk7Ci0JCWlmKGNvbnRhaW5pbmdDaGlsZCAhPSBudWxsKSB7Ci0JCQljb250YWluaW5nQ2hpbGQucmVtb3ZlUmVzb3VyY2UoYU1vZHVsZVJlc291cmNlKTsKLQkJCWlmKGNvbnRhaW5pbmdDaGlsZC5oYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCQlyZXR1cm4gY29udGFpbmluZ0NoaWxkOwotCQkJcmV0dXJuIHJlbW92ZUNoaWxkKGNvbnRhaW5pbmdDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgcmVtb3ZlQ2hpbGQoSVBhdGggdGFyZ2V0UGF0aCwgQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7IAotCQlSZXNvdXJjZVRyZWVOb2RlIGNvbnRhaW5pbmdDaGlsZCA9IGZpbmRDaGlsZCh0YXJnZXRQYXRoLCBDUkVBVEVfTk9ORSk7Ci0JCWlmKGNvbnRhaW5pbmdDaGlsZCAhPSBudWxsKSB7Ci0JCQljb250YWluaW5nQ2hpbGQucmVtb3ZlUmVzb3VyY2UoYU1vZHVsZVJlc291cmNlKTsKLQkJCWlmKGNvbnRhaW5pbmdDaGlsZC5oYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCQlyZXR1cm4gY29udGFpbmluZ0NoaWxkOwotCQkJcmV0dXJuIHJlbW92ZUNoaWxkKGNvbnRhaW5pbmdDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKENvbXBvbmVudFJlc291cmNlIGFSZXNvdXJjZSkgewotCQltb2R1bGVSZXNvdXJjZXMucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKElQYXRoIGFQYXRoKSB7Ci0JCXJldHVybiBmaW5kQ2hpbGQoYVBhdGgsIENSRUFURV9UUkVFTk9ERV9JRk5FQyk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKElQYXRoIGFQYXRoLCBpbnQgY3JlYXRpb25GbGFncykgewotCQlpZihhUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGQgPSB0aGlzOwotCQlpZiAoYVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQljaGlsZCA9IGZpbmRDaGlsZChhUGF0aC5zZWdtZW50KDApLCBjcmVhdGlvbkZsYWdzKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGFQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQkJcmV0dXJuIGNoaWxkOwotCQkJY2hpbGQgPSBjaGlsZC5maW5kQ2hpbGQoYVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSwgY3JlYXRpb25GbGFncyk7Ci0KLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKFN0cmluZyBhUGF0aFNlZ21lbnQpIHsKLQkJaWYgKGFQYXRoU2VnbWVudCA9PSBudWxsIHx8IGFQYXRoU2VnbWVudC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBmaW5kQ2hpbGQoYVBhdGhTZWdtZW50LCBDUkVBVEVfTk9ORSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlVHJlZU5vZGUgZmluZENoaWxkKFN0cmluZyBhUGF0aFNlZ21lbnQsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0JCWJvb2xlYW4gdG9DcmVhdGVDaGlsZElmTmVjZXNzYXJ5ID0gKGNyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfVFJFRU5PREVfSUZORUMpID09IENSRUFURV9UUkVFTk9ERV9JRk5FQzsKLQkJUmVzb3VyY2VUcmVlTm9kZSBjaGlsZE5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4uZ2V0KGFQYXRoU2VnbWVudCk7Ci0JCWlmIChjaGlsZE5vZGUgPT0gbnVsbCAmJiB0b0NyZWF0ZUNoaWxkSWZOZWNlc3NhcnkpCi0JCQljaGlsZE5vZGUgPSBhZGRDaGlsZChhUGF0aFNlZ21lbnQpOwotCQlyZXR1cm4gY2hpbGROb2RlOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRNb2R1bGVSZXNvdXJjZXMoSVBhdGggYVBhdGgsIGludCBjcmVhdGlvbkZsYWdzKSB7Ci0KLQkJU2V0IGZvdW5kTW9kdWxlUmVzb3VyY2VzID0gZmluZE1vZHVsZVJlc291cmNlc1NldChhUGF0aCwgYVBhdGgsIGNyZWF0aW9uRmxhZ3MpOwotCQlpZiAoZm91bmRNb2R1bGVSZXNvdXJjZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gTk9fTU9EVUxFX1JFU09VUkNFUzsKLQkJcmV0dXJuIChDb21wb25lbnRSZXNvdXJjZVtdKSBmb3VuZE1vZHVsZVJlc291cmNlcy50b0FycmF5KG5ldyBDb21wb25lbnRSZXNvdXJjZVtmb3VuZE1vZHVsZVJlc291cmNlcy5zaXplKCldKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKElQYXRoIGFQYXRoLCBpbnQgY3JlYXRpb25GbGFncykgewotCi0JCVNldCBmb3VuZE1vZHVsZVJlc291cmNlcyA9IGZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoYVBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKTsKLQkJaWYgKGZvdW5kTW9kdWxlUmVzb3VyY2VzLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodHJ1ZSkgewotCQkJCVJlc291cmNlVHJlZU5vZGUgY2hpbGQgPSBmaW5kQ2hpbGQoYVBhdGguc2VnbWVudCgwKSwgY3JlYXRpb25GbGFncyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vZHVsZVJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlc291cmNlcy5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGdldE1vZHVsZVJlc291cmNlcygpIHsKLQkJcmV0dXJuIChDb21wb25lbnRSZXNvdXJjZVtdKSBtb2R1bGVSZXNvdXJjZXMudG9BcnJheShuZXcgQ29tcG9uZW50UmVzb3VyY2VbbW9kdWxlUmVzb3VyY2VzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgU2V0IGZpbmRNb2R1bGVSZXNvdXJjZXNTZXQoSVBhdGggYUZ1bGxQYXRoLCBJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQotCQlpZiAoYVBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJU2V0IHJlc291cmNlcyA9IGFnZ3JlZ2F0ZVJlc291cmNlcyhuZXcgTGlua2VkSGFzaFNldCgpKTsKLQkJCXJldHVybiByZXNvdXJjZXM7Ci0JCX0KLQkJUmVzb3VyY2VUcmVlTm9kZSBjaGlsZCA9IGZpbmRDaGlsZChhUGF0aC5zZWdtZW50KDApLCBjcmVhdGlvbkZsYWdzKTsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmluZE1hdGNoaW5nVmlydHVhbFBhdGhzU2V0KGFGdWxsUGF0aCwgYVBhdGgsIGNyZWF0aW9uRmxhZ3MpOwotCQlTZXQgZm91bmRSZXNvdXJjZXMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQlmb3VuZFJlc291cmNlcy5hZGRBbGwoY2hpbGQuZmluZE1vZHVsZVJlc291cmNlc1NldChhRnVsbFBhdGgsIGFQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSksIGNyZWF0aW9uRmxhZ3MpKTsKLQkJZm91bmRSZXNvdXJjZXMuYWRkQWxsKGZpbmRNYXRjaGluZ1ZpcnR1YWxQYXRoc1NldChhRnVsbFBhdGgsIGFQYXRoLCBjcmVhdGlvbkZsYWdzKSk7Ci0JCXJldHVybiBmb3VuZFJlc291cmNlczsKLQl9Ci0KLQlwcml2YXRlIFNldCBmaW5kTWF0Y2hpbmdWaXJ0dWFsUGF0aHNTZXQoSVBhdGggYUZ1bGxQYXRoLCBJUGF0aCBhUGF0aCwgaW50IGNyZWF0aW9uRmxhZ3MpIHsKLQkJYm9vbGVhbiB0b0NyZWF0ZVJlc291cmNlQWx3YXlzID0gKGNyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTKSA9PSBDUkVBVEVfUkVTT1VSQ0VfQUxXQVlTOwotCQlpZiAoaGFzTW9kdWxlUmVzb3VyY2VzKCkpIHsKLQkJCUNvbXBvbmVudFJlc291cmNlIG1vZHVsZVJlc291cmNlID0gbnVsbDsKLQkJCUlSZXNvdXJjZSBlY2xpcHNlUmVzb3VyY2UgPSBudWxsOwotCQkJSUNvbnRhaW5lciBlY2xpcHNlQ29udGFpbmVyID0gbnVsbDsKLQkJCVNldCByZXN1bHRTZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciByZXNvdXJjZUl0ZXIgPSBtb2R1bGVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgcmVzb3VyY2VJdGVyLmhhc05leHQoKTspIHsKLQkJCQltb2R1bGVSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVzb3VyY2VJdGVyLm5leHQoKTsKLQkJCQlpZihtb2R1bGVSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpICE9IG51bGwgJiYgbW9kdWxlUmVzb3VyY2UuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQllY2xpcHNlUmVzb3VyY2UgPSBTdHJ1Y3R1cmVFZGl0LmdldEVjbGlwc2VSZXNvdXJjZShtb2R1bGVSZXNvdXJjZSk7Ci0JCQkJCQotCQkJCQlpZiAoZWNsaXBzZVJlc291cmNlICE9IG51bGwgJiYgKGVjbGlwc2VSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiB8fCBlY2xpcHNlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSkgewotCQkJCQkJZWNsaXBzZUNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlY2xpcHNlUmVzb3VyY2U7Ci0JCQkJIAotCQkJCQkJSVBhdGggcnVudGltZVVSSSA9IG1vZHVsZVJlc291cmNlLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKTsKLQkJCQkJCUlQYXRoIHNyY1BhdGggPSBlY2xpcHNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hcHBlbmQoYVBhdGgpOwotCQkJCQkJCi0JCQkJCQkvLyBjaGVjayBmb3IgZXhpc3Rpbmcgc3VicGF0aCBpbiB0cmVlCi0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGZpbmRFeGlzdGluZ0NvbXBvbmVudFJlc291cmNlKG1vZHVsZVJlc291cmNlLmdldENvbXBvbmVudCgpLCBydW50aW1lVVJJLCBzcmNQYXRoKTsKLQkJCQkJCQotCQkJCQkJLy8gYWRkIG5ldyByZXNvdXJjZSBpZiBudWxsCi0JCQkJCQlpZihuZXdSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gZmxlc2ggb3V0IHRoZSB0cmVlCi0JCQkJCQkJSVJlc291cmNlIGVjbGlwc2VSZXMgPSBlY2xpcHNlQ29udGFpbmVyLmZpbmRNZW1iZXIoYVBhdGgpOwotCQkJCQkJCWlmICgodG9DcmVhdGVSZXNvdXJjZUFsd2F5cykgfHwgKGVjbGlwc2VSZXMgIT0gbnVsbCkpIHsKLQkJCQkJCQkJbmV3UmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpdHJhbnNpZW50Q2hpbGRSZXNvdXJjZXMuZ2V0KHNyY1BhdGgpOwotCQkJCQkJCQlpZiAobmV3UmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQkJCQluZXdSZXNvdXJjZSA9IENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRjb3JlRmFjdG9yeSgpLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7Ci0JCQkJCQkJCS8vIE5vdCBzZXR0aW5nIHRoZSBwYXJlbnQgb24gdGhpcyB0cmFuc2llbnQgY2hpbGQgcmVzb3VyY2UKLQkJCQkJCQkJLy8gbmV3UmVzb3VyY2Uuc2V0Q29tcG9uZW50KG1vZHVsZVJlc291cmNlLmdldENvbXBvbmVudCgpKTsKLQkJCQkJCQkJbmV3UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgocnVudGltZVVSSSk7Ci0JCQkJCQkJCW5ld1Jlc291cmNlLnNldFNvdXJjZVBhdGgoc3JjUGF0aCk7Ci0JCQkJCQkJCWlmIChlY2xpcHNlUmVzICE9IG51bGwpCi0JCQkJCQkJCQluZXdSZXNvdXJjZS5zZXRPd25pbmdQcm9qZWN0KGVjbGlwc2VSZXMuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQkJdHJhbnNpZW50Q2hpbGRSZXNvdXJjZXMucHV0KHNyY1BhdGgsbmV3UmVzb3VyY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJlc3VsdFNldC5hZGQobmV3UmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0U2V0LnNpemUoKSA+IDAgPyByZXN1bHRTZXQgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudFJlc291cmNlIGZpbmRFeGlzdGluZ0NvbXBvbmVudFJlc291cmNlKFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQsIElQYXRoIHJ1bnRpbWVVUkksIElQYXRoIHNyY1BhdGgpIHsgCi0JCUxpc3QgcmVzb3VyY2VzID0gY29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSBlbGVtZW50ID0gKENvbXBvbmVudFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJ1bnRpbWVVUkkuZXF1YWxzKGVsZW1lbnQuZ2V0UnVudGltZVBhdGgoKSkgJiYgc3JjUGF0aC5lcXVhbHMoZWxlbWVudC5nZXRTb3VyY2VQYXRoKCkpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQkJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgYWdncmVnYXRlUmVzb3VyY2VzKFNldCBhbkFnZ3JlZ2F0aW9uU2V0KSB7Ci0JCWlmIChoYXNNb2R1bGVSZXNvdXJjZXMoKSkKLQkJCWFuQWdncmVnYXRpb25TZXQuYWRkQWxsKG1vZHVsZVJlc291cmNlcyk7Ci0JCVJlc291cmNlVHJlZU5vZGUgY2hpbGROb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbkl0ZXJhdG9yID0gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW5JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQljaGlsZE5vZGUgPSAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7Ci0JCQljaGlsZE5vZGUuYWdncmVnYXRlUmVzb3VyY2VzKGFuQWdncmVnYXRpb25TZXQpOwotCQl9Ci0JCXJldHVybiBhbkFnZ3JlZ2F0aW9uU2V0OwotCX0KLQotCXB1YmxpYyBpbnQgY2hpbGRyZW5Db3VudCgpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhTZWdtZW50KCkgewotCQlyZXR1cm4gcGF0aFNlZ21lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlVHJlZU5vZGUgYWRkQ2hpbGQoU3RyaW5nIGFQYXRoU2VnbWVudCkgewotCQlSZXNvdXJjZVRyZWVOb2RlIG5ld0NoaWxkID0gbnVsbDsKLQkJaWYgKChuZXdDaGlsZCA9IChSZXNvdXJjZVRyZWVOb2RlKSBjaGlsZHJlbi5nZXQoYVBhdGhTZWdtZW50KSkgPT0gbnVsbCkgewotCQkJbmV3Q2hpbGQgPSBuZXcgUmVzb3VyY2VUcmVlTm9kZShhUGF0aFNlZ21lbnQsIHRoaXMsIHBhdGhQcm92aWRlcik7Ci0JCQljaGlsZHJlbi5wdXQobmV3Q2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSwgbmV3Q2hpbGQpOwotCQl9Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VUcmVlTm9kZSByZW1vdmVDaGlsZChTdHJpbmcgYVBhdGhTZWdtZW50KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VUcmVlTm9kZSkgY2hpbGRyZW4ucmVtb3ZlKGFQYXRoU2VnbWVudCk7Ci0JfQotCi0JLyogcGFja2FnZSAqL3ZvaWQgYWRkTW9kdWxlUmVzb3VyY2UoQ29tcG9uZW50UmVzb3VyY2UgYU1vZHVsZVJlc291cmNlKSB7Ci0JCW1vZHVsZVJlc291cmNlcy5hZGQoYU1vZHVsZVJlc291cmNlKTsKLQl9Ci0KLQkvKiBwYWNrYWdlICovSVBhdGhQcm92aWRlciBnZXRQYXRoUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwYXRoUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBNYXAgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVSb290LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVRyZWVSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjkzY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSVBhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUcmVlUm9vdCBleHRlbmRzIFJlc291cmNlVHJlZU5vZGUgewotCQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VUcmVlUmVzb3VyY2VMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkKLQkJCWlmKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKSkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQlzd2l0Y2gobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlyZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmKHJlc291cmNlICE9IG51bGwpCi0JCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwkJCQkJCi0JCQkJCWJyZWFrOyAKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJTGlzdCBuZXdWYWx1ZXMgPSAoTGlzdCkgbXNnLmdldE5ld1ZhbHVlKCk7CQkJCQkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdWYWx1ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBuZXdWYWx1ZXMuZ2V0KGkpOwotCQkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKGdldFJlc291cmNlUGF0aExpc3RlbmVyQWRhcHRlcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwotCQkJCQkJcmVtb3ZlQ2hpbGQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlMaXN0IHJlbW92ZWRWYWx1ZXMgPSAoTGlzdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChyZW1vdmVkVmFsdWVzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCXJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSByZW1vdmVkVmFsdWVzLmdldChpKTsKLQkJCQkJCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoZ2V0UmVzb3VyY2VQYXRoTGlzdGVuZXJBZGFwdGVyKCkpOwotCQkJCQkJCXJlbW92ZUNoaWxkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVBhdGhMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCWlmKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlKSB7CQkJCQotLy8JCQkJaWYoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotLy8JCQkJCWlmKGdldFBhdGhQcm92aWRlcigpLmdldFBhdGgoKENvbXBvbmVudFJlc291cmNlKWdldFRhcmdldCgpKSAhPSBudWxsKQotLy8JCQkJCQlyZW1vdmVDaGlsZCgoQ29tcG9uZW50UmVzb3VyY2UpZ2V0VGFyZ2V0KCkpOwotLy8JCQkJfQotCQkJCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBuZXdUYXJnZXQ7Ci0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlpZihnZXRQYXRoUHJvdmlkZXIoKS5nZXRQYXRoKHJlc291cmNlKSAhPSBudWxsKQotCQkJCQkJYWRkQ2hpbGQocmVzb3VyY2UpOwkJCQkJCi0JCQkJfQkJCi0JCQl9Ci0JCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkKLQkJCWlmKG1zZy5nZXRGZWF0dXJlKCkgPT0gZ2V0UGF0aFByb3ZpZGVyKCkuZ2V0RmVhdHVyZSgpKSB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpIG1zZy5nZXROb3RpZmllcigpOwotCQkJCXN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQotCQkJCQkvLyByZW1vdmUgdGhlIG9sZCB2YWx1ZSAKLQkJCQkJSVBhdGggb2xkUGF0aCA9IChJUGF0aCltc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYob2xkUGF0aCE9bnVsbCkKLQkJCQkJCXJlbW92ZUNoaWxkKG9sZFBhdGgsIHJlc291cmNlKTsKLQkJCQkJCi0JCQkJCUlQYXRoIG5ld1BhdGggPSAoSVBhdGgpbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmKG5ld1BhdGghPW51bGwpCi0JCQkJCQlhZGRDaGlsZChyZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPIFRoZSBzb3VyY2UgdHJlZSBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgbW9kdWxlcyByb290LCBub3QgZWFjaCBtb2R1bGUuCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVRyZWVSb290IGdldFNvdXJjZVJlc291cmNlVHJlZVJvb3QoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIgcmVzb3VyY2VUcmVlQWRhcHRlciA9IChSZXNvdXJjZVRyZWVSb290QWRhcHRlcikgRXh0ZW5kZWRFY29yZVV0aWwuZ2V0QWRhcHRlcihhTW9kdWxlLCBhTW9kdWxlLmVBZGFwdGVycygpLCBSZXNvdXJjZVRyZWVSb290QWRhcHRlci5TT1VSQ0VfQURBUFRFUl9UWVBFKTsKLQkJaWYgKHJlc291cmNlVHJlZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiByZXNvdXJjZVRyZWVBZGFwdGVyLmdldFJlc291cmNlVHJlZVJvb3QoKTsKLQkJcmVzb3VyY2VUcmVlQWRhcHRlciA9IG5ldyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihSZXNvdXJjZVRyZWVSb290QWRhcHRlci5TT1VSQ0VfVFJFRSk7Ci0JCWFNb2R1bGUuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlVHJlZUFkYXB0ZXIpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVRyZWVSb290IGdldERlcGxveVJlc291cmNlVHJlZVJvb3QoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIgcmVzb3VyY2VUcmVlQWRhcHRlciA9IChSZXNvdXJjZVRyZWVSb290QWRhcHRlcikgRXh0ZW5kZWRFY29yZVV0aWwuZ2V0QWRhcHRlcihhTW9kdWxlLCBhTW9kdWxlLmVBZGFwdGVycygpLCBSZXNvdXJjZVRyZWVSb290QWRhcHRlci5ERVBMT1lfQURBUFRFUl9UWVBFKTsKLQkJaWYgKHJlc291cmNlVHJlZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiByZXNvdXJjZVRyZWVBZGFwdGVyLmdldFJlc291cmNlVHJlZVJvb3QoKTsKLQkJcmVzb3VyY2VUcmVlQWRhcHRlciA9IG5ldyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihSZXNvdXJjZVRyZWVSb290QWRhcHRlci5ERVBMT1lfVFJFRSk7Ci0JCWFNb2R1bGUuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlVHJlZUFkYXB0ZXIpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlQWRhcHRlci5nZXRSZXNvdXJjZVRyZWVSb290KCk7Ci0JfQotCQotCXByaXZhdGUgZmluYWwgV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZTsKLQlwcml2YXRlIFJlc291cmNlVHJlZVJlc291cmNlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBSZXNvdXJjZVBhdGhMaXN0ZW5lciBwYXRoTGlzdGVuZXI7Ci0KLQlwdWJsaWMgUmVzb3VyY2VUcmVlUm9vdChXb3JrYmVuY2hDb21wb25lbnQgYU1vZHVsZSwgSVBhdGhQcm92aWRlciBhUGF0aFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCIvIiwgbnVsbCwgYVBhdGhQcm92aWRlcik7IC8vJE5PTi1OTFMtMSQKLQkJbW9kdWxlID0gYU1vZHVsZTsgCQotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCW1vZHVsZS5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VUcmVlTGlzdGVuZXJBZGFwdGVyKCkpOwotCQlMaXN0IG1vZHVsZVJlc291cmNlcyA9IG1vZHVsZS5nZXRSZXNvdXJjZXMoKTsKLQkJQ29tcG9uZW50UmVzb3VyY2UgbW9kdWxlUmVzb3VyY2UgPSBudWxsOwkJIAotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW1vZHVsZVJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlKSBtb2R1bGVSZXNvdXJjZXMuZ2V0KGkpOwotCQkJYWRkQ2hpbGQobW9kdWxlUmVzb3VyY2UpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZVRyZWVSZXNvdXJjZUxpc3RlbmVyIGdldFJlc291cmNlVHJlZUxpc3RlbmVyQWRhcHRlcigpIHsKLQkJaWYobGlzdGVuZXIgPT0gbnVsbCkKLQkJCWxpc3RlbmVyID0gbmV3IFJlc291cmNlVHJlZVJlc291cmNlTGlzdGVuZXIoKTsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZVBhdGhMaXN0ZW5lciBnZXRSZXNvdXJjZVBhdGhMaXN0ZW5lckFkYXB0ZXIoKSB7Ci0JCWlmKHBhdGhMaXN0ZW5lciA9PSBudWxsKQotCQkJcGF0aExpc3RlbmVyID0gbmV3IFJlc291cmNlUGF0aExpc3RlbmVyKCk7Ci0JCXJldHVybiBwYXRoTGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZE1vZHVsZVJlc291cmNlcyhVUkkgYVVSSSkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYVVSSS50b1N0cmluZygpKTsKLQkJdHJ5IHsKLQkJCWlmIChNb2R1bGVVUklVdGlsLmVuc3VyZVZhbGlkRnVsbHlRdWFsaWZpZWRQbGF0Zm9ybVVSSShhVVJJLCBmYWxzZSkpCi0JCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsgCi0JCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gdXVyaWUpIHsKLQotCQl9Ci0JCXJldHVybiBmaW5kTW9kdWxlUmVzb3VyY2VzKHBhdGgsIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlVHJlZVJvb3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzRkMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VUcmVlUm9vdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkRlcGxveWVkUGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklQYXRoUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuU291cmNlUGF0aFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVHJlZVJvb3RBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTT1VSQ0VfQURBUFRFUl9UWVBFID0gbmV3IE9iamVjdCgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERFUExPWV9BREFQVEVSX1RZUEUgPSBuZXcgT2JqZWN0KCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX1RSRUUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFUExPWV9UUkVFID0gMTsKLQkKLQlwcml2YXRlIFJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdDsKLQlwcml2YXRlIGludCB0eXBlOwotCQotCXB1YmxpYyBSZXNvdXJjZVRyZWVSb290QWRhcHRlcihpbnQgYVR5cGUpIHsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IGFuQWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIChTT1VSQ0VfQURBUFRFUl9UWVBFID09IGFuQWRhcHRlclR5cGUgJiYgdHlwZSA9PSBTT1VSQ0VfVFJFRSkgfHwgKERFUExPWV9BREFQVEVSX1RZUEUgPT0gYW5BZGFwdGVyVHlwZSAmJiB0eXBlID09IERFUExPWV9UUkVFKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlVHJlZVJvb3QgZ2V0UmVzb3VyY2VUcmVlUm9vdCgpIHsJCQotCQlpZihyZXNvdXJjZVRyZWVSb290ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdDsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCWlmKHJlc291cmNlVHJlZVJvb3QgPT0gbnVsbCkgewotCQkJCUlQYXRoUHJvdmlkZXIgcGF0aFByb3ZpZGVyPSAodHlwZSA9PSBERVBMT1lfVFJFRSkgPyBEZXBsb3llZFBhdGhQcm92aWRlci5JTlNUQU5DRSA6IFNvdXJjZVBhdGhQcm92aWRlci5JTlNUQU5DRTsKLQkJCQlyZXNvdXJjZVRyZWVSb290ID0gbmV3IFJlc291cmNlVHJlZVJvb3QoKFdvcmtiZW5jaENvbXBvbmVudClnZXRUYXJnZXQoKSwgcGF0aFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUcmVlUm9vdChSZXNvdXJjZVRyZWVSb290IHIpewotCQkKLQkJcmVzb3VyY2VUcmVlUm9vdCA9IHI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBFbnRpdHlSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQRW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmZTBiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBFbnRpdHlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLy8gVE9ETzogV2UgbmVlZCB0byBwb3J0IHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGV4Y2VwdGlvbnMuCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUEVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCi0JLyoqCi0JICogQWxsIHRoZSBkdGRzIHRoYXQgdGhpcyByZXNvbHZlciBrbm93cyBhYm91dDsgaW1wb3J0IHN0cmF0ZWdpZXMgcmVnaXN0ZXIgdGhlc2UgYXQgc3RhcnR1cAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHN1cHBvcnRlZER0RHM7Ci0JCi0JLy8gc3RhdGljIHsKLQkvLyByZWdpc3RlckR0RCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIiwgInhtbC54c2QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gcmVnaXN0ZXJEdEQoIlhNTFNjaGVtYS5kdGQiLCAiWE1MU2NoZW1hLmR0ZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyByZWdpc3RlckR0RCgiZGF0YXR5cGVzLmR0ZCIsICJkYXRhdHlwZXMuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vIH0KLQkKLQlwdWJsaWMgc3RhdGljIFdUUEVudGl0eVJlc29sdmVyIElOU1RBTkNFID0gbmV3IFdUUEVudGl0eVJlc29sdmVyKCk7Ci0KLQkvKioKLQkgKiBFamJYbWxFbnRpdHlSZXNvbHZlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBFbnRpdHlSZXNvbHZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRTdXBwb3J0ZWREdERzKCkgewotCQlpZiAoc3VwcG9ydGVkRHREcyA9PSBudWxsKQotCQkJc3VwcG9ydGVkRHREcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBzdXBwb3J0ZWREdERzOwotCX0KLQotCS8qKgotCSAqIE1hcHMgdGhlIHN5c3RlbSBpZCBmb3IgdGhlIGR0ZCB0byBhIGxvY2FsIGlkIHRvIGJlIHJldHJpZXZlZCBsb2FkZWQgZnJvbSB0aGUgY2xhc3MgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckR0RChTdHJpbmcgc3lzdGVtSUQsIFN0cmluZyBsb2NhbElEKSB7Ci0JCS8vIFRPRE8gUmVtb3ZpbmcgUmVnaXN0cmF0aW9uIG1lY2hhbmlzbSB1bnRpbCBmaW5hbCBsb2NhdGlvbiBpcyBmb3VuZAotCQkvKgotCQkgKiBnZXRTdXBwb3J0ZWREdERzKCkucHV0KHN5c3RlbUlELCBsb2NhbElEKTsgZ2V0U3VwcG9ydGVkRHREcygpLnB1dChnZXRTaG9ydE5hbWUoc3lzdGVtSUQpLAotCQkgKiBsb2NhbElEKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogZm9yIGEgc3lzdGVtIGlkIHdpdGggYSBVUkwgdGhhdCBiZWdpbnMgd2l0aCAiaHR0cDovL2phdmEuc3VuLmNvbS8iLCBjaGVjayB0byBzZWUgaWYgdGhhdCBpcyBhCi0JICogcmVjb2duaXplZCBkdGQ7IGlmIHNvLCBsb2FkIHRoZSBkdGQgZnJvbSB0aGUgY2xhc3MgcGF0aCB1c2luZyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyZWQKLQkgKiBkdGQuCi0JICogCi0JICogQHJldHVybiBhbiBJbnB1dCBzb3VyY2Ugb24gYSBsb2NhbGx5IHJlc29sdmVkIGR0ZCwgb3IgbnVsbCBvZiB0aGUgc3lzdGVtaWQgZG9lcyBub3Qgc3RhcnQKLQkgKiAgICAgICAgIHdpdGggImh0dHA6Ly9qYXZhLnN1bi5jb20vIgotCSAqIAotCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgd2l0aCBhIG5lc3RlZCBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIGR0ZCBpcyBub3QgcmVjb2duaXplZAotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIHJlc29sdmVkIGR0ZCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqLwotCXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxvY2FsUmVzb3VyY2VOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0phdmFTeXRlbUlkID0gZmFsc2U7Ci0JCWlmIChzaG91bGRCZVJlZ2lzdGVyZWQoc3lzdGVtSWQpKSB7Ci0JCQlsb2NhbFJlc291cmNlTmFtZSA9IChTdHJpbmcpIGdldFN1cHBvcnRlZER0RHMoKS5nZXQoc3lzdGVtSWQpOwotCQkJaXNKYXZhU3l0ZW1JZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc2hvcnROYW1lID0gZ2V0U2hvcnROYW1lKHN5c3RlbUlkKTsKLQkJCWxvY2FsUmVzb3VyY2VOYW1lID0gKFN0cmluZykgZ2V0U3VwcG9ydGVkRHREcygpLmdldChzaG9ydE5hbWUpOwotCQkJaWYgKGxvY2FsUmVzb3VyY2VOYW1lICE9IG51bGwpCi0JCQkJc3lzdGVtSWQgPSBsb2NhbFJlc291cmNlTmFtZTsKLQkJfQotCi0JCWlmIChsb2NhbFJlc291cmNlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNKYXZhU3l0ZW1JZCkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gIlR5cGUgaXMgdW5yZWNvZ25pemVkIG9yIG5vdCB5ZXQgc3VwcG9ydGVkOiBQVUJMSUNfSUQ9IHswfTtTWVNURU1fSUQ9ezF9IjsKLQkJCQl0aHJvdyBuZXcgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0JCQl1cmwgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShsb2NhbFJlc291cmNlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UobG9jYWxSZXNvdXJjZU5hbWUpOwotCQl9Ci0KLQotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBwYXJzZSB4bWwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgcmVzb3VyY2UgXCJ7MH1cIiBjb3VsZCBub3QgYmUgZm91bmQgaW4gY2xhc3NwYXRoIjsKLQkJCXRocm93IG5ldyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCi0JCUlucHV0U291cmNlIHJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCS8vIGZvcmNlIHRoZSBlbmNvZGluZyB0byBiZSBVVEY4Ci0JCXJlc3VsdC5zZXRFbmNvZGluZygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQmVSZWdpc3RlcmVkKFN0cmluZyBzeXN0ZW1JZCkgewotCQkvLyBUT0RPIFJlbW92ZWQgUmVzb2x2ZXIgZnVuY3Rpb24gdW50aWwgZmlsZSBsb2NhdGlvbiBpcyBrbm93bi4uLgotCQlyZXR1cm4gZmFsc2U7Ci0JCS8qCi0JCSAqIHJldHVybiBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuSkFWQV9TVU5fQ09NX1VSTCkgfHwKLQkJICogc3lzdGVtSWQuc3RhcnRzV2l0aChKMkVFQ29uc3RhbnRzLldXV19XM19PUkdfVVJMKSB8fAotCQkgKiBzeXN0ZW1JZC5zdGFydHNXaXRoKEoyRUVDb25zdGFudHMuV1dXX0lCTV9DT01fVVJMKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgdXJpLCBvciB0aGUgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShTdHJpbmcgdXJpKSB7Ci0JCVN0cmluZyB0ZW1wVVJJID0gdXJpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJd2hpbGUgKHRlbXBVUkkuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJdGVtcFVSSSA9IHRlbXBVUkkuc3Vic3RyaW5nKDAsIHRlbXBVUkkubGVuZ3RoKCkgLSAxKTsKLQkJaW50IGxhc3RJbmRleCA9IHRlbXBVUkkubGFzdEluZGV4T2YoJy8nKTsKLQkJaWYgKGxhc3RJbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmk7Ci0JCXJldHVybiB1cmkuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEsIHRlbXBVUkkubGVuZ3RoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI1NTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUE1vZHVsZXNJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkVuY29kZXJEZWNvZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QYXNzd29yZEVuY29kZXJEZWNvZGVyOwotCi0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV1RQTW9kdWxlc0luaXQgewotIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQlpbml0KHRydWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHRvUHJlcmVnaXN0ZXJQYWNrYWdlcykgewotCQlpZiAoIWlzSW5pdGlhbGl6ZWQpIHsKLQkJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKCk7Ci0JCQlET01VdGlsaXRpZXMuc2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKFdUUEVudGl0eVJlc29sdmVyLklOU1RBTkNFKTsgCi0JCQlpbml0UmVzb3VyY2VGYWN0b3JpZXMoKTsKLQkJCQotCQkJLy9UT0RPOiBSZW1vdmUgdGhpcyBsaW5lIGFmdGVyIFNFRCBBZGFwdGVyIGlzIHJlc3RvcmVkLgotCQkJRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJfQotCQlpZih0b1ByZXJlZ2lzdGVyUGFja2FnZXMpIAotCQkJcHJlcmVnaXN0ZXJQYWNrYWdlcygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRSZXNvdXJjZUZhY3RvcmllcygpIHsKLQkJV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwkKLQl9Ci0KLQkvKiogCi0JICogSWYgdGhlIGN1cnJlbnRseSBkZWZhdWx0ZWQgZW5jb2RlciBpcyB0aGUgaW5pdGlhbCBwYXNzIHRocnUgZW5jb2RlciwKLQkgKiB0aGVuIHJlZ2lzdGVyIGEgUGFzc3dvcmQgZW5jb2RlciBmb3Igc2VjdXJpdHk7IG90aGVyd2lzZSBpZiBhIG1vcmUgc29waGlzdGljYXRlZAotCSAqIGVuY29kZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGVuIGRvIG5vdGhpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7Ci0JCUVuY29kZXJEZWNvZGVyUmVnaXN0cnkgcmVnID0gRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZy5nZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSA9PSBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5LklOSVRJQUxfREVGQVVMVF9FTkNPREVSKSB7Ci0JCQlyZWcuc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKG5ldyBQYXNzd29yZEVuY29kZXJEZWNvZGVyKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcmVnaXN0ZXJQYWNrYWdlcygpIHsgCi0JCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgibW9kdWxlQ29yZS54bWkiLCBuZXcgRVBhY2thZ2UuRGVzY3JpcHRvcigpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCQkJCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQl9Ci0JCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJcmV0dXJuIENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMjA4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5XVFBNb2R1bGVzVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdUUE1vZHVsZXNSZXNvdXJjZSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBUcmFuc2xhdG9yUmVzb3VyY2UgewotCQotCXB1YmxpYyBXVFBNb2R1bGVzUmVzb3VyY2UoVVJJIGFVUkksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlzdXBlcihhVVJJLCBhUmVuZGVyZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFB1YmxpY0lkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFN5c3RlbUlkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgeyAKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlI2dldERvY3R5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsgCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZSNnZXRSb290VHJhbnNsYXRvcigpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBXVFBNb2R1bGVzVHJhbnNsYXRvci5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmE2ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1RQX01PRFVMRVNfU0hPUlRfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfV1RQX01PRFVMRVNfU0hPUlRfTkFNRSA9ICIuY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX1dUUF9NT0RVTEVTX1NIT1JUX05BTUUgPSAiLnd0cG1vZHVsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgV1RQX01PRFVMRVNfVVJJX09CSiA9IFVSSS5jcmVhdGVVUkkoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIE9MRF9XVFBfTU9EVUxFU19VUklfT0JKID0gVVJJLmNyZWF0ZVVSSSgiLnNldHRpbmdzLy5jb21wb25lbnQiKTsKLQkKLQotCS8qKgotCSAqIE1ldGhvZCByZWdpc3RlckR0ZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRHRkcygpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LgotCSAqIEBwYXJhbSBhUmVuZGVyZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkuTGlzdGVuZXIjdXBkYXRlUmVuZGVyZXJGYWN0b3J5KGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlbmRlcmVyRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgbmV3UmVuZGVyZXJGYWN0b3J5KSB7Ci0JCS8vRG8gTm90aGluZy4uLiAgIG5vdCBhbGxvd2VkIHRvIHN3aXRjaAotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2UoVVJJLCBSZW5kZXJlcikKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewotCQlyZXR1cm4gbmV3IFdUUE1vZHVsZXNSZXNvdXJjZSh1cmksIGFSZW5kZXJlcik7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIG15c2VsZiB3aXRoIHRoZSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyV2l0aChSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChXVFBfTU9EVUxFU19TSE9SVF9OQU1FLCBuZXcgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KE9MRF9XVFBfTU9EVUxFU19TSE9SVF9OQU1FLCBuZXcgV1RQTW9kdWxlc1Jlc291cmNlRmFjdG9yeShhUmVuZGVyZXJGYWN0b3J5KSk7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KEZJUlNUX1dUUF9NT0RVTEVTX1NIT1JUX05BTUUsIG5ldyBXVFBNb2R1bGVzUmVzb3VyY2VGYWN0b3J5KGFSZW5kZXJlckZhY3RvcnkpKTsKLQl9Ci0JLyoqCi0JICogcmVnaXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgcmVuZGVyZXIgZmFjdG9yeS4KLQkgKiBAc2VlICNyZWdpc3RlcldpdGgoUmVuZGVyZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJcmVnaXN0ZXJXaXRoKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UuRmFjdG9yeSBnZXRSZWdpc3RlcmVkRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoV1RQX01PRFVMRVNfVVJJX09CSik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViMDJiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBGaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkgCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBMT0dfV0FSTklOR1MgPSBmYWxzZTsKLQkKLQkKLQlwcml2YXRlIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQluZXcgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlLkZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7Ci0JCWlmIChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRSA9PSB0aGlzKQotCQkJcmV0dXJuIHN1cGVyLmRlbGVnYXRlZEdldEZhY3RvcnkodXJpKTsKLQkJcmV0dXJuIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodXJpKTsJCi0JfSAgIAotCi0JcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSwgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeSA9IG51bGw7Ci0JCWlmKHVyaSAhPSBudWxsICYmIHVyaS5sYXN0U2VnbWVudCgpICE9IG51bGwpIHsKLQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCQlpZihudWxsID09IGRlc2NyaXB0aW9uKXsKLQkJCQlkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmkpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih1cmksIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJCQotCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VGYWN0b3J5ID0gZ2V0RmFjdG9yeShkZXNjcmlwdG9yKTsJCi0JCQl9CQotCQl9Ci0JCWlmKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKQotCQkJcmVzb3VyY2VGYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeSh1cmkpOwotCQlyZXR1cm4gcmVzb3VyY2VGYWN0b3J5OyAKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIG51bGwpOwotCX0JCi0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgZmlsZSBuYW1lIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgVVJJIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBSZXNvdXJjZS5GYWN0b3J5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChTdHJpbmcgYVNpbXBsZUZpbGVOYW1lLCBSZXNvdXJjZS5GYWN0b3J5IGFGYWN0b3J5KSB7IAotCQkKLQkJaWYoTE9HX1dBUk5JTkdTKSB7Ci0JCQkvKiB0aGUgdGhpcmQgZW50cnkgaW4gdGhlIGFycmF5IGlzIHRoaXMgc3RhY2sgZnJhbWUsIHdlIHdhbGsgYmFjayBmcm9tIHRoZXJlLiAqLwotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlID0gKG5ldyBFeGNlcHRpb24oKSkuZ2V0U3RhY2tUcmFjZSgpOwotCQkJaWYoc3RhY2tUcmFjZS5sZW5ndGggPiA0KSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHdhcm5pbmdNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigiV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQoKSB3YXMgY2FsbGVkIGV4cGxpY2l0bHkgZnJvbSAiICsgc3RhY2tUcmFjZVszXSk7Ci0JCQkJd2FybmluZ01lc3NhZ2UuYXBwZW5kKCJcblRoaXMgaGFwcGVuZWQgYXJvdW5kOiBcbiIpOwotCQkJCWZvciAoaW50IGkgPSA0OyAoaSA8IHN0YWNrVHJhY2UubGVuZ3RoKSAmJiBpIDwgODsgaSsrKSB7Ci0JCQkJCXdhcm5pbmdNZXNzYWdlLmFwcGVuZCgiXHRuZWFyICIpLmFwcGVuZChzdGFja1RyYWNlW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCQkJfQotCQkJCXdhcm5pbmdNZXNzYWdlLmFwcGVuZCgiLlxuQ2xpZW50cyBzaG91bGQgdXNlIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVzb3VyY2VGYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50IGluc3RlYWQuIik7Ci0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2coSVN0YXR1cy5JTkZPLCAwLCB3YXJuaW5nTWVzc2FnZS50b1N0cmluZygpLCBudWxsKTsJCQotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudChhU2ltcGxlRmlsZU5hbWUsIGFGYWN0b3J5KTsKLQkJCi0JfSAgCi0JcHJpdmF0ZSBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSBnZXRLZXkoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IGtleSA9IG5ldyBXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSgpOwotCQlrZXkuc2hvcnROYW1lID0gZGVzY3JpcHRvci5nZXRTaG9ydFNlZ21lbnQoKTsKLQkJa2V5LnR5cGUgPSBkZXNjcmlwdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCWtleS5pc0RlZmF1bHQgPSBkZXNjcmlwdG9yLmlzRGVmYXVsdCgpOwotCQlyZXR1cm4ga2V5OwotCX0KLQkKLQkvKioKLQkgKiBEZWNsYXJlcyBhIHN1YmNsYXNzIHRvIGNyZWF0ZSBSZXNvdXJjZS5GYWN0b3J5KGllcykgZnJvbSBhbiBleHRlbnNpb24uIAotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yICBpbXBsZW1lbnRzIElSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cyB7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBzaG9ydFNlZ21lbnQ7Ci0JCXByaXZhdGUgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOwotCQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0ID0gdHJ1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsgCi0JCQotCQlwdWJsaWMgQ29uZmlndXJhdGlvblJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJQXNzZXJ0LmlzTm90TnVsbChleHQpOwotCQkJZWxlbWVudCA9IGV4dDsKLQkJCWluaXQoKTsKLQkJfSAKLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJc2hvcnRTZWdtZW50ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NIT1JUX1NFR01FTlQpOwotCQkJaWYoc2hvcnRTZWdtZW50ID09IG51bGwgfHwgc2hvcnRTZWdtZW50LnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgCi0JCQkJCQkJCQkJIlRoZSBzaG9ydFNlZ21lbnQgYXR0cmlidXRlIG9mICIgKyBUQUdfUkVTT1VSQ0VfRkFDVE9SWSArIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkJIiBtdXN0IHNwZWNpZnkgYSB2YWxpZCwgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZSBpbiAiICsgICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCksIG51bGwpKTsKLQkJCWlmICgiZmFsc2UiLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSVNERUZBVUxUKSkpCi0JCQkJCWlzRGVmYXVsdCA9IGZhbHNlOwotCQkJCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBiaW5kaW5ncyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0NPTlRFTlRUWVBFKTsKLQkJCWlmIChiaW5kaW5ncy5sZW5ndGggPiAwKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCQkJCWNvbnRlbnRUeXBlSWQgPSBiaW5kaW5nc1swXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRUWVBFSUQpOwkJCQotCQkJCWlmIChjb250ZW50VHlwZUlkICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCQkJfQotCQl9IAotCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihVUkkgZmlsZVVSSSkgewotCQkJLyogc2hvcnRTZWdtZW50IG11c3QgYmUgbm9uLW51bGwgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGNyZWF0ZWQsIAotCQkJICogYSB2YWxpZGF0aW9uIGNoZWNrIGluIGluaXQoKSB2ZXJpZmllcyB0aGlzIHJlcXVpcmVtZW50ICovCi0JCQlpZihmaWxlVVJJICE9IG51bGwgJiYgZmlsZVVSSS5sYXN0U2VnbWVudCgpICE9IG51bGwpCi0JCQkJcmV0dXJuIHNob3J0U2VnbWVudC5lcXVhbHMoZmlsZVVSSS5sYXN0U2VnbWVudCgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSAKLQkJCi0JCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0JCQkKLQkJCWZpbmFsIFJlc291cmNlLkZhY3RvcnlbXSBmYWN0b3J5ID0gbmV3IFJlc291cmNlLkZhY3RvcnlbMV07Ci0JCQkKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQlmYWN0b3J5WzBdID0gKFJlc291cmNlLkZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwkJCQkJCi0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nKE1vZHVsZWNvcmVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7CQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJcmV0dXJuIGZhY3RvcnlbMF0gIT0gbnVsbCA/IGZhY3RvcnlbMF0gOiBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5HTE9CQUxfRkFDVE9SWTsKLQkJCQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTaG9ydFNlZ21lbnQoKSB7Ci0JCQlyZXR1cm4gc2hvcnRTZWdtZW50OwotCQl9Ci0KLQkJcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJCQotCQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQkJcmV0dXJuIGlzRGVmYXVsdDsKLQkJfSAgCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlpZiAoZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotCQkJCXJldHVybiBnZXRTaG9ydFNlZ21lbnQoKS5oYXNoQ29kZSgpICYgZ2V0Q29udGVudFR5cGUoKS5oYXNoQ29kZSgpOwotCQkJZWxzZSByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciAmJiBnZXRDb250ZW50VHlwZSgpICE9IG51bGwpCi0JCQkJcmV0dXJuIChnZXRTaG9ydFNlZ21lbnQoKS5lcXVhbHMoKChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKW8pLmdldFNob3J0U2VnbWVudCgpKSAmJgotCQkJCQkJZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoKChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKW8pLmdldENvbnRlbnRUeXBlKCkpKTsKLQkJCWVsc2UgaWYgKCgoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcilvKS5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQkKLQkJCXJldHVybiBzdXBlci5lcXVhbHMobyk7Ci0JCX0KLQl9ICAKLQkgCi0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgSVJlc291cmNlRmFjdG9yeUV4dFB0Q29uc3RhbnRzIHsgCi0gCQkKLQkJcHVibGljIFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKCkgewotCQkJc3VwZXIoUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKSwgTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQsIEVYVFBUX1JFU09VUkNFX0ZBQ1RPUklFUyk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJCi0JCQlpZihlbGVtZW50ICE9IG51bGwgJiYgVEFHX1JFU09VUkNFX0ZBQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJCWZpbmFsIGJvb2xlYW5bXSBzdWNjZXNzID0gbmV3IGJvb2xlYW5bXSB7IHRydWUgfTsgCi0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCWFkZERlc2NyaXB0b3IobmV3IENvbmZpZ3VyYXRpb25SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCQkJfSAKLQotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2coTW9kdWxlY29yZVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQkJCQkJCXN1Y2Nlc3NbMF0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwkJCQkKLQkJCQlyZXR1cm4gc3VjY2Vzc1swXTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkKLQkJfQotCX0KLQlwcml2YXRlIGNsYXNzIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IHsgCi0gCQkKLQkJcHVibGljIFN0cmluZyBzaG9ydE5hbWU7Ci0JCXB1YmxpYyBJQ29udGVudFR5cGUgdHlwZTsKLQkJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0ID0gdHJ1ZTsKLQkJcHVibGljIFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRvcihSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJZ2V0RGVzY3JpcHRvcnMoKS5wdXQoZ2V0S2V5KGRlc2NyaXB0b3IpLCBkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihVUkkgdXJpLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCVNldCBrZXlzID0gZ2V0RGVzY3JpcHRvcnMoKS5rZXlTZXQoKTsKLQkJUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciBkZWZhdWx0RGVzYyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5S2V5IGtleSA9IChXVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUtleSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGtleS5zaG9ydE5hbWUuZXF1YWxzKHVyaS5sYXN0U2VnbWVudCgpKSkgewotCQkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKWdldERlc2NyaXB0b3JzKCkuZ2V0KGtleSk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQkJaWYgKGtleS50eXBlID09IG51bGwpIAotCQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJCWVsc2UgaWYgKGRlc2MuaXNEZWZhdWx0KCkpIAotCQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJCS8vQWxsb3cgdGhlIGNvbnRlbnRUeXBlIGRpc2NyaW1pbmF0aW9uIHRvIHRha2UgcGxhY2UKLQkJCQlpZiAoKGtleS50eXBlICE9IG51bGwpICYmIAotCQkJCQkJKGRlc2NyaXB0aW9uICE9IG51bGwpICYmIAotCQkJCQkJKGRlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKGtleS50eXBlKSkpIHsKLQkJCQkJLy8gSWYgdGhlIGN1cnJlbnQgZGVzY3JpYmVyIGlzICJkZWZhdWx0IiB0aGVuIHNwZWNpZnkKLQkJCQkJaWYoZGVzYy5pc0RlZmF1bHQoKSkKLQkJCQkJCXJldHVybiBkZXNjOwotCQkJCQllbHNlIAkKLQkJCQkJCWRlZmF1bHREZXNjID0gZGVzYzsKLQkJCQl9Ci0JCQkJCQotCQkJCWlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2MuaXNEZWZhdWx0KCkpICYmIChkZWZhdWx0RGVzYyA9PSBudWxsKSkKLQkJCQkJZGVmYXVsdERlc2MgPSBkZXNjOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0RGVzYzsKLQl9Ci1wcml2YXRlIFVSSSBuZXdQbGF0Zm9ybVVSSShVUkkgYU5ld1VSSSwgSVByb2plY3QgcHJvamVjdCkgewotCQkKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBNb2R1bGVVUklVdGlsLnRyaW1Ub0RlcGxveVBhdGhTZWdtZW50KGFOZXdVUkkpOwotCQl0cnkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0KLQkJCVVSSSBkZXBsb3lQYXRoU2VnbWVudCA9IE1vZHVsZVVSSVV0aWwudHJpbVRvRGVwbG95UGF0aFNlZ21lbnQoYU5ld1VSSSk7Ci0JCQkKLQkJCS8vSVZpcnR1YWxGaWxlIG5ld0ZpbGUgPSBjb21wb25lbnQuZ2V0RmlsZShuZXcgUGF0aChkZXBsb3lQYXRoU2VnbWVudC5wYXRoKCkpKTsJCQkKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSVZpcnR1YWxGaWxlIG5ld0ZpbGUgPSByb290Rm9sZGVyLmdldEZpbGUobmV3IFBhdGgoZGVwbG95UGF0aFNlZ21lbnQucGF0aCgpKSk7Ci0JCQkKLQkJCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShuZXdGaWxlLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJIAotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb25Gcm9tVVJJKFVSSSB1cmkpIHsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllciA9IE1vZHVsZVVSSVV0aWwuZ2V0Q29udGVudFR5cGVOYW1lKHVyaSk7Ci0JCWlmIChjb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCkKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkZW50aWZpZXIpLmdldERlZmF1bHREZXNjcmlwdGlvbigpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoVVJJIHVyaSkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0UGxhdGZvcm1GaWxlKHVyaSk7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsvL0NoZWNrIGZvciBvcHRpb25hbCBlbWJlZGRlZCB1cmkgc2VnbWVudCwgdGhlbiBub3JtYWxpemUKLQkJCWRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb25Gcm9tVVJJKHVyaSk7Ci0JCQl0cnkgewotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlQcm9qZWN0IGNvbXBvbmVudFByb2plY3QgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJY29tcG9uZW50UHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QodXJpKTsKLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCXVyaSA9IFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5yZXNvbHZlKHVyaSk7Ci0JCQkJCXVyaSA9IG5ld1BsYXRmb3JtVVJJKHVyaSxjb21wb25lbnRQcm9qZWN0KTsKLQkJCQl9IAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlZmF1bHREZXNjID0gZ2V0RGVzY3JpcHRvcih1cmksIGRlc2NyaXB0aW9uKTsKLQkJLy8gT2sgbm8gY29udGVudCB0eXBlIG1hdGNoIC0gZ28gdG8gc3VwZXIKLQkJaWYgKGRlZmF1bHREZXNjICE9IG51bGwpewotCQkJcmV0dXJuIGRlZmF1bHREZXNjOwotCQl9Ci0JCWVsc2V7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVzY3JpcHRvcih1cmkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV29ya2JlbmNoQ29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV29ya2JlbmNoQ29tcG9uZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNlYmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtiZW5jaENvbXBvbmVudEltcGwuamF2YSx2IDEuMTQgMjAwNy8wMi8xNCAxNjowMDo1MiBqc2hvbGwgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2JlbmNoIE1vZHVsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldFJlc291cmNlcyA8ZW0+UmVzb3VyY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsI2dldFJlZmVyZW5jZWRDb21wb25lbnRzIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldvcmtiZW5jaENvbXBvbmVudEltcGwjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV29ya2JlbmNoQ29tcG9uZW50SW1wbCNnZXRNZXRhZGF0YVJlc291cmNlcyA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQ29tcG9uZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2JlbmNoQ29tcG9uZW50IHsKLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdCBleHRlbmRzIEVBZGFwdGVyTGlzdAotCSAgewotCQotCSAgICBwdWJsaWMgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0KE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCQlzdXBlcihub3RpZmllcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLmFkZChvYmplY3QpO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3N1cGVyLmFkZChpbmRleCwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iamVjdCkKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlKG9iamVjdCk7fQotCSAgICB9Ci0JCi0JICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikKLQkgICAgewotCSAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pO30KLQkgICAgfQotCQotCSAgICBwdWJsaWMgdm9pZCBjbGVhcigpCi0JICAgIHsKLQkgICAgIHN5bmNocm9uaXplZCAodGhpcykge3N1cGVyLmNsZWFyKCk7fTsKLQkgICAgfQotCQotCQotCSAgICBwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7cmV0dXJuIHN1cGVyLnNldChpbmRleCwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIHZvaWQgbW92ZShpbnQgbmV3UG9zaXRpb24sIE9iamVjdCBvYmplY3QpCi0JICAgIHsKLQkgICAgc3luY2hyb25pemVkICh0aGlzKSB7c3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2JqZWN0KTt9Ci0JICAgIH0KLQkKLQkgICAgcHVibGljIE9iamVjdCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgaW50IG9sZFBvc2l0aW9uKQotCSAgICB7Ci0JICAgIHN5bmNocm9uaXplZCAodGhpcykge3JldHVybiBzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvbGRQb3NpdGlvbik7fQotCSAgICB9Ci0JICB9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZXMoKSA8ZW0+UmVzb3VyY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcG9uZW50VHlwZSgpIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFR5cGUgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpIDxlbT5SZWZlcmVuY2VkIENvbXBvbmVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByb3BlcnRpZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSA8ZW0+TWV0YWRhdGEgUmVzb3VyY2VzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhUmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0YWRhdGFSZXNvdXJjZXMgPSBudWxsOwotCi0vLwlwcml2YXRlIGZpbmFsIE1hcCByZXNvdXJjZUluZGV4QnlEZXBsb3lQYXRoID0gbmV3IEhhc2hNYXAoKTsKLS8vCXByaXZhdGUgZmluYWwgTWFwIHJlc291cmNlSW5kZXhCeVNvdXJjZVBhdGggPSBuZXcgSGFzaE1hcCgpOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkQnlEZXBsb3lQYXRoOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNJbmRleGVkQnlTb3VyY2VQYXRoOwotCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRSZXNvdXJjZVtdIE5PX01PRFVMRV9SRVNPVVJDRVMgPSBuZXcgQ29tcG9uZW50UmVzb3VyY2VbMF07Ci0KLQlwcml2YXRlIFVSSSBoYW5kbGU7Ci0JCi0JcHJpdmF0ZSBJUGF0aCBkZWZhdWx0U291cmNlUm9vdDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2JlbmNoQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldEZpcnN0Um9vdFNvdXJjZSgpIHsKLQkJCi0JCUxpc3QgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbXBvbmVudFJlc291cmNlIGVsZW1lbnQgPSAoQ29tcG9uZW50UmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMobmV3IFBhdGgoIi8iKSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U291cmNlUGF0aCgpOwotCQkJCi0JCX0JCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrYmVuY2hDb21wb25lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVHZW4oU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld0RlcGxveWVkTmFtZSkgewotCQlzZXROYW1lR2VuKG5ld0RlcGxveWVkTmFtZSk7Ci0JCS8vIFRPRE8gQSBtb3JlIGFkdmFuY2VkIGFkYXB0ZXIgc2hvdWxkIGJlIGFwcGxpZWQgdG8ga2VlcCB0aGUgaGFuZGxlIHVwIHRvIGRhdGUuCi0JCWlmIChlUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlVUkkgcmVzb3VyY2VVUkkgPSBlUmVzb3VyY2UoKS5nZXRVUkkoKTsKLS8vCQkJU3RyaW5nIHNhZmVEZXBsb3llZE5hbWUgPSBnZXROYW1lKCkgIT0gbnVsbCA/IGdldE5hbWUoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCAmJiByZXNvdXJjZVVSSS5zZWdtZW50Q291bnQoKSA+PSAyKQotCQkJCXNldEhhbmRsZShjb21wdXRlSGFuZGxlKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEhhbmRsZShVUkkgYUhhbmRsZSkgewotCQloYW5kbGUgPSBhSGFuZGxlOwotCX0KLQkKLQlwdWJsaWMgVVJJIGdldEhhbmRsZSgpIHsKLQkJaWYoaGFuZGxlID09IG51bGwpCi0JCQloYW5kbGUgPSBjb21wdXRlSGFuZGxlKCk7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBVUkkgY29tcHV0ZUhhbmRsZSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCArIElQYXRoLlNFUEFSQVRPUiArIFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbi5SRVNPVVJDRV9NT0RVTEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBjb21wdXRlUHJvamVjdE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGdldE5hbWUoKSk7Ci0JCQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVQcm9qZWN0TmFtZSgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh0aGlzKTsKLQkJcmV0dXJuIChwcm9qZWN0IT1udWxsKT9wcm9qZWN0LmdldE5hbWUoKToiVU5DT05UQUlORUQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZXMoKSB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MsIHRoaXMsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1JFU09VUkNFUywgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1JFU09VUkNFX19DT01QT05FTlQpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFR5cGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRUeXBlIG5ld0NvbXBvbmVudFR5cGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29tcG9uZW50VHlwZSBvbGRDb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLQkJY29tcG9uZW50VHlwZSA9IG5ld0NvbXBvbmVudFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFLCBvbGRDb21wb25lbnRUeXBlLCBuZXdDb21wb25lbnRUeXBlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUgbmV3Q29tcG9uZW50VHlwZSkgewotCQlpZiAobmV3Q29tcG9uZW50VHlwZSAhPSBjb21wb25lbnRUeXBlKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb21wb25lbnRUeXBlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbXBvbmVudFR5cGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29tcG9uZW50VHlwZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb21wb25lbnRUeXBlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29tcG9uZW50VHlwZShuZXdDb21wb25lbnRUeXBlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFLCBuZXdDb21wb25lbnRUeXBlLCBuZXdDb21wb25lbnRUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkgewotCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudHMgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlZENvbXBvbmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVmZXJlbmNlZENvbXBvbmVudC5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByb3BlcnRpZXMoKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0KFByb3BlcnR5LmNsYXNzLCB0aGlzLCBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKSB7Ci0JCWlmIChtZXRhZGF0YVJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQltZXRhZGF0YVJlc291cmNlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChJUGF0aC5jbGFzcywgdGhpcywgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTKTsKLQkJfQotCQlyZXR1cm4gbWV0YWRhdGFSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX0NPTVBPTkVOVF9UWVBFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb21wb25lbnRUeXBlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvbXBvbmVudFR5cGUoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX01FVEFEQVRBX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJc2V0Q29tcG9uZW50VHlwZSgoQ29tcG9uZW50VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFM6Ci0JCQkJZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVM6Ci0JCQkJZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJCWdldE1ldGFkYXRhUmVzb3VyY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVTT1VSQ0VTOgotCQkJCWdldFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChDb21wb25lbnRUeXBlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUkVGRVJFTkNFRF9DT01QT05FTlRTOgotCQkJCWdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlRfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19NRVRBREFUQV9SRVNPVVJDRVM6Ci0JCQkJZ2V0TWV0YWRhdGFSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRVNPVVJDRVM6Ci0JCQkJcmV0dXJuIHJlc291cmNlcyAhPSBudWxsICYmICFyZXNvdXJjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19DT01QT05FTlRfVFlQRToKLQkJCQlyZXR1cm4gY29tcG9uZW50VHlwZSAhPSBudWxsOwotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5XT1JLQkVOQ0hfQ09NUE9ORU5UX19SRUZFUkVOQ0VEX0NPTVBPTkVOVFM6Ci0JCQkJcmV0dXJuIHJlZmVyZW5jZWRDb21wb25lbnRzICE9IG51bGwgJiYgIXJlZmVyZW5jZWRDb21wb25lbnRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuV09SS0JFTkNIX0NPTVBPTkVOVF9fTUVUQURBVEFfUkVTT1VSQ0VTOgotCQkJCXJldHVybiBtZXRhZGF0YVJlc291cmNlcyAhPSBudWxsICYmICFtZXRhZGF0YVJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFSZXNvdXJjZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGFkYXRhUmVzb3VyY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlW10gZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoSVBhdGggYURlcGxveVBhdGgpIHsgCi0JCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdCh0aGlzKTsKLQkJcmV0dXJuIHJlc291cmNlVHJlZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhhRGVwbG95UGF0aCwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7IAotCX0KLQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoSVBhdGggYVNvdXJjZVBhdGgsIGludCByZXNvdXJjZUZsYWcpIHsgCi0JCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh0aGlzKTsKLQkJcmV0dXJuIHJlc291cmNlVHJlZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhhU291cmNlUGF0aCwgcmVzb3VyY2VGbGFnKTsgCi0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBhU291cmNlUGF0aCwgaW50IHJlc291cmNlRmxhZykgeyAKLQkJUmVzb3VyY2VUcmVlUm9vdCByZXNvdXJjZVRyZWVSb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXRTb3VyY2VSZXNvdXJjZVRyZWVSb290KHRoaXMpOwotCQlyZXR1cm4gcmVzb3VyY2VUcmVlUm9vdC5leGlzdHMoYVNvdXJjZVBhdGgsIHJlc291cmNlRmxhZyk7IAotCX0KLQlwdWJsaWMgRUxpc3QgZUFkYXB0ZXJzKCkKLQkgIHsKLQkgICAgaWYgKGVBZGFwdGVycyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUFkYXB0ZXJzID0gIG5ldyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QodGhpcyk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGVBZGFwdGVyczsKLQkgIH0KLQotCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN5bmNocm9uaXplZCAoZUFkYXB0ZXJzKCkpIHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0RGVmYXVsdFNvdXJjZVJvb3QoKSB7Ci0JCWlmIChkZWZhdWx0U291cmNlUm9vdCA9PSBudWxsKQotCQkJZGVmYXVsdFNvdXJjZVJvb3QgPSBnZXRGaXJzdFJvb3RTb3VyY2UoKTsKLQkJcmV0dXJuIGRlZmF1bHRTb3VyY2VSb290OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U291cmNlUm9vdChJUGF0aCBkZWZhdWx0U291cmNlUm9vdCkgewotCQl0aGlzLmRlZmF1bHRTb3VyY2VSb290ID0gZGVmYXVsdFNvdXJjZVJvb3Q7Ci0JfQotICAKLQotfSAvLyBXb3JrYmVuY2hDb21wb25lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjE0MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9BcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChUWVBFX0lEKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09NUE9ORU5UX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9NUFRfT05fU0FWRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBUkdFVF9QUk9KRUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9NUFRfT05fU0FWRSkpCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUQVJHRVRfUFJPSkVDVCkpCi0JCQlyZXR1cm4gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBUkdFVF9DT01QT05FTlQpKQotCQkJcmV0dXJuIGdldFRhcmdldENvbXBvbmVudCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTVBPTkVOVF9OQU1FKSkKLQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hDb21wb25lbnQgZ2V0V29ya2JlbmNoTW9kdWxlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFRhcmdldFByb2plY3QoKSk7Ci0JCQltb2R1bGUgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG51bGwgIT0gbW9kdWxlQ29yZSkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKENPTVBPTkVOVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotCQkJc2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJcmV0dXJuIG5vdGlmeTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSB7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSBnZXRXb3JrYmVuY2hNb2R1bGUoKTsKLQkJSVByb2plY3QgcHJvaiA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QobW9kdWxlKTsKLQkJcmV0dXJuIEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2opOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc09LKCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpCi0JCQlyZXR1cm4gdmFsaWRhdGVNb2R1bGVOYW1lKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVNb2R1bGVOYW1lKCkgewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSk7Ci0JCWlmIChtb2R1bGVOYW1lID09IG51bGwgfHwgbW9kdWxlTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9OQU1FX0VNUFRZKSk7Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRUYXJnZXRDb21wb25lbnQoKSB7Ci0JCVN0cmluZyBtb2R1bGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoQ09NUE9ORU5UX05BTUUpOwotCQlpZiAobW9kdWxlTmFtZSAhPSBudWxsICYmIG1vZHVsZU5hbWUubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGdldFRhcmdldFByb2plY3QoKSk7Ci0JCXJldHVybiBudWxsOwotCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1NjUxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0FydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklBcnRpZmFjdEVkaXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHQgZW1mV29ya2JlbmNoQ29udGV4dDsKLS8vCXByaXZhdGUgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRQcm92aWRlck9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdFByb3ZpZGVyT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQllbWZXb3JrYmVuY2hDb250ZXh0ID0gKEVNRldvcmtiZW5jaENvbnRleHQpIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5jcmVhdGVFTUZDb250ZXh0KGdldFRhcmdldFByb2plY3QoKSwgbnVsbCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFRhcmdldENvbXBvbmVudCgpOyAKLQkJYXJ0aWZhY3RFZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0Rm9yTW9kdWxlKGNvbXBvbmVudCk7Ci0JCWRvSW5pdGlhbGl6ZShtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VGFyZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvSW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9EZWZhdWx0Ci0JfQotCi0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldFByb2plY3QoKSk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoY29tcCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkgewotCQkJYXJ0aWZhY3RFZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCX0KLQotCXB1YmxpYyBmaW5hbCBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJaW5pdGlhbGl6ZShtb25pdG9yKTsKLQkJCWlmICh2YWxpZGF0ZUVkaXQoKS5pc09LKCkpCi0JCQkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJfSBmaW5hbGx5IHsKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXQoKXsKLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBlZGl0IGZvciByZXNvdXJjZSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdCgpIHsKLQkJSVZhbGlkYXRlRWRpdENvbnRleHQgdmFsaWRhdG9yID0gKElWYWxpZGF0ZUVkaXRDb250ZXh0KSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKElWYWxpZGF0ZUVkaXRDb250ZXh0LkNMQVNTX0tFWSk7Ci0JCXJldHVybiB2YWxpZGF0b3IudmFsaWRhdGVTdGF0ZSgoRWRpdE1vZGVsKWdldEFydGlmYWN0RWRpdCgpLmdldEFkYXB0ZXIoQXJ0aWZhY3RFZGl0TW9kZWwuQURBUFRFUl9UWVBFKSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9Db21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Mjg5OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9Db21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGRhdGFNb2RlbCBpcyBhIGNvbW1vbiBzdXBlciBjbGFzcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBXVFAgQ29tcG9uZW50cy4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcywgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1IHsKLQotCS8vIHByb3RlY3RlZCBib29sZWFuIGlzUHJvak11bHRpQ29tcG9uZW50cyA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBpc1Byb2pNdWx0aUNvbXBvbmVudHMgPQotCQkvLyBGbGV4aWJsZUphdmFQcm9qZWN0UHJlZmVyZW5jZVV0aWwuZ2V0TXVsdGlwbGVNb2R1bGVzUGVyUHJvamVjdFByb3AoKTsKLQkJLy8gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFNVUFBPUlRfTVVMVElQTEVfTU9EVUxFUykgPQotCQkvLyBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoU1VQUE9SVF9NVUxUSVBMRV9NT0RVTEVTKTsKLQkJaW5pdFByb2plY3RDcmVhdGlvbk1vZGVsKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTkVTVEVEX1BST0pFQ1RfQ1JFQVRJT05fRE0pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT01QT05FTlRfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTVBPTkVOVF9OQU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTE9DQVRJT04pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDT01QT05FTlRfREVQTE9ZX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfREVGQVVMVF9GSUxFUyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTVBPTkVOVCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRykgewotCQkJZXZlbnQuZ2V0RGF0YU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiAoQ09NUE9ORU5UX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCW1vZGVsLnNldFByb3BlcnR5KENPTVBPTkVOVF9ERVBMT1lfTkFNRSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwotCQl9IGVsc2UgaWYgKENPTVBPTkVOVF9ERVBMT1lfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09NUE9ORU5UX0RFUExPWV9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfSBlbHNlIGlmIChDT01QT05FTlQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHByb3BlcnR5TmFtZSArICIgc2hvdWxkIG5vdCBiZSBzZXQuIik7Ci0JCX0gZWxzZSBpZiAoUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkvLyBpZighRmxleGlibGVKYXZhUHJvamVjdFByZWZlcmVuY2VVdGlsLmdldE11bHRpcGxlTW9kdWxlc1BlclByb2plY3RQcm9wKCkpewotCQkJLy8gbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkvLyBzZXQgdGhlIHByb3BlcnR5IGluIG5lc3RlZCBGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCQkJSURhdGFNb2RlbCBkbSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9QUk9KRUNUX0NSRUFUSU9OX0RNKTsKLQkJCWRtLnNldFByb3BlcnR5KElGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQkJLy8gfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX0RFRkFVTFRfRklMRVMpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09NUE9ORU5UKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTVBPTkVOVF9OQU1FKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCQlTdHJpbmcgbW9kdWxlTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTVBPTkVOVF9OQU1FKTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaWYgKG1vZHVsZU5hbWUuaW5kZXhPZigiIyIpICE9IC0xIHx8IG1vZHVsZU5hbWUuaW5kZXhPZigiLyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5FUlJfSU5WQUxJRF9DSEFSUyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJCX0gZWxzZSBpZiAobW9kdWxlTmFtZSA9PSBudWxsIHx8IG1vZHVsZU5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuRVJSX0VNUFRZX01PRFVMRV9OQU1FKTsKLQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwotCi0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9OQU1FX0VNUFRZKTsKLQkJCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7Ci0JCQkJfQotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotCQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJCQlpZiAocHJvai5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9FWElTVFNfRVJST1IpOwotCQkJCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT01QT05FTlRfREVQTE9ZX05BTUUpKSB7Ci0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX0RFRkFVTFRfRklMRVMpKSB7Ci0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShwcm9qZWN0TmFtZSwgSVJlc291cmNlLlBST0pFQ1QpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCi0JCWlmIChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpLmV4aXN0cygpKQotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuUFJPSkVDVF9FWElTVFNfRVJST1IsIG5ldyBPYmplY3RbXXtwcm9qZWN0TmFtZX0pKTsKLQotCQlpZiAocHJvamVjdE5hbWUuaW5kZXhPZigiIyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbnZhbGlkQ2hhcnNFcnJvciIpOwotCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJJbnZhbGlkQ2hhcnNFcnJvciI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVmVyc2lvbnMoU3RyaW5nIG1vZHVsZUlELCBJUnVudGltZVR5cGUgdHlwZSkgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBpZiAodHlwZSA9PSBudWxsKQotCS8vIHJldHVybiBudWxsOwotCS8vIElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMgPSB0eXBlLmdldE1vZHVsZVR5cGVzKCk7Ci0JLy8gaWYgKG1vZHVsZVR5cGVzICE9IG51bGwpIHsKLQkvLyBpbnQgc2l6ZSA9IG1vZHVsZVR5cGVzLmxlbmd0aDsKLQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCS8vIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlc1tpXTsKLQkvLyBpZiAobWF0Y2hlcyhtb2R1bGVUeXBlLmdldElkKCksIG1vZHVsZUlEKSkgewotCS8vIGxpc3QuYWRkKG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpKTsKLQkvLyB9Ci0JLy8KLQkvLyB9Ci0JLy8gfQotCS8vIFN0cmluZ1tdIHZlcnNpb25zID0gbnVsbDsKLQkvLyBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JLy8gdmVyc2lvbnMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkvLyBsaXN0LnRvQXJyYXkodmVyc2lvbnMpOwotCS8vIH0KLQkvLyByZXR1cm4gdmVyc2lvbnM7Ci0JLy8gfQotCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc2VydmVyVHlwZUlELCBTdHJpbmcgajJlZU1vZHVsZUlEKSB7Ci0vLwotLy8JCWlmIChzZXJ2ZXJUeXBlSUQuZXF1YWxzKCJqMmVlIikpIHsKLS8vCQkJaWYgKGoyZWVNb2R1bGVJRC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkgfHwgajJlZU1vZHVsZUlELmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKSB8fCBqMmVlTW9kdWxlSUQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpIHx8IGoyZWVNb2R1bGVJRC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSkgfHwgajJlZU1vZHVsZUlELmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9IGVsc2UgaWYgKHNlcnZlclR5cGVJRC5lcXVhbHMoImoyZWUuKiIpKSB7Ci0vLwkJCWlmIChqMmVlTW9kdWxlSUQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpIHx8IGoyZWVNb2R1bGVJRC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkgfHwgajJlZU1vZHVsZUlELmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKSB8fCBqMmVlTW9kdWxlSUQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUpIHx8IGoyZWVNb2R1bGVJRC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRSkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfSBlbHNlIGlmIChzZXJ2ZXJUeXBlSUQuZXF1YWxzKCJqMmVlLndlYiIpKSB7Ly8kTk9OLU5MUy0xJAotLy8JCQlpZiAoajJlZU1vZHVsZUlELmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9IGVsc2UgaWYgKHNlcnZlclR5cGVJRC5lcXVhbHMoImoyZWUuZWpiIikpIHsvLyROT04tTkxTLTEkCi0vLwkJCWlmIChqMmVlTW9kdWxlSUQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0gZWxzZSBpZiAoc2VydmVyVHlwZUlELmVxdWFscygiajJlZS5lYXIiKSkgey8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGoyZWVNb2R1bGVJRC5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkgfHwgajJlZU1vZHVsZUlELmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSB8fCBqMmVlTW9kdWxlSUQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEUpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JLy8gaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgIioiLmVxdWFscyhhKSB8fCAiKiIuZXF1YWxzKGIpIHx8IGEuc3RhcnRzV2l0aChiKSB8fAotCS8vIGIuc3RhcnRzV2l0aChhKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoQ09NUE9ORU5UX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50RGVwbG95TmFtZSgpIHsKLQkJcmV0dXJuIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTVBPTkVOVF9ERVBMT1lfTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdFByb2plY3RDcmVhdGlvbk1vZGVsKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRUNsYXNzIGdldENvbXBvbmVudFR5cGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG9uZW50RXh0ZW5zaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRQcm9wZXJ0aWVzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW50ZWdlciBnZXREZWZhdWx0Q29tcG9uZW50VmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDk5MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU09VUkNFX0NPTVBPTkVOVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBUkdFVF9DT01QT05FTlRfTElTVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChUQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbWFwKTsKLQkJCXJldHVybiBtYXA7Ci0JCX0KLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBUkdFVF9DT01QT05FTlRfTElTVCkpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIKSl7Ci0JCQlyZXR1cm4gIi8iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0NyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI3Yzc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dDsKLQotcHVibGljIGNsYXNzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCi0JcHVibGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCF2YWxpZGF0ZUVkaXQoKS5pc09LKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCWFkZFJlZmVyZW5jZWRDb21wb25lbnRzKG1vbml0b3IpOwotCQlhZGRQcm9qZWN0UmVmZXJlbmNlcygpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBlZGl0IGZvciByZXNvdXJjZSBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRWRpdCgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCUlWYWxpZGF0ZUVkaXRDb250ZXh0IHZhbGlkYXRvciA9IChJVmFsaWRhdGVFZGl0Q29udGV4dCkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShJVmFsaWRhdGVFZGl0Q29udGV4dC5DTEFTU19LRVkpOwotCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzb3VyY2VDb21wLmdldFByb2plY3QoKTsKLQotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJU3RydWN0dXJlRWRpdCBzRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlU3RhdGUoc0VkaXQuZ2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoc0VkaXQgIT1udWxsKQotCQkJCQlzRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0UmVmZXJlbmNlcygpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCUxpc3QgbW9kTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJTGlzdCB0YXJnZXRwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBJVmlydHVhbENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgbW9kTGlzdC5nZXQoaSk7Ci0JCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gSVZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJdGFyZ2V0cHJvamVjdExpc3QuYWRkKHRhcmdldFByb2plY3QpOwotCQl9Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0VXRpbGl0aWVzLmFkZFJlZmVyZW5jZVByb2plY3RzKHNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpLCB0YXJnZXRwcm9qZWN0TGlzdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlZENvbXBvbmVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHNvdXJjZUNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKLQkJTGlzdCB2bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZExpc3QuZ2V0KGkpOwotCQkJaWYgKCFzcmNDb21wb25lbnRDb250YWluc1JlZmVyZW5jZShzb3VyY2VDb21wLCBjb21wKSkgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKHNvdXJjZUNvbXAsIGNvbXApOwotCQkJCVN0cmluZyBkZXBsb3lQYXRoID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIKTsKLQkJCQlpZiAoZGVwbG95UGF0aCAhPSBudWxsICYmIGRlcGxveVBhdGgubGVuZ3RoKCkgPiAwKQotCQkJCQlyZWYuc2V0UnVudGltZVBhdGgobmV3IFBhdGgoZGVwbG95UGF0aCkpOwotCi0JCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gZ2V0QXJjaGl2ZU5hbWUoY29tcCk7Ci0JCQkJaWYgKGFyY2hpdmVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQlyZWYuc2V0QXJjaGl2ZU5hbWUoYXJjaGl2ZU5hbWUpOwotCQkJCX0KLQkJCQl2bGlzdC5hZGQocmVmKTsKLQkJCX0KLQkJfQotCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IChJVmlydHVhbFJlZmVyZW5jZVtdKSB2bGlzdC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVt2bGlzdC5zaXplKCldKTsKLQkJc291cmNlQ29tcC5hZGRSZWZlcmVuY2VzKHJlZnMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoSVZpcnR1YWxDb21wb25lbnQgY29tcCkgewotCQlNYXAgbWFwID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVApOwotCQlTdHJpbmcgdXJpID0gKFN0cmluZykgbWFwLmdldChjb21wKTsKLQkJcmV0dXJuIHVyaSA9PSBudWxsID8gIiIgOiB1cmk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBzcmNDb21wb25lbnRDb250YWluc1JlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wLCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmICgoc291cmNlQ29tcCAhPSBudWxsICYmIHNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpICE9IG51bGwpICYmIChjb21wICE9IG51bGwgJiYgY29tcC5nZXRQcm9qZWN0KCkgIT0gbnVsbCkpIHsKLQkJCi0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGV4aXN0aW5nUmVmZXJlbmNlcyA9IHNvdXJjZUNvbXAuZ2V0UmVmZXJlbmNlcygpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IG51bGw7Ci0JCQlpZiAoZXhpc3RpbmdSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4aXN0aW5nUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZXhpc3RpbmdSZWZlcmVuY2VzW2ldICE9IG51bGwgKSB7Ci0JCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gZXhpc3RpbmdSZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsJCi0JCQkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudCAhPSBudWxsICYmIHJlZmVyZW5jZWRDb21wb25lbnQuZXF1YWxzKGNvbXApICApIAotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXREYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1OGIxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZhY2V0RGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbi5UeXBlOwotCi1wdWJsaWMgY2xhc3MgRmFjZXREYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRmFjZXREYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qOwotCQl0cnkgewotCQkJZmFjZXRQcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQlTZXQgYWN0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlhY3Rpb25zLmFkZChuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbigoVHlwZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9UWVBFKSwgKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04pLCBtb2RlbCkpOwotCQkJZmFjZXRQcm9qLm1vZGlmeShhY3Rpb25zLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVhMjg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW50aW1lQWRkZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBGYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRmFjZXRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qID0gY3JlYXRlUHJvamVjdChtb25pdG9yKTsKLQkJCVNldCBleGlzdGluZ0ZhY2V0cyA9IGZhY2V0UHJvai5nZXRQcm9qZWN0RmFjZXRzKCk7Ci0KLQkJCU1hcCBkbU1hcCA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCVNldCBhY3Rpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCUlEYXRhTW9kZWwgZmFjZXRETSA9IG51bGw7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZG1NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCWZhY2V0RE0gPSAoSURhdGFNb2RlbCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmYWNldERNLmdldEJvb2xlYW5Qcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlNIT1VMRF9FWEVDVVRFKSkgewotCQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0RE0uZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9JRCk7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQkJZm9yIChJdGVyYXRvciBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yID0gZXhpc3RpbmdGYWNldHMuaXRlcmF0b3IoKTsgc2hvdWxkSW5zdGFsbEZhY2V0ICYmIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgZXhpc3RpbmdGYWNldHNJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscyhmYWNldElEKSkgewotCQkJCQkJCXNob3VsZEluc3RhbGxGYWNldCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzaG91bGRJbnN0YWxsRmFjZXQpIHsKLQkJCQkJCWFjdGlvbnMuYWRkKGZhY2V0RE0uZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT04pKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCU1hcCBhY3Rpb25zTWFwID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9BQ1RJT05fTUFQKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3Rpb25zTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlhY3Rpb25zLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJfQotCQkJaWYgKCFhY3Rpb25zLmlzRW1wdHkoKSkgewotCQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbW9uaXRvcik7Ci0JCQl9Ci0JCQlTZXQgZml4ZWRGYWNldHMgPSBuZXcgSGFzaFNldCgpLCBuZXdGYWNldFZlcnNpb25zID0gZmFjZXRQcm9qLmdldFByb2plY3RGYWNldHMoKSwgZXhpc3RpbmdGaXhlZEZhY2V0cyA9IGZhY2V0UHJvai5nZXRGaXhlZFByb2plY3RGYWNldHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0ZhY2V0VmVyc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgZmFjZXRJRCA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpOwotCQkJCWJvb2xlYW4gc2hvdWxkSW5zdGFsbEZhY2V0ID0gdHJ1ZTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGV4aXN0aW5nRmFjZXRzSXRlcmF0b3IgPSBleGlzdGluZ0ZpeGVkRmFjZXRzLml0ZXJhdG9yKCk7IHNob3VsZEluc3RhbGxGYWNldCAmJiBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2plY3RGYWNldCBmYWNldCA9IChJUHJvamVjdEZhY2V0KSBleGlzdGluZ0ZhY2V0c0l0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY2V0LmdldElkKCkuZXF1YWxzKGZhY2V0SUQpKSB7Ci0JCQkJCQlzaG91bGRJbnN0YWxsRmFjZXQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoc2hvdWxkSW5zdGFsbEZhY2V0KSB7Ci0JCQkJCWZpeGVkRmFjZXRzLmFkZChmYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZml4ZWRGYWNldHMuaXNFbXB0eSgpKSB7Ci0JCQkJZmFjZXRQcm9qLnNldEZpeGVkUHJvamVjdEZhY2V0cyhmaXhlZEZhY2V0cyk7Ci0JCQl9Ci0JCQlpZiAocnVudGltZUFkZGVkKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCQlhZGREZWZhdWx0RmFjZXRzKGZhY2V0UHJvaiwgcnVudGltZS5nZXREZWZhdWx0RmFjZXRzKGZpeGVkRmFjZXRzKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGVmYXVsdEZhY2V0cyhJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qLCBTZXQgZGVmYXVsdEZhY2V0cykgewotCQlTZXQgYWN0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlZmF1bHRGYWNldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFmYWNldFByb2ouaGFzUHJvamVjdEZhY2V0KGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKSkpIHsKLQkJCQlhY3Rpb25zLmFkZChuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbihBY3Rpb24uVHlwZS5JTlNUQUxMLCBmYWNldFZlcnNpb24sIG51bGwpKTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAoIWFjdGlvbnMuaXNFbXB0eSgpKQotCQkJCWZhY2V0UHJvai5tb2RpZnkoYWN0aW9ucywgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIElGYWNldGVkUHJvamVjdCBjcmVhdGVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKSk7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2ogPSBudWxsOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJZmFjZXRQcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuUFJPSkVDVF9MT0NBVElPTik7Ci0JCQlJUGF0aCBsb2NhdGlvblBhdGggPSBudWxsID09IGxvY2F0aW9uID8gbnVsbCA6IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCWZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSksIGxvY2F0aW9uUGF0aCwgbW9uaXRvcik7Ci0JCX0KLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJSVJ1bnRpbWUgZXhpc3RpbmdSdW50aW1lID0gZmFjZXRQcm9qLmdldFByaW1hcnlSdW50aW1lKCk7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgKGV4aXN0aW5nUnVudGltZSA9PSBudWxsIHx8ICFydW50aW1lLmVxdWFscyhleGlzdGluZ1J1bnRpbWUpKSkgewotCQkJZmFjZXRQcm9qLnNldFRhcmdldGVkUnVudGltZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJ1bnRpbWUpLCBudWxsKTsKLQkJCXJ1bnRpbWVBZGRlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhY2V0UHJvajsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZERlZmF1bHRGYWN0ZXRzKElGYWNldGVkUHJvamVjdCBmYWNldFByb2osIElSdW50aW1lIHJ1bnRpbWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWFkZERlZmF1bHRGYWNldHMoZmFjZXRQcm9qLCBydW50aW1lLmdldERlZmF1bHRGYWNldHMoZmFjZXRQcm9qLmdldEZpeGVkUHJvamVjdEZhY2V0cygpKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmxleGlibGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vRmxleGlibGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1MzFkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0ZsZXhpYmxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUHJvamVjdFV0aWxpdGllczsKLQotLyoqCi0gKiBUaGlzIGhhcyBiZWVuIHNsYXRlZCBmb3IgcmVtb3ZhbCBwb3N0IFdUUCAxLjUuIERvIG5vdCB1c2UgdGhpcyBjbGFzcy9pbnRlcmZhY2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV7Ci0KLSAgICBwdWJsaWMgRmxleGlibGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcihtb2RlbCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCQkJY3JlYXRlUHJvamVjdChtb25pdG9yKTsKLQkJICAgIFdUUFByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0TGFzdChnZXRQcm9qZWN0KCksIElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0gICAgICAgIGNyZWF0ZUluaXRpYWxXVFBNb2R1bGVzRmlsZSgpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJRGF0YU1vZGVsIHByb2pNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKElGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX01PREVMX1BST0pFQ1RfQ1JFQVRJT04pOwotICAgICAgICBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gcHJvak1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLSAgICAgICAgb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUluaXRpYWxXVFBNb2R1bGVzRmlsZSgpIHsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0lBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL0lBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzM5MjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVFlQRV9JRCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfTkFNRSA9ICJJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPcHRpb25hbCwgc2hvdWxkIHNhdmUgd2l0aCBwcm9tcHQuLi5kZWZhdWx0cyB0byBmYWxzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01QVF9PTl9TQVZFID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST01QVF9PTl9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9QUk9KRUNUID0gIklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT01QT05FTlQgPSAiSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1Byb2plY3RNaWdyYXRvckRhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA3Mzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9vcGVyYXRpb24vUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuSUNvbXBvbmVudFByb2plY3RNaWdyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0TWlncmF0b3JEYXRhTW9kZWxPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgUHJvamVjdE1pZ3JhdG9yRGF0YU1vZGVsT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSVByb2plY3RNaWdyYXRvckRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSk7Ci0JCQlJQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yW10gbWlncmF0b3JzID0gUHJvamVjdE1pZ3JhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0TWlncmF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pZ3JhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlDb21wb25lbnRQcm9qZWN0TWlncmF0b3IgbWlncmF0b3IgPSBtaWdyYXRvcnNbaV07Ci0JCQkJbWlncmF0b3IubWlncmF0ZVByb2plY3QocHJvaik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2OWJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMobW9uaXRvcik7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7Ci0JCWlmICghc291cmNlQ29tcC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHJldHVybjsKLQkJCi0gICAgICAgIExpc3QgbW9kTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLSAgICAKLQkJTGlzdCB0YXJnZXRwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZExpc3QuZ2V0KGkpOwotCQkJaWYgKGNvbXA9PW51bGwgfHwgc291cmNlQ29tcD09bnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IHNvdXJjZUNvbXAuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKLQkJCWlmKCByZWYgIT0gbnVsbCAmJiByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwgJiYgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpKXsKLQkJCQlyZW1vdmVSZWZlcmVuZWNlSW5Db21wb25lbnQoc291cmNlQ29tcCwgcmVmKTsKLQkJCX1lbHNlIGlmKHJlZiAhPSBudWxsKXsKLQkJCQlpZiAoQXJyYXlzLmFzTGlzdChjb21wLmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpKS5jb250YWlucyhzb3VyY2VDb21wKSkgewotCQkJCQkKLQkJCQkJU3RyaW5nIGRlcGxveVBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIICk7Ci0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCggZGVwbG95UGF0aCApOwotCQkJCQkKLQkJCQkJaWYoIHJlZi5nZXRSdW50aW1lUGF0aCgpICE9IG51bGwgJiYgcGF0aCAhPSBudWxsICYmIHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyggcGF0aCApKXsKLQkJCQkJCXJlbW92ZVJlZmVyZW5lY2VJbkNvbXBvbmVudChzb3VyY2VDb21wLHNvdXJjZUNvbXAuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKSk7Ci0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gY29tcC5nZXRQcm9qZWN0KCk7Ci0JCQkJCQl0YXJnZXRwcm9qZWN0TGlzdC5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoc291cmNlQ29tcC5nZXRQcm9qZWN0KCksdGFyZ2V0cHJvamVjdExpc3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuZWNlSW5Db21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJKChWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudC5nZXRDb21wb25lbnQoKSkucmVtb3ZlUmVmZXJlbmNlKHJlZmVyZW5jZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL29wZXJhdGlvbi9SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZGJlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvb3BlcmF0aW9uL1JlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzEwYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotCi0vKioKLSAqIE1hcHMgcmVzb3VyY2VzIHRvIGNhY2hlZCBkYXRhIGFuZCByZW1lbWJlcnMgd2hlbiB0aGUgZGF0YSB3YXMgY2FjaGVkIGJhc2VkIG9uIGEgdGltZXN0YW1wCi0gKiBzaWduYXR1cmUgb2YgYSBnaXZlbiByZXNvdXJjZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBDT01QT05FTlRfTUFOSUZFU1RfUEFUSCA9IG5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBGQUNFVF9DT05GSUdfUEFUSCA9IG5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fREFUQSA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVJST1IgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCB0aW1lc3RhbXBzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIE1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotCi0JLyoqCi0JICogUmVjb3JkIGEgdGltZXN0YW1wIHNpZ25hdHVyZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIDxwPgotCSAqIENsaWVudHMgbWF5IHVzZSB7QGxpbmsgI2hhc0NoYW5nZWQoSVJlc291cmNlKX0gdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXNvdXJjZSBoYXMgY2hhbmdlZCBzaW5jZQotCSAqIGl0IHdhcyByZWNvcmRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCB3YXMgcHJvY2Vzc2VkLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVjb3JkaW5nIHdhcyBzdWNjZXNzZnVsbC4gVGhlIHJlY29yZGluZyBtYXkgZmFpbCBpZiB0aGUgcmVzb3VyY2UgZG9lcwotCSAqICAgICAgICAgbm90IGV4aXN0LgotCSAqIAotCSAqIEBzZWUgI2hhc0NoYW5nZWQoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXJrKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gbWFyayhyZXNvdXJjZSwgTk9fREFUQSk7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGRhdGEgdGhhdCB3YXMgZGV0ZXJtaW5lZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHJlc291cmNlLiBUaGUgYSB0aW1lc3RhbXAgc2lnbmF0dXJlCi0JICogd2lsbCBiZSByZWNvcmRlZCBmb3IgdGhlIHJlc291cmNlIGFzIHdlbGwuCi0JICogCi0JICogPHA+Ci0JICogQ2xpZW50cyBtYXkgdXNlIHtAbGluayAjaGFzQ2hhbmdlZChJUmVzb3VyY2UpfSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhY2hlZCBkYXRhIHNob3VsZCBiZQotCSAqIHJlcGxhY2VkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBwcm9jZXNzZWQuCi0JICogQHBhcmFtIGNhY2hlZERhdGEKLQkgKiAgICAgICAgICAgIFRoZSBkYXRhIHRoYXQgd2FzIGRldGVybWluZWQgd2hlbiB0aGUgUmVzb3VyY2Ugd2FzIHByb2Nlc3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlY29yZGluZyB3YXMgc3VjY2Vzc2Z1bGwuIFRoZSByZWNvcmRpbmcgbWF5IGZhaWwgaWYgdGhlIHJlc291cmNlIGRvZXMKLQkgKiAgICAgICAgIG5vdCBleGlzdC4KLQkgKiAKLQkgKiAKLQkgKiBAc2VlICNoYXNDaGFuZ2VkKElSZXNvdXJjZSkKLQkgKiBAc2VlICNoYXNDYWNoZURhdGEoSVJlc291cmNlKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXJrKElSZXNvdXJjZSByZXNvdXJjZSwgT2JqZWN0IGNhY2hlZERhdGEpIHsKLQotCQlpZiAocmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgewotCQkJaWYgKHRpbWVzdGFtcHMuY29udGFpbnNLZXkocmVzb3VyY2UpKSB7Ci0JCQkJVGltZXN0YW1wU2lnbmF0dXJlIHNpZ25hdHVyZSA9IChUaW1lc3RhbXBTaWduYXR1cmUpIHRpbWVzdGFtcHMuZ2V0KHJlc291cmNlKTsKLQkJCQlzaWduYXR1cmUudXBkYXRlKHJlc291cmNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGltZXN0YW1wcy5wdXQocmVzb3VyY2UsIGNyZWF0ZVRpbWVzdGFtcFNpZ25hdHVyZShyZXNvdXJjZSkpOwotCQkJfQotCQkJZGF0YS5wdXQocmVzb3VyY2UsIGNhY2hlZERhdGEpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE5vdGUgdGhhdCBhbiBlcnJvciBvY2N1cnJlZCB3aGVuIHByb2Nlc3NpbmcgdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IGhhZCBzb21lIHNvcnQgb2YgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZy4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVycm9yIHdhcyByZWNvcmRlZC4gVGhlIGVycm9yIG1heSBub3QgYmUgcmVjb3JkZWQgaWYgdGhlIHJlc291cmNlIGRvZXMKLQkgKiAgICAgICAgIG5vdCBleGlzdC4KLQkgKiBAc2VlICNoYXNDYWNoZUVycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWFya0Vycm9yKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0JCWlmIChyZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQlpZiAodGltZXN0YW1wcy5jb250YWluc0tleShyZXNvdXJjZSkpIHsKLQkJCQlUaW1lc3RhbXBTaWduYXR1cmUgc2lnbmF0dXJlID0gKFRpbWVzdGFtcFNpZ25hdHVyZSkgdGltZXN0YW1wcy5nZXQocmVzb3VyY2UpOwotCQkJCXNpZ25hdHVyZS51cGRhdGUocmVzb3VyY2UpOwotCQkJfSBlbHNlIHsKLQkJCQl0aW1lc3RhbXBzLnB1dChyZXNvdXJjZSwgY3JlYXRlVGltZXN0YW1wU2lnbmF0dXJlKHJlc291cmNlKSk7Ci0JCQl9Ci0JCQlkYXRhLnB1dChyZXNvdXJjZSwgRVJST1IpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlIHRoYXQgd2FzIG9yIGlzIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGhhcyBjaGFuZ2VkIGluIGEgbm90aWNlYWJsZSB3YXkgc2luY2UgaXQgd2FzIG1hcmtlZC4KLQkgKiAKLQkgKiBAc2VlICNtYXJrKElSZXNvdXJjZSkKLQkgKiBAc2VlICNtYXJrKElSZXNvdXJjZSwgT2JqZWN0KQotCSAqIEBzZWUgI21hcmtFcnJvcihJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVGltZXN0YW1wU2lnbmF0dXJlIHNpZ25hdHVyZSA9IChUaW1lc3RhbXBTaWduYXR1cmUpIHRpbWVzdGFtcHMuZ2V0KHJlc291cmNlKTsKLQkJcmV0dXJuIHNpZ25hdHVyZSA9PSBudWxsIHx8IHNpZ25hdHVyZS5oYXNDaGFuZ2VkKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSB0aGF0IHdhcyBvciBpcyBhYm91dCB0byBiZSBwcm9jZXNzZWQuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFueSBkYXRhIGNhY2hlZCBmb3IgdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlKQotCSAqIEBzZWUgI21hcmsoSVJlc291cmNlLCBPYmplY3QpCi0JICogQHNlZSAjbWFya0Vycm9yKElSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZURhdGEoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU9iamVjdCBkYXR1bSA9IGRhdGEuZ2V0KHJlc291cmNlKTsKLQkJcmV0dXJuIGRhdHVtICE9IG51bGwgJiYgZGF0dW0gIT0gTk9fREFUQTsKLQotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UgdGhhdCB3YXMgb3IgaXMgYWJvdXQgdG8gYmUgcHJvY2Vzc2VkLgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhbnkgZGF0YSBjYWNoZWQgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAc2VlICNtYXJrKElSZXNvdXJjZSkKLQkgKiBAc2VlICNtYXJrKElSZXNvdXJjZSwgT2JqZWN0KQotCSAqIEBzZWUgI21hcmtFcnJvcihJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVFcnJvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0KHJlc291cmNlKSA9PSBFUlJPUjsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU9iamVjdCBkYXR1bSA9IGRhdGEuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGRhdHVtICE9IE5PX0RBVEEpCi0JCQlyZXR1cm4gZGF0dW07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBUaW1lc3RhbXBTaWduYXR1cmUgY3JlYXRlVGltZXN0YW1wU2lnbmF0dXJlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJcmV0dXJuIG5ldyBQcm9qZWN0VGltZXN0YW1wKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVSZXNvdXJjZVRpbWVzdGFtcChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHBvaW50IGluIHRpbWUgc2lnbmF0dXJlIG9mIGEgUmVzb3VyY2UgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhhdCByZXNvdXJjZSBoYXMKLQkgKiBjaGFuZ2VkIGluIGEgbWVhbmluZ2Z1bCB3YXkgc2luY2UgdGhlIHRpbWUgdGhpcyBzaWduYXR1cmUgd2FzIGNyZWF0ZWQgb3IgbGFzdCB1cGRhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVGltZXN0YW1wU2lnbmF0dXJlIHsKLQotCQkvKioKLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZQotCQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgcmVsYXRlZCB0byB0aGlzIHNpZ25hdHVyZQotCQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGN1cnJlbnQgcmVzb3VyY2UgaXMgZGlmZmVyZW50IGZyb20gdGhpcyBzaWduYXR1cmUgaW4gYSBtZWFuaW5nZnVsIHdheQotCQkgKi8KLQkJYm9vbGVhbiBoYXNDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkJICogICAgICAgICAgICBVcGRhdGUgdGhlIHNpZ25hdHVyZSBkZXRhaWxzIHRvIHRoZSBnaXZlbiByZXNvdXJjZSdzIHNpZ25hdHVyZS4KLQkJICovCi0JCXZvaWQgdXBkYXRlKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgbW9kaWZpY2F0aW9uU3RhbXAgb2YgYSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVzb3VyY2VUaW1lc3RhbXAgaW1wbGVtZW50cyBUaW1lc3RhbXBTaWduYXR1cmUgewotCQlwcml2YXRlIGxvbmcgdGltZXN0YW1wID0gMDsKLQotCQlwdWJsaWMgU2ltcGxlUmVzb3VyY2VUaW1lc3RhbXAoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQl1cGRhdGUocmVzb3VyY2UpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXJldHVybiB0aW1lc3RhbXAgIT0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXRpbWVzdGFtcCA9IHJlc291cmNlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHNpZ25hdHVyZSBmb3IgYSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb25TdGFtcCBvZiB0aGUgKDEpIHByb2plY3QsICgyKSB0aGUKLQkgKiBjb21wb25lbnQgbWFuaWZlc3QsIGFuZCAoMykgdGhlIGZhY2V0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUHJvamVjdFRpbWVzdGFtcCBpbXBsZW1lbnRzIFRpbWVzdGFtcFNpZ25hdHVyZSB7Ci0KLQkJcHJpdmF0ZSBsb25nIHByb2plY3RUaW1lc3RhbXAgPSAwOwotCQlwcml2YXRlIGxvbmcgY29tcG9uZW50TWFuaWZlc3RUaW1lc3RhbXAgPSAwOwotCQlwcml2YXRlIGxvbmcgZmFjZXRDb25maWdUaW1lc3RhbXAgPSAwOwotCi0JCXB1YmxpYyBQcm9qZWN0VGltZXN0YW1wKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXVwZGF0ZShwcm9qZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoYW5nZWQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJaWYgKHByb2plY3RUaW1lc3RhbXAgIT0gcHJvamVjdC5nZXRNb2RpZmljYXRpb25TdGFtcCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoQ09NUE9ORU5UX01BTklGRVNUX1BBVEgpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSB8fCBjb21wb25lbnRNYW5pZmVzdFRpbWVzdGFtcCAhPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJZmlsZSA9IHByb2plY3QuZ2V0RmlsZShGQUNFVF9DT05GSUdfUEFUSCk7Ci0JCQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8IGZhY2V0Q29uZmlnVGltZXN0YW1wICE9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0KLQkJCQlwcm9qZWN0VGltZXN0YW1wID0gcHJvamVjdC5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShDT01QT05FTlRfTUFOSUZFU1RfUEFUSCk7Ci0JCQkJY29tcG9uZW50TWFuaWZlc3RUaW1lc3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJCQlmaWxlID0gcHJvamVjdC5nZXRGaWxlKEZBQ0VUX0NPTkZJR19QQVRIKTsKLQkJCQlmYWNldENvbmZpZ1RpbWVzdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0VGltZXN0YW1wID0gY29tcG9uZW50TWFuaWZlc3RUaW1lc3RhbXAgPSBmYWNldENvbmZpZ1RpbWVzdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQkJfQotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEFyY2hpdmVDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbEFyY2hpdmVDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNmQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5IYXNoVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgaW1wbGVtZW50cyBJVmlydHVhbENvbXBvbmVudCwgSUFkYXB0YWJsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmNsYXNzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQkFSQ0hJVkVUWVBFID0gImxpYiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSQVJDSElWRVRZUEUgPSAidmFyIjsKLQkvKioKLQkgKiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB0eXBlIGZvciBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudHMgdGhhdCByZXByZXNlbnQgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIQVJDSElWRVRZUEUgPSAiY3BlIjsgLy8kTk9OLU5MUy0xCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBOT19SRUZFUkVOQ0VTID0gbmV3IFZpcnR1YWxSZWZlcmVuY2VbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVZpcnR1YWxDb21wb25lbnRbXSBOT19DT01QT05FTlRTID0gbmV3IFZpcnR1YWxDb21wb25lbnRbMF07Ci0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUmVzb3VyY2VbXSBOT19SRVNPVVJDRVMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElWaXJ0dWFsUmVzb3VyY2VbXSBOT19WSVJUVUFMX1JFU09VUkNFUyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllcyBOT19QUk9QRVJUSUVTID0gbmV3IFByb3BlcnRpZXMoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aFtdIE5PX1BBVEhTID0gbmV3IFBhdGhbMF07Ci0KLS8vCXByaXZhdGUgSVBhdGggcnVudGltZVBhdGg7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjb21wb25lbnRQcm9qZWN0OwotLy8JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciByb290Rm9sZGVyOwotCXByaXZhdGUgaW50IGZsYWcgPSAxOwotLy8JcHJpdmF0ZSBTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uOwotCi0KLQlwcml2YXRlIElQYXRoIGFyY2hpdmVQYXRoOwotCXByaXZhdGUgU3RyaW5nIGFyY2hpdmVUeXBlOwotCi0KLQotCXB1YmxpYyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCxTdHJpbmcgYXJjaGl2ZUxvY2F0aW9uLCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJaWYoYUNvbXBvbmVudFByb2plY3QgPT0gbnVsbCl7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQljb21wb25lbnRQcm9qZWN0ID0gYUNvbXBvbmVudFByb2plY3Q7Ci0vLwkJcnVudGltZVBhdGggPSBhUnVudGltZVBhdGg7Ci0KLQkJU3RyaW5nIGFyY2hpdmVQYXRoU3RyaW5nID0gYXJjaGl2ZUxvY2F0aW9uLnN1YnN0cmluZyg0LCBhcmNoaXZlTG9jYXRpb24ubGVuZ3RoKCkpOwotCQlhcmNoaXZlVHlwZQk9IGFyY2hpdmVMb2NhdGlvbi5zdWJzdHJpbmcoMCwgYXJjaGl2ZUxvY2F0aW9uLmxlbmd0aCgpIC0gYXJjaGl2ZVBhdGhTdHJpbmcubGVuZ3RoKCkgLTEpOwotCQlhcmNoaXZlUGF0aCA9IG5ldyAgUGF0aChhcmNoaXZlUGF0aFN0cmluZyk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hcmNoaXZlVHlwZSArIElQYXRoLlNFUEFSQVRPUiArIHRoaXMuYXJjaGl2ZVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3llZE5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZUlkKFN0cmluZyBhQ29tcG9uZW50VHlwZUlkKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKLQkJYm9vbGVhbiByZXQgPSAoZmxhZyAmIEJJTkFSWSkgPT0gMSA/IHRydWUgOiBmYWxzZTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBnZXRNZXRhUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gTk9fUEFUSFM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YVJlc291cmNlcyhJUGF0aFtdIHRoZU1ldGFSZXNvdXJjZVBhdGhzKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIGFyY2hpdmVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlpZiggYXJjaGl2ZVBhdGguc2VnbWVudENvdW50KCkgPiAxICl7Ci0JCQlJRmlsZSBhRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShhcmNoaXZlUGF0aCk7Ci0JCQlpZiAoYUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGFGaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlGaWxlIGFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpKTsKLQkJaWYgKGFGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIFJPT1Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NpYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRNZXRhUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIE5PX1BST1BFUlRJRVM7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoU3RyaW5nIGFSZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIE5PX1ZJUlRVQUxfUkVTT1VSQ0VTOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCX0KLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBOT19SRUZFUkVOQ0VTOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSB0aGVSZWZlcmVuY2VzKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCS8vIG5vIG9wCi0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBnZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJaWYoIGRpc2tGaWxlICE9IG51bGwgKQotCQkJZXhpc3RzID0gZGlza0ZpbGUuZXhpc3RzKCk7Ci0JCQotCQlpZiggIWV4aXN0cyApewotCQkJSUZpbGUgdXRpbGl0eUphciA9IGdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQlpZiggdXRpbGl0eUphciAhPSBudWxsICkKLQkJCQlleGlzdHMgPSAgdXRpbGl0eUphci5leGlzdHMoKTsKLQkJfQotCQlyZXR1cm4gZXhpc3RzOwotCX0KLQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKSB7Ci0JCXJldHVybiBOT19DT01QT05FTlRTOwotCX0KLQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZVR5cGUoKSB7Ci0JCXJldHVybiBhcmNoaXZlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IEhhc2hVdGlsLlNFRUQ7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBpc0JpbmFyeSgpKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PdGhlcikgewotCQlpZiAoYW5PdGhlciBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBvdGhlckNvbXBvbmVudCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgYW5PdGhlcjsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZXF1YWxzKG90aGVyQ29tcG9uZW50LmdldFByb2plY3QoKSkgJiYgCi0JCQkJCWdldE5hbWUoKS5lcXVhbHMob3RoZXJDb21wb25lbnQuZ2V0TmFtZSgpKSAmJiAKLQkJCQkJaXNCaW5hcnkoKSA9PSBvdGhlckNvbXBvbmVudC5pc0JpbmFyeSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0KLQl9Ci0JcHVibGljIElGaWxlIGdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCkgewotCQlpZiAoZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk9PW51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCkgewotCQlTdHJpbmcgb3NQYXRoID0gbnVsbDsKLQkJSVBhdGggbG9jID0gbnVsbDsKLQkJaWYgKGdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFKSkgewotCQkJT2JqZWN0IGFkYXB0ZWQgPSBnZXRBZGFwdGVyKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkFEQVBURVJfVFlQRSk7Ci0JCQlpZiAoYWRhcHRlZCBpbnN0YW5jZW9mIElQYXRoKSB7Ci0JCQkJSVBhdGggcmVzb2x2ZWRwYXRoID0gKElQYXRoKSBhZGFwdGVkOwotCQkJCW9zUGF0aCA9IHJlc29sdmVkcGF0aC50b09TU3RyaW5nKCk7Ci0JCQl9IAotCQl9IGVsc2UgaWYoIWFyY2hpdmVQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKGFyY2hpdmVQYXRoKTsKLQkJCWlmKGZpbGUuZXhpc3RzKCkpCi0JCQkJbG9jICA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCWVsc2UgewotCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYXJjaGl2ZVBhdGgpOwotCQkJCWlmKGZpbGUuZXhpc3RzKCkpCi0JCQkJCWxvYyA9IGZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCS8vIHRoaXMgaXMgYSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtCi0JCQlpZihsb2MgIT0gbnVsbCkgIAotCQkJCW9zUGF0aCA9IGxvYy50b09TU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvc1BhdGggPSBhcmNoaXZlUGF0aC50b09TU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKG9zUGF0aD09bnVsbCB8fCBvc1BhdGgubGVuZ3RoKCk9PTApCi0JCQlyZXR1cm4gbnVsbDsKLQkJRmlsZSBkaXNrRmlsZSA9IG5ldyBGaWxlKG9zUGF0aCk7Ci0JCXJldHVybiBkaXNrRmlsZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYoYXJjaGl2ZVBhdGggIT0gbnVsbCl7Ci0JCQlyZXR1cm4gY29tcG9uZW50UHJvamVjdCArICIgIiArYXJjaGl2ZVBhdGg7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NmMxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5IYXNoVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgVmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElWaXJ0dWFsQ29tcG9uZW50IHsKLQlJUGF0aAkJCXJ1bnRpbWVQYXRoOwotCUlQcm9qZWN0CWNvbXBvbmVudFByb2plY3Q7Ci0JSVZpcnR1YWxGb2xkZXIJcm9vdEZvbGRlcjsKLQlTdHJpbmcgY29tcG9uZW50VHlwZUlkOwotCXByaXZhdGUgaW50IGZsYWcgPSAwOwotCQotCi0JcHJvdGVjdGVkIFZpcnR1YWxDb21wb25lbnQoKXsKLQl9Ci0JCi0JcHVibGljIFZpcnR1YWxDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlpZihhUHJvamVjdCA9PSBudWxsKXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWNvbXBvbmVudFByb2plY3QgPSBhUHJvamVjdDsKLQkJcnVudGltZVBhdGggPSBhUnVudGltZVBhdGg7Ci0JCXJvb3RGb2xkZXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihjb21wb25lbnRQcm9qZWN0LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3llZE5hbWUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQkJaWYoY29yZSAhPSBudWxsICYmIGNvcmUuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCl7Ci0JCQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJCQlpZiAoY29tcG9uZW50LmdldE5hbWUoKSE9bnVsbCAmJiBjb21wb25lbnQuZ2V0TmFtZSgpLmxlbmd0aCgpPjApCi0JCQkJCQlyZXR1cm4gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsgCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE1ldGFQcm9wZXJ0aWVzKCkgewotICAgICAgICBTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpZiAoY29yZSA9PSBudWxsKQotICAgICAgICAgICAgCXJldHVybiBwcm9wczsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOyAKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkgcmV0dXJuIHByb3BzOwotICAgICAgICAgICAgTGlzdCBwcm9wTGlzdCA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZihwcm9wTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIAlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSlwcm9wTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyBuYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIAlTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIAlpZih2YWx1ZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAJCVN0cmluZyBtZXNzYWdlID0gIldBUk5JTkc6ICBUaGUgY29tcG9uZW50IGZpbGUgaW4gIitnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKyIgaGFzIG5vIHZhbHVlIGRlZmluZWQgZm9yIHRoZSBwcm9wZXJ0eTogIituYW1lOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAJCU1vZHVsZWNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIG51bGwpOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvcHM7IAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvcmUuZGlzcG9zZSgpOwotICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOyAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBwcm9wTGlzdCA9IGNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkgewotCQkgICAgICAgIGZvcihFbnVtZXJhdGlvbiBpdHIgPSBwcm9wZXJ0aWVzLmtleXMoKTsgaXRyLmhhc01vcmVFbGVtZW50cygpOykgewotCQkgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRyLm5leHRFbGVtZW50KCk7Ci0JCSAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5IHByb3AgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJICAgICAgICAgICAgcHJvcC5zZXROYW1lKGtleSk7Ci0JCSAgICAgICAgICAgIHByb3Auc2V0VmFsdWUocHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHByb3BlcnR5IGZpcnN0Ci0JCSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcm9wTGlzdC5zaXplKCk7IGkrKykgewotCQkgICAgICAgICAgICAJUHJvcGVydHkgZXhpc3RpbmcgPSAoUHJvcGVydHkpIHByb3BMaXN0LmdldChpKTsKLQkJICAgICAgICAgICAgCWlmIChleGlzdGluZy5nZXROYW1lKCkuZXF1YWxzKGtleSkpIHsKLQkJICAgICAgICAgICAgCQlwcm9wTGlzdC5yZW1vdmUoZXhpc3RpbmcpOwotCQkgICAgICAgICAgICAJCWJyZWFrOwotCQkgICAgICAgICAgICAJfQotCQkgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIC8vIEFkZCBuZXcgcHJvcGVydHkKLQkJICAgICAgICAgICAgcHJvcExpc3QuYWRkKHByb3ApOwotCQkgICAgICAgICB9Ci0JCQl9IAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhck1ldGFQcm9wZXJ0aWVzKCkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsgCi0gICAgICAgICAgICBjb21wb25lbnQuZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZihjb3JlICE9IG51bGwpewotICAgICAgICAgICAgCWNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotICAgICAgICAgICAgICAgIGNvcmUuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGFQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0gICAgICAgICAgICAvL1JlbW92ZSBleGlzdGluZyBwcm9wZXJ0eSBmaXJzdAotICAgICAgICAgICAgTGlzdCBwcm9wZXJ0aWVzID0gY29tcG9uZW50LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAJUHJvcGVydHkgZXhpc3RpbmcgPSAoUHJvcGVydHkpIHByb3BlcnRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgCWlmIChleGlzdGluZy5nZXROYW1lKCkuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgIAkJcHJvcGVydGllcy5yZW1vdmUoZXhpc3RpbmcpOwotICAgICAgICAgICAgCQlicmVhazsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAkvL1NldCBuZXcgcHJvcGVydHkKLSAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5IHByb3AgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3Auc2V0TmFtZShrZXkpOwotCQkJcHJvcC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQljb21wb25lbnQuZ2V0UHJvcGVydGllcygpLmFkZChwcm9wKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29yZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLSAgICAgICAgICAgICAgICBjb3JlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQkKLQlwdWJsaWMgSVBhdGhbXSBnZXRNZXRhUmVzb3VyY2VzKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlMaXN0IG1ldGFSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQkJbWV0YVJlc291cmNlcy5hZGRBbGwoY29tcG9uZW50LmdldE1ldGFkYXRhUmVzb3VyY2VzKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVBhdGhbXSkgbWV0YVJlc291cmNlcy50b0FycmF5KG5ldyBJUGF0aFttZXRhUmVzb3VyY2VzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFSZXNvdXJjZXMoSVBhdGhbXSB0aGVNZXRhUmVzb3VyY2VQYXRocykgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGk9MDsgaTx0aGVNZXRhUmVzb3VyY2VQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWNvbXBvbmVudC5nZXRNZXRhZGF0YVJlc291cmNlcygpLmNvbnRhaW5zKHRoZU1ldGFSZXNvdXJjZVBhdGhzW2ldKSkKLQkJCQkJCWNvbXBvbmVudC5nZXRNZXRhZGF0YVJlc291cmNlcygpLmFkZCh0aGVNZXRhUmVzb3VyY2VQYXRoc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElWaXJ0dWFsUmVzb3VyY2UuQ09NUE9ORU5UOwotCX0KLQkKLQotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCl7Ci0JCWJvb2xlYW4gcmV0ID0gIChmbGFnICYgQklOQVJZKSA9PSAxICA/IHRydWUgOmZhbHNlOwotCQlyZXR1cm4gcmV0OwkJCi0JfQkKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBtb2R1bGVDb3JlCi0JCQkJCS5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb21wb25lbnQgPSBtb2R1bGVDb3JlCi0JCQkJCQkuY3JlYXRlV29ya2JlbmNoTW9kdWxlKGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQkKLQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7IAotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGNvcmUhPW51bGwgJiYgY29yZS5nZXRDb21wb25lbnQoKSE9bnVsbCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQhPW51bGwpIHsKLQkJCQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50PT1udWxsKSAKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWZlcmVuY2UgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UodGhpcywgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJCQlpZiggdlJlZmVyZW5jZSAhPSBudWxsICl7Ci0JCQkJCQkJdlJlZmVyZW5jZS5zZXRBcmNoaXZlTmFtZSggcmVmZXJlbmNlZENvbXBvbmVudC5nZXRBcmNoaXZlTmFtZSgpICk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodlJlZmVyZW5jZSAhPSBudWxsICYmIHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpICE9IG51bGwgJiYgdlJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXhpc3RzKCkpCi0JCQkJCQkJcmVmZXJlbmNlcy5hZGQodlJlZmVyZW5jZSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSByZWZlcmVuY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpCi0JCQkJY29yZS5kaXNwb3NlKCk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCWlmIChyZWZlcmVuY2VzPT1udWxsIHx8IHJlZmVyZW5jZXMubGVuZ3RoPT0wKQotCQkJcmV0dXJuOwotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gbnVsbDsKLQkJCUNvbXBvbmVudGNvcmVGYWN0b3J5IGZhY3RvcnkgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlZmVyZW5jZXNbaV0gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcmVmZXJlbmNlZENvbXBvbmVudCA9IGZhY3RvcnkuY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpOwkJCQkKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlLmdldChyZWZlcmVuY2VzW2ldLmdldERlcGVuZGVuY3lUeXBlKCkpKTsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldFJ1bnRpbWVQYXRoKHJlZmVyZW5jZXNbaV0uZ2V0UnVudGltZVBhdGgoKSk7Ci0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gcmVmZXJlbmNlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYoY29tcCE9bnVsbCAmJiAhY29tcC5pc0JpbmFyeSgpKQotCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShjb21wLmdldFByb2plY3QoKSkpOwotCQkJCWVsc2UgaWYgKGNvbXAhPW51bGwpCi0JCQkJCXJlZmVyZW5jZWRDb21wb25lbnQuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShjb21wLmdldE5hbWUoKSkpOwotCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLQkJCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuYWRkKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQuc2V0QXJjaGl2ZU5hbWUocmVmZXJlbmNlc1tpXS5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCX0KLQkJCS8vY2xlYW4gdXAgYW55IG9sZCBvYnNvbGV0ZSByZWZlcmVuY2VzCi0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwpewotCQkJCWNsZWFuVXBSZWZlcmVuY2VzKGNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXBSZWZlcmVuY2VzKFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50PT1udWxsKSAKLQkJCQljb250aW51ZTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWZlcmVuY2UgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UodGhpcywgcmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQlpZiAodlJlZmVyZW5jZSA9PSBudWxsIHx8IHZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpID09IG51bGwgfHwgIXZSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmV4aXN0cygpKXsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7IAotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKLQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IG51bGw7Ci0JCQkgIAotCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkuY2xlYXIoKTsKLQkJCUNvbXBvbmVudGNvcmVGYWN0b3J5IGZhY3RvcnkgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVmZXJlbmNlZENvbXBvbmVudCA9IGZhY3RvcnkuY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudCgpOwkJCQkKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldERlcGVuZGVuY3lUeXBlKERlcGVuZGVuY3lUeXBlLmdldChyZWZlcmVuY2VzW2ldLmdldERlcGVuZGVuY3lUeXBlKCkpKTsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50LnNldFJ1bnRpbWVQYXRoKHJlZmVyZW5jZXNbaV0uZ2V0UnVudGltZVBhdGgoKSk7Ci0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gcmVmZXJlbmNlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYoICFjb21wLmlzQmluYXJ5KCkpCi0JCQkJCXJlZmVyZW5jZWRDb21wb25lbnQuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKSkpOwotCQkJCWVsc2UKLQkJCQkJcmVmZXJlbmNlZENvbXBvbmVudC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKSkpOwotCQkJCQotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQuc2V0QXJjaGl2ZU5hbWUocmVmZXJlbmNlc1tpXS5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCQljb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQl9Ci0JCQkgCi0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQkKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IEhhc2hVdGlsLlNFRUQ7Ci0JCWhhc2ggPSBIYXNoVXRpbC5oYXNoKGhhc2gsIGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBnZXROYW1lKCkpOwotCQloYXNoID0gSGFzaFV0aWwuaGFzaChoYXNoLCBpc0JpbmFyeSgpKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5PdGhlcikgeyAKLQkJaWYoYW5PdGhlciBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBvdGhlckNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgYW5PdGhlcjsKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZXF1YWxzKG90aGVyQ29tcG9uZW50LmdldFByb2plY3QoKSkgJiYgCi0JCQkJICAgZ2V0TmFtZSgpLmVxdWFscyhvdGhlckNvbXBvbmVudC5nZXROYW1lKCkpICYmIAotCQkJCSAgIGlzQmluYXJ5KCkgPT0gb3RoZXJDb21wb25lbnQuaXNCaW5hcnkoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlpZiggcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSAhPSBudWxsICl7Ci0JCQkJaWYgKHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhhQ29tcG9uZW50TmFtZSkpCi0JCQkJCXJldHVybiByZWZlcmVuY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXIgZ2V0Um9vdEZvbGRlcigpIHsKLQkJcmV0dXJuIHJvb3RGb2xkZXI7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcGFzc2VkIGluIHRhcmdldCBjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4gYXJyYXkgb2YgY29tcG9uZW50cwotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpIHsKLQkJSVByb2plY3RbXSBoYW5kbGVzID0gIERlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmN5R3JhcGgoKS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoZ2V0UHJvamVjdCgpKTsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSByZXN1bHQgPSBuZXcgSVZpcnR1YWxDb21wb25lbnRbaGFuZGxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7IGk8aGFuZGxlcy5sZW5ndGg7IGkrKykKLQkJCXJlc3VsdFtpXSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGhhbmRsZXNbaV0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFzc29jaWF0ZWQgUmVmZXJlbmNlZENvbXBvbmVudCBmb3IgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGZyb20gdGhlIHdvcmtiZW5jaCBjb21wb25lbnQgCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlydHVhbCBjb21wb25lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZShJVmlydHVhbFJlZmVyZW5jZSBhUmVmZXJlbmNlKSB7Ci0JCVN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChjb3JlID09IG51bGwgfHwgYVJlZmVyZW5jZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZDb21wb25lbnQgPSBnZXRXb3JrYmVuY2hSZWZlcmVuY2VkQ29tcG9uZW50KGFSZWZlcmVuY2UsIGNvbXBvbmVudCk7Ci0JCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgcmVmQ29tcG9uZW50ICE9IG51bGwpCi0JCQkJY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCkucmVtb3ZlKHJlZkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihjb3JlICE9IG51bGwpIHsKLQkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHN0cnVjdHVyZSBlZGl0IFJlZmVyZW5jZWRDb21wb25lbnQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gSVZpcnR1YWxSZWZlcmVuY2UgYmFzZWQgb24gdGhlIGhhbmRsZQotCSAqIGFuZCBtb2R1bGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhUmVmZXJlbmNlCi0JICogQHBhcmFtIGNvcmUKLQkgKiBAcmV0dXJuIFJlZmVyZW5jZWRDb21wb25lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlZENvbXBvbmVudCBnZXRXb3JrYmVuY2hSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsUmVmZXJlbmNlIGFSZWZlcmVuY2UsIFdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKGFSZWZlcmVuY2UgPT0gbnVsbCB8fCBhUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSA9PSBudWxsIHx8IGNvbXBvbmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgcmVmZXJlbmNlZENvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHJlZmVyZW5jZWRDb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZiA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50cy5nZXQoaSk7Ci0JCQlpZiAoIWFSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKLQkJCQlpZiAocmVmLmdldEhhbmRsZSgpLmVxdWFscyhNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKSkKLQkJCQkJcmV0dXJuIHJlZjsJCi0JCQl9IAotCQkJZWxzZSB7Ci0JCQkJaWYgKHJlZi5nZXRIYW5kbGUoKS5lcXVhbHMoTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKGFSZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKSkpKQotCQkJCQlyZXR1cm4gcmVmOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHJldHVybiBJVmlydHVhbFJlZmVyZW5jZVtdIC0gQWxsIHRoZSByZWZlcmVuY2VzIG9mIHRoaXMgY29tcG9uZW50LCBpbmNsdWRpbmcgcG90ZW50aWFsbHkgZGVsZXRlZCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0QWxsUmVmZXJlbmNlcygpIHsgCi0JCVN0cnVjdHVyZUVkaXQgY29yZSA9IG51bGw7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSE9bnVsbCAmJiBjb3JlLmdldENvbXBvbmVudCgpIT1udWxsKSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXBvbmVudCE9bnVsbCkgewotCQkJCQlMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQ9PW51bGwpIAotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdlJlZmVyZW5jZSA9IFN0cnVjdHVyZUVkaXQuY3JlYXRlVmlydHVhbFJlZmVyZW5jZSh0aGlzLCByZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCWlmKCB2UmVmZXJlbmNlICE9IG51bGwgKXsKLQkJCQkJCQl2UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEFyY2hpdmVOYW1lKCkgKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh2UmVmZXJlbmNlICE9IG51bGwgJiYgdlJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgIT0gbnVsbCkKLQkJCQkJCQlyZWZlcmVuY2VzLmFkZCh2UmVmZXJlbmNlKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVmZXJlbmNlcy5zaXplKCldKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKGNvcmUgIT0gbnVsbCkKLQkJCQljb3JlLmRpc3Bvc2UoKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNGYxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXJ0dWFsQ29udGFpbmVyIGV4dGVuZHMgVmlydHVhbFJlc291cmNlIGltcGxlbWVudHMgSVZpcnR1YWxDb250YWluZXIgewotCi0KLQlwdWJsaWMgVmlydHVhbENvbnRhaW5lcihJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7Ci0JCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCX0KLQotCS8vIFRPRE8gV1RQOkltcGxlbWVudCB0aGlzIG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI2ZpbmRNZW1iZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBhQ2hpbGROYW1lKSB7Ci0JCXJldHVybiBmaW5kTWVtYmVyKG5ldyBQYXRoKGFDaGlsZE5hbWUpLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjZmluZE1lbWJlcihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlIGZpbmRNZW1iZXIoU3RyaW5nIGFDaGlsZE5hbWUsIGludCBzZWFyY2hGbGFncykgewotCQlyZXR1cm4gZmluZE1lbWJlcihuZXcgUGF0aChhQ2hpbGROYW1lKSwgc2VhcmNoRmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNmaW5kTWVtYmVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIGFDaGlsZFBhdGgpIHsKLQkJcmV0dXJuIGZpbmRNZW1iZXIoYUNoaWxkUGF0aCwgMCk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBhUGF0aCwgaW50IHRoZVNlYXJjaEZsYWdzKSB7Ci0KLQkJU3RydWN0dXJlRWRpdCBzdHJ1Y3R1cmVFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQotCQkJc3RydWN0dXJlRWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBzdHJ1Y3R1cmVFZGl0LmdldENvbXBvbmVudCgpOwotCQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQkJUmVzb3VyY2VUcmVlUm9vdCByb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXREZXBsb3lSZXNvdXJjZVRyZWVSb290KGNvbXBvbmVudCk7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSByb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSByZXNvdXJjZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcm9vdCwgbm90IGFueSBvZiB0aGUgY2hpbGRyZW4gaWYgaXRzIGEgZm9sZGVyCi0JCQkJCWlmIChyZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpKSkgewotCQkJCQkJSVJlc291cmNlIHBsYXRmb3JtUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihyZXNvdXJjZXNbaV0uZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCWlmIChwbGF0Zm9ybVJlc291cmNlID09IG51bGwpCi0JCQkJCQkJcGxhdGZvcm1SZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZXNbaV0uZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCWlmIChwbGF0Zm9ybVJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlzd2l0Y2ggKHBsYXRmb3JtUmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQkJCQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpKTsKLQkJCQkJCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCQkJCQlyZXR1cm4gbmV3IFZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoYVBhdGgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RydWN0dXJlRWRpdCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZUVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGaWxlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoSVBhdGggYVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGFQYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihJUGF0aCBhUGF0aCkgewotCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChhUGF0aCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciNnZXRGaWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElWaXJ0dWFsRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbEZpbGUoZ2V0UHJvamVjdCgpLCBnZXRSdW50aW1lUGF0aCgpLmFwcGVuZChuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyI2dldEZvbGRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRhaW5lciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZW1iZXJzKElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyhib29sZWFuIGluY2x1ZGVQaGFudG9tcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbWVtYmVycyhpbmNsdWRlUGhhbnRvbXMgPyBJR05PUkVfRVhDTFVTSU9OUyA6IElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycyhpbnQpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0IHZpcnR1YWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHJlc3VsdAotCQlTZXQgYWxsTmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBJZ25vcmUgYWxsIG1ldGEgZGF0YSBwYXRocyBpbiB0aGUgdmlydHVhbCBjb250YWluZXIgcmVzb3VyY2Ugc2V0Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudCgpOwotCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCSAgICByZXR1cm4gbmV3IElWaXJ0dWFsUmVzb3VyY2VbMF07Ci0JCUlQYXRoW10gbWV0YVBhdGhzID0gY29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUobWV0YVBhdGhzW2ldKTsKLQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkKLQkJCQlhbGxOYW1lcy5hZGQobG9jYWxOYW1lKTsKLQkJfQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAod2JDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSByb290LmZpbmRNb2R1bGVSZXNvdXJjZXMoZ2V0UnVudGltZVBhdGgoKSwgUmVzb3VyY2VUcmVlTm9kZS5DUkVBVEVfTk9ORSk7Ci0JCQkJLy8gY29tcG9uZW50UmVzb3VyY2VzID0gb3JkZXJSZXNvdXJjZXNCeUZvbGRlcihjb21wb25lbnRSZXNvdXJjZXMpOwotCi0JCQkJZm9yIChpbnQgY29tcG9uZW50UmVzb3VyY2VJbmRleCA9IDA7IGNvbXBvbmVudFJlc291cmNlSW5kZXggPCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoOyBjb21wb25lbnRSZXNvdXJjZUluZGV4KyspIHsKLQkJCQkJSVBhdGggZnVsbFJ1bnRpbWVQYXRoID0gY29tcG9uZW50UmVzb3VyY2VzW2NvbXBvbmVudFJlc291cmNlSW5kZXhdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJCS8vIGV4YWN0IG1hdGNoCi0JCQkJCWlmIChmdWxsUnVudGltZVBhdGguZXF1YWxzKGdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0KLQkJCQkJCUlSZXNvdXJjZSByZWFsUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihjb21wb25lbnRSZXNvdXJjZXNbY29tcG9uZW50UmVzb3VyY2VJbmRleF0uZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCWlmICgocmVhbFJlc291cmNlICE9IG51bGwpICYmIChyZWFsUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgfHwgcmVhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkpIHsKLQkJCQkJCQlJQ29udGFpbmVyIHJlYWxDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVhbFJlc291cmNlOwotCQkJCQkJCUlSZXNvdXJjZVtdIHJlYWxDaGlsZFJlc291cmNlcyA9IHJlYWxDb250YWluZXIubWVtYmVycyhtZW1iZXJGbGFncyk7Ci0JCQkJCQkJZm9yIChpbnQgcmVhbFJlc291cmNlSW5kZXggPSAwOyByZWFsUmVzb3VyY2VJbmRleCA8IHJlYWxDaGlsZFJlc291cmNlcy5sZW5ndGg7IHJlYWxSZXNvdXJjZUluZGV4KyspIHsKLQkJCQkJCQkJSVJlc291cmNlIGNoaWxkID0gcmVhbENoaWxkUmVzb3VyY2VzW3JlYWxSZXNvdXJjZUluZGV4XTsKLQkJCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLQkJCQkJCQkJaWYgKGFsbE5hbWVzLmFkZChsb2NhbE5hbWUpKSB7Ci0JCQkJCQkJCQlJUGF0aCBuZXdSdW50aW1lUGF0aCA9IGdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGxvY2FsTmFtZSk7Ci0JCQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKG5ldyBWaXJ0dWFsRmlsZShnZXRQcm9qZWN0KCksIG5ld1J1bnRpbWVQYXRoLCAoSUZpbGUpIGNoaWxkKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIEFuIElSZXNvdXJjZS5GSUxFIHdvdWxkIGJlIGFuIGVycm9yIGNvbmRpdGlvbiAoYXMgdGhpcyBpcyBhIGNvbnRhaW5lcikKLQotCQkJCQl9IGVsc2UgeyAvLyBmdXp6eSBtYXRjaAotCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZShmdWxsUnVudGltZVBhdGgpOwotCQkJCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGFsbE5hbWVzLmFkZChsb2NhbE5hbWUpKSB7Ci0JCQkJCQkJSVJlc291cmNlIHJlYWxSZXNvdXJjZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RWNsaXBzZVJlc291cmNlKGNvbXBvbmVudFJlc291cmNlc1tjb21wb25lbnRSZXNvdXJjZUluZGV4XSk7Ci0JCQkJCQkJaWYgKHJlYWxSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCUlQYXRoIG5ld1J1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCQkJCQkJaWYgKGZ1bGxSdW50aW1lUGF0aC5zZWdtZW50Q291bnQoKSA+IGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkgKyAxKSB7CS8vIG5vdCBhIGRpcmVjdCBjaGlsZAotCQkJCQkJCQkJdmlydHVhbFJlc291cmNlcy5hZGQoQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIoZ2V0UHJvamVjdCgpLCBuZXdSdW50aW1lUGF0aCkpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHJlYWxSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQkJCQkJdmlydHVhbFJlc291cmNlcy5hZGQobmV3IFZpcnR1YWxGaWxlKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgsIChJRmlsZSkgcmVhbFJlc291cmNlKSk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXZpcnR1YWxSZXNvdXJjZXMuYWRkKENvbXBvbmVudENvcmUuY3JlYXRlRm9sZGVyKGdldFByb2plY3QoKSwgbmV3UnVudGltZVBhdGgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh2aXJ0dWFsUmVzb3VyY2VzID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlc291cmNlWzBdOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsUmVzb3VyY2VbXSkgdmlydHVhbFJlc291cmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlc291cmNlW3ZpcnR1YWxSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogTG9jYWwgbmFtZSB3aXRoaW4gY29udGV4dCBvZiB0aGlzIHZpcnR1YWwgY29udGFpbmVyLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsTmFtZShJUGF0aCBwYXRoKSB7Ci0JCWlmICghZ2V0UnVudGltZVBhdGgoKS5pc1ByZWZpeE9mKHBhdGgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYXRoLnNlZ21lbnQoZ2V0UnVudGltZVBhdGgoKS5zZWdtZW50Q291bnQoKSk7Ci0JfQotCi0JcHVibGljIElWaXJ0dWFsRmlsZVtdIGZpbmREZWxldGVkTWVtYmVyc1dpdGhIaXN0b3J5KGludCBkZXB0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIjY3JlYXRlTGluayhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIHJlc291cmNlID0gbnVsbDsKLQkJCWlmIChhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24uaXNSb290KCkgfHwgYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJlc291cmNlID0gZ2V0UHJvamVjdCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uKTsKLQkJCX0KLQotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWlmIChudWxsICE9IGNvbXBvbmVudCkgewotCQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChjb21wb25lbnQpOwotCQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCQljb21wb25lbnRSZXNvdXJjZS5zZXRSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLmFkZChjb21wb25lbnRSZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYm9vbGVhbiBmb3VuZE1hcHBpbmcgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgcmVzb3VyY2VJbmR4ID0gMDsgcmVzb3VyY2VJbmR4IDwgcmVzb3VyY2VzLmxlbmd0aCAmJiAhZm91bmRNYXBwaW5nOyByZXNvdXJjZUluZHgrKykgewotCQkJCQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlQWJzb2x1dGUoKS5lcXVhbHMocmVzb3VyY2VzW3Jlc291cmNlSW5keF0uZ2V0U291cmNlUGF0aCgpKSkKLQkJCQkJCQlmb3VuZE1hcHBpbmcgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZm91bmRNYXBwaW5nKSB7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocmVzb3VyY2UpOwotCQkJCQkJY29tcG9uZW50UmVzb3VyY2Uuc2V0UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQkJCQljb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkuYWRkKGNvbXBvbmVudFJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljcmVhdGVSZXNvdXJjZShyZXNvdXJjZSwgdXBkYXRlRmxhZ3MsIG1vbml0b3IpOwotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFVuZGVybHlpbmdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBOT19SRVNPVVJDRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVNZXRhTW9kZWwoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlpZiAobnVsbCAhPSBjb21wb25lbnQpIHsKLQkJCQltb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpLmdldENvbXBvbmVudHMoKS5yZW1vdmUoY29tcG9uZW50KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvRGVsZXRlUmVhbFJlc291cmNlcyhpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJaWYgKG51bGwgIT0gY29tcG9uZW50KSB7Ci0JCQkJTGlzdCBjdXJyZW50UmVzb3VyY2VzID0gY29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQkJCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQlpZiAoYVJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1cnJlbnRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoYVJlc291cmNlVHlwZS5lcXVhbHMocmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7Ci0JCQkJCQkJSVZpcnR1YWxSZXNvdXJjZSB2cmVzID0gY3JlYXRlVmlydHVhbFJlc291cmNlKHJlc291cmNlKTsKLQkJCQkJCQlpZiAodnJlcyAhPSBudWxsKQotCQkJCQkJCQlmb3VuZFJlc291cmNlcy5hZGQodnJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChJVmlydHVhbFJlc291cmNlW10pIGZvdW5kUmVzb3VyY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVzb3VyY2VbZm91bmRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVzb3VyY2VbMF07Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29yZSAhPSBudWxsKQotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVmlydHVhbFJlc291cmNlIGNyZWF0ZVZpcnR1YWxSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBhQ29tcG9uZW50UmVzb3VyY2UpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gU3RydWN0dXJlRWRpdC5nZXRFY2xpcHNlUmVzb3VyY2UoYUNvbXBvbmVudFJlc291cmNlKTsKLQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUoZ2V0UHJvamVjdCgpLCBhQ29tcG9uZW50UmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIGFDb21wb25lbnRSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOWVjMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFZpcnR1YWxGaWxlIGV4dGVuZHMgVmlydHVhbFJlc291cmNlIGltcGxlbWVudHMgSVZpcnR1YWxGaWxlIHsKLQotCXByaXZhdGUgSUZpbGUgdW5kZXJseWluZ0ZpbGU7Ci0KLQlwdWJsaWMgVmlydHVhbEZpbGUoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsgCi0JfQotCi0JcHVibGljIFZpcnR1YWxGaWxlKElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgsIElGaWxlIHVuZGVybHlpbmdGaWxlKSB7Ci0JCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCQl0aGlzLnVuZGVybHlpbmdGaWxlID0gdW5kZXJseWluZ0ZpbGU7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciNjcmVhdGVMaW5rKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTGluayhJUGF0aCBhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24sIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlGaWxlIHJlc291cmNlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uKTsKLQotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCQotCQkJUmVzb3VyY2VUcmVlUm9vdCByb290ID0gUmVzb3VyY2VUcmVlUm9vdC5nZXREZXBsb3lSZXNvdXJjZVRyZWVSb290KGNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhnZXRSdW50aW1lUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJaWYocmVzb3VyY2VzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2UgY29tcG9uZW50UmVzb3VyY2UgPSBtb2R1bGVDb3JlLmNyZWF0ZVdvcmtiZW5jaE1vZHVsZVJlc291cmNlKHJlc291cmNlKTsKLQkJCQljb21wb25lbnRSZXNvdXJjZS5zZXRSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJCQljb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkuYWRkKGNvbXBvbmVudFJlc291cmNlKTsKLQkJCX0gZWxzZSB7IAotCQkJCWJvb2xlYW4gZm91bmRNYXBwaW5nID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgcmVzb3VyY2VJbmR4ID0gMDsgcmVzb3VyY2VJbmR4IDwgcmVzb3VyY2VzLmxlbmd0aCAmJiAhZm91bmRNYXBwaW5nOyByZXNvdXJjZUluZHgrKykgewotCQkJCQlpZihhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24uZXF1YWxzKHJlc291cmNlc1tyZXNvdXJjZUluZHhdLmdldFNvdXJjZVBhdGgoKSkpCi0JCQkJCQlmb3VuZE1hcHBpbmcgPSB0cnVlOwotCQkJCX0KLQkJCQlpZighZm91bmRNYXBwaW5nKSB7Ci0JCQkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gbW9kdWxlQ29yZS5jcmVhdGVXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJCWNvbXBvbmVudFJlc291cmNlLnNldFJ1bnRpbWVQYXRoKGdldFJ1bnRpbWVQYXRoKCkpOwotCQkJCQljb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkuYWRkKGNvbXBvbmVudFJlc291cmNlKTsJCQkJCQotCQkJCX0KLQkJCX0gCi0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0gCi0gCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSVZpcnR1YWxSZXNvdXJjZS5GSUxFOwotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCQotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBnZXRVbmRlcmx5aW5nRmlsZSgpIHsKLQkJaWYgKHVuZGVybHlpbmdGaWxlID09IG51bGwpIHsKLQkJCXVuZGVybHlpbmdGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gdW5kZXJseWluZ0ZpbGU7Ci0JfQotCi0JcHVibGljIElGaWxlW10gZ2V0VW5kZXJseWluZ0ZpbGVzKCkgewotCQlJUGF0aFtdIHBhdGhzID0gZ2V0UHJvamVjdFJlbGF0aXZlUGF0aHMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwYXRocy5sZW5ndGg7IGkrKykgewotCQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKHBhdGhzW2ldKTsKLQkJCWlmIChmaWxlIT1udWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgIXJlc3VsdC5jb250YWlucyhmaWxlKSkKLQkJCQlyZXN1bHQuYWRkKGZpbGUpOwotCQl9Ci0JCXJldHVybiAoSUZpbGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElGaWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZU1ldGFNb2RlbChpbnQgdXBkYXRlRmxhZ3MsSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vRGVmYXVsdAotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgZG9EZWxldGVSZWFsUmVzb3VyY2VzKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vRGVmYXVsdAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3Jlc291cmNlcy9WaXJ0dWFsRm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmYTkxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgVmlydHVhbEZvbGRlciBleHRlbmRzIFZpcnR1YWxDb250YWluZXIgaW1wbGVtZW50cyBJVmlydHVhbEZvbGRlciB7IAotCi0KLQkvKioKLQkgKiBwPiBDcmVhdGVzIGFuIHVuYXNzaWduZWQgbWFwcGluZyBjb250YWluZWQgYnkgdGhlIGNvbXBvbmVudCBpZGVudGlmaWVkIGJ5IGFDb21wb25lbnRIYW5kbGUKLQkgKiB3aXRoIGEgcnVudGltZSBwYXRoIG9mIGFSdW50aW1lUGF0aC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFDb21wb25lbnRIYW5kbGUKLQkgKiBAcGFyYW0gYVJ1bnRpbWVQYXRoCi0JICovCi0JcHVibGljIFZpcnR1YWxGb2xkZXIoSVByb2plY3QgYUNvbXBvbmVudFByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCkgewotCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0gCi0JLy8gVE9ETyBXVFA6SW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29udGFpbmVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsgCi0JCWlmKCAhY29udGFpbmVyLmdldFJvb3RGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuaXNSb290KCkpewotCQkJSUZvbGRlciByZWFsRm9sZGVyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihjb250YWluZXIuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7IAotCQkJSUZvbGRlciBuZXdGb2xkZXIgPSByZWFsRm9sZGVyLmdldEZvbGRlcihnZXRSdW50aW1lUGF0aCgpKTsgCi0JCQljcmVhdGVSZXNvdXJjZShuZXdGb2xkZXIsIHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsgIAotCQl9Ci0JCWVsc2UgewotCQkJSUZvbGRlciBuZXdGb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGdldFJ1bnRpbWVQYXRoKCkpOyAKLQkJCWNyZWF0ZVJlc291cmNlKG5ld0ZvbGRlciwgdXBkYXRlRmxhZ3MsIG1vbml0b3IpOyAKLQkJfQotCX0gCi0KLQkvLyBUT0RPIFdUUDpJbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoSVBhdGggcGF0aCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGZhbHNlOwotCX0KLQotIAotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSOwotCX0gCi0JCi0JcHVibGljIElSZXNvdXJjZSBnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXRVbmRlcmx5aW5nRm9sZGVyKCkgeyAKLQkJSVBhdGggcGF0aCA9IGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYoICFwYXRoLmlzUm9vdCgpICkKLQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKSB7Ci0JCUlQYXRoW10gcGF0aHMgPSBnZXRQcm9qZWN0UmVsYXRpdmVQYXRocygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiggIXBhdGhzW2ldLmlzUm9vdCgpICl7Ci0JCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHBhdGhzW2ldKTsKLQkJCQlpZiAoZm9sZGVyIT1udWxsICYmIGZvbGRlci5leGlzdHMoKSAmJiAhcmVzdWx0LmNvbnRhaW5zKGZvbGRlcikpCi0JCQkJCXJlc3VsdC5hZGQoZm9sZGVyKTsKLQkJCX0gZWxzZSAKLQkJCQlyZXN1bHQuYWRkKGdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIChJQ29udGFpbmVyW10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ29udGFpbmVyW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZU1ldGFNb2RlbChpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCS8vIG9ubHkgaGFuZGxlcyBleHBsaWNpdCBtYXBwaW5ncwotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgeyAKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKTsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChydW50aW1lUGF0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmKHJ1bnRpbWVQYXRoLmVxdWFscyhyZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKSkpIAotCQkJCQljb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlc1tpXSk7CQkJCQkJCQkKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZVJlYWxSZXNvdXJjZXMoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBvbmx5IGhhbmRsZXMgZXhwbGljaXQgbWFwcGluZ3MKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKTsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChydW50aW1lUGF0aCk7Ci0JCQlJUmVzb3VyY2UgcmVhbFJlc291cmNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihydW50aW1lUGF0aC5lcXVhbHMocmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0JCQkJCXJlYWxSZXNvdXJjZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RWNsaXBzZVJlc291cmNlKHJlc291cmNlc1tpXSk7Ci0JCQkJCWlmKHJlYWxSZXNvdXJjZSAhPSBudWxsICYmIHJlYWxSZXNvdXJjZS5nZXRUeXBlKCkgPT0gZ2V0VHlwZSgpKQotCQkJCQkJcmVhbFJlc291cmNlLmRlbGV0ZSh1cGRhdGVGbGFncywgbW9uaXRvcik7Ci0JCQkJfQotCQkJCQkKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdiMWNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBWaXJ0dWFsUmVmZXJlbmNlIGltcGxlbWVudHMgSVZpcnR1YWxSZWZlcmVuY2UgewotCQotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudDsKLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGVuY2xvc2luZ0NvbXBvbmVudDsKLQlwcml2YXRlIElQYXRoIHJ1bnRpbWVQYXRoOwotCXByaXZhdGUgaW50IGRlcGVuZGVuY3lUeXBlOwotCXByaXZhdGUgU3RyaW5nIGFyY2hpdmVOYW1lOwotCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoKSB7Ci0JCQotCX0gCi0JCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYW5FbmNsb3NpbmdDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50KSB7Ci0JCXRoaXMoYW5FbmNsb3NpbmdDb21wb25lbnQsIGFSZWZlcmVuY2VkQ29tcG9uZW50LCBuZXcgUGF0aChTdHJpbmcudmFsdWVPZihJUGF0aC5TRVBBUkFUT1IpKSwgREVQRU5ERU5DWV9UWVBFX1VTRVMpOyAKLQl9Ci0JCi0JcHVibGljIFZpcnR1YWxSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgYW5FbmNsb3NpbmdDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJdGhpcyhhbkVuY2xvc2luZ0NvbXBvbmVudCwgYVJlZmVyZW5jZWRDb21wb25lbnQsIGFSdW50aW1lUGF0aCwgREVQRU5ERU5DWV9UWVBFX1VTRVMpOwotCX0KLQotCXB1YmxpYyBWaXJ0dWFsUmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGFuRW5jbG9zaW5nQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhUmVmZXJlbmNlZENvbXBvbmVudCwgSVBhdGggYVJ1bnRpbWVQYXRoLCBpbnQgYURlcGVuZGVuY3lUeXBlKSB7Ci0JCWVuY2xvc2luZ0NvbXBvbmVudCA9IGFuRW5jbG9zaW5nQ29tcG9uZW50OwotCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gYVJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JCXJ1bnRpbWVQYXRoID0gYVJ1bnRpbWVQYXRoOwotCQlkZXBlbmRlbmN5VHlwZSA9IGFEZXBlbmRlbmN5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7IAotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGVuY2xvc2luZ0NvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZkNvbXAgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKS5jcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiggIXJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCQlyZWZDb21wLnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKSkpOwotCQkJZWxzZQotCQkJCXJlZkNvbXAuc2V0SGFuZGxlKE1vZHVsZVVSSVV0aWwuYXJjaGl2ZUNvbXBvbmVudGZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VkQ29tcG9uZW50LmdldE5hbWUoKSkpOyAKLQkJCXJlZkNvbXAuc2V0UnVudGltZVBhdGgocnVudGltZVBhdGgpOwotCQkJcmVmQ29tcC5zZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZS5nZXQoZGVwZW5kZW5jeVR5cGUpKTsKLQkJCXJlZkNvbXAuc2V0QXJjaGl2ZU5hbWUoYXJjaGl2ZU5hbWUpOwotCQkJaWYoIXJlZmVyZW5jZWRDb21wb25lbnRzLmNvbnRhaW5zKHJlZkNvbXApKXsKLQkJCQlyZWZlcmVuY2VkQ29tcG9uZW50cy5hZGQocmVmQ29tcCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseXsKLQkJCWlmKG51bGwgIT0gY29yZSl7Ci0JCQkJY29yZS5zYXZlSWZOZWNlc3NhcnkoYU1vbml0b3IpOwotCQkJCWNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggYVJ1bnRpbWVQYXRoKSB7IAotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKSB7IAotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVwZW5kZW5jeVR5cGUoaW50IGFEZXBlbmRlbmN5VHlwZSkgewotCQlkZXBlbmRlbmN5VHlwZSA9IGFEZXBlbmRlbmN5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlcGVuZGVuY3lUeXBlKCkgeyAKLQkJcmV0dXJuIGRlcGVuZGVuY3lUeXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsgCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkgeyAKLQkJcmV0dXJuIGVuY2xvc2luZ0NvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIHsgCi0JCXJldHVybiByZWZlcmVuY2VkQ29tcG9uZW50OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIGFjdHVhbCByZWZlcmVuY2VDb21wb25lbnQgb24gdGhlIC5jb21wb25lbnQgZmlsZSBmb3IgdGhpcyB2aXJ0dWFsIHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCBFT2JqZWN0IGRlcGVuZGVudE9iamVjdCkgewotCQlpZiAoYVJlZmVyZW5jZWRDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RydWN0dXJlRWRpdCBlbmNsb3NpbmdDb3JlID0gbnVsbDsKLQkJU3RydWN0dXJlRWRpdCByZWZDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVuY2xvc2luZ0NvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShlbmNsb3NpbmdDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCXJlZkNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShyZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgZW5jbG9zaW5nQ29tcCA9IGVuY2xvc2luZ0NvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgcmVmQ29tcCA9IHJlZkNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZWZlcmVuY2VkQ29tcG9uZW50IGFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQgPSBlbmNsb3NpbmdDb3JlLmZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KGVuY2xvc2luZ0NvbXAsIHJlZkNvbXApOwotCQkJaWYgKGFjdHVhbFJlZmVyZW5jZWRDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCXJlZmVyZW5jZWRDb21wb25lbnQgPSBhUmVmZXJlbmNlZENvbXBvbmVudDsKLQkJCQlpZighcmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpKQotCQkJCQlhY3R1YWxSZWZlcmVuY2VkQ29tcG9uZW50LnNldEhhbmRsZShNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShyZWZlcmVuY2VkQ29tcG9uZW50LmdldFByb2plY3QoKSkpOwotCQkJCWVsc2UKLQkJCQkJYWN0dWFsUmVmZXJlbmNlZENvbXBvbmVudC5zZXRIYW5kbGUoTW9kdWxlVVJJVXRpbC5hcmNoaXZlQ29tcG9uZW50ZnVsbHlRdWFsaWZ5VVJJKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKSk7Ci0JCQkJYWN0dWFsUmVmZXJlbmNlZENvbXBvbmVudC5zZXREZXBlbmRlbnRPYmplY3QoZGVwZW5kZW50T2JqZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlbmNsb3NpbmdDb3JlICE9IG51bGwpIHsKLQkJCQllbmNsb3NpbmdDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQllbmNsb3NpbmdDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChyZWZDb3JlICE9IG51bGwpIHsKLQkJCQlyZWZDb3JlLnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZWZDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0JCXJldHVybiBhcmNoaXZlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpIHsKLQkJdGhpcy5hcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvcmVzb3VyY2VzL1ZpcnR1YWxSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUzNTAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9yZXNvdXJjZXMvVmlydHVhbFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlVHJlZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Xb3JrYmVuY2hDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXJ0dWFsUmVzb3VyY2UgaW1wbGVtZW50cyBJVmlydHVhbFJlc291cmNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVJlc291cmNlW10gTk9fUkVTT1VSQ0VTID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IGNvbXBvbmVudFByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBJUGF0aCBydW50aW1lUGF0aDsKLQlwcml2YXRlIGludCBoYXNoQ29kZTsKLQlwcml2YXRlIFN0cmluZyB0b1N0cmluZzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudDsKLQlwcml2YXRlIFN0cmluZyByZXNvdXJjZVR5cGU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIG1hcHBpbmcgPSBuZXcgUmVzb3VyY2VUaW1lc3RhbXBNYXBwaW5ncygpOwotCi0KLQlwcm90ZWN0ZWQgVmlydHVhbFJlc291cmNlKElQcm9qZWN0IGFDb21wb25lbnRQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJY29tcG9uZW50UHJvamVjdCA9IGFDb21wb25lbnRQcm9qZWN0OwotCQlydW50aW1lUGF0aCA9IGFSdW50aW1lUGF0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoKHVwZGF0ZUZsYWdzICYgSVZpcnR1YWxSZXNvdXJjZS5JR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRSkgPT0gMCkgewotCQkJZG9EZWxldGVSZWFsUmVzb3VyY2VzKHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJfQotCi0JCWRvRGVsZXRlTWV0YU1vZGVsKHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZU1ldGFNb2RlbChpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGFDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgoZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlhQ29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlcykpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb0RlbGV0ZVJlYWxSZXNvdXJjZXMoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyB2ZXJpZnkgYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzIGV4aXN0IGZvciB0aGUgdmlydHVhbCByZXNvdXJjZSB0byBleGlzdAotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7Ci0JCWlmIChyZXNvdXJjZXM9PW51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aD09MCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlc291cmNlc1tpXT09bnVsbCB8fCAhcmVzb3VyY2VzW2ldLmV4aXN0cygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpbnQgZG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoZG90ID09IC0xKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkb3QgPT0gbmFtZS5sZW5ndGgoKSAtIDEpCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoZG90ICsgMSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZChnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCX0KLQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFByb2plY3RSZWxhdGl2ZVBhdGhzKCkgewotIAotCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCWlmIChhQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlVHJlZVJvb3Qgcm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0RGVwbG95UmVzb3VyY2VUcmVlUm9vdChhQ29tcG9uZW50KTsKLQkJCS8vIHN0aWxsIG5lZWQgc29tZSBzb3J0IG9mIGxvb3AgaGVyZSB0byBzZWFyY2ggc3VicGllY2VzIG9mIHRoZSBydW50aW1lIHBhdGguCi0JCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IG51bGw7Ci0KLQkJCWlmIChyb290ICE9IG51bGwpIHsKLQkJCQlJUGF0aFtdIGVzdGltYXRlZFBhdGhzID0gbnVsbDsKLQkJCQlJUGF0aCBzZWFyY2hQYXRoID0gbnVsbDsKLQkJCQlkbyB7Ci0JCQkJCXNlYXJjaFBhdGggPSAoc2VhcmNoUGF0aCA9PSBudWxsKSA/IGdldFJ1bnRpbWVQYXRoKCkgOiBzZWFyY2hQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHNlYXJjaFBhdGgsIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQkJCQllc3RpbWF0ZWRQYXRocyA9IGZpbmRCZXN0TWF0Y2hlcyhjb21wb25lbnRSZXNvdXJjZXMpOwotCQkJCX0gd2hpbGUgKGVzdGltYXRlZFBhdGhzLmxlbmd0aD09MCAmJiBjYW5TZWFyY2hDb250aW51ZShjb21wb25lbnRSZXNvdXJjZXMsIHNlYXJjaFBhdGgpKTsKLQkJCQlpZiAoZXN0aW1hdGVkUGF0aHM9PW51bGwgfHwgZXN0aW1hdGVkUGF0aHMubGVuZ3RoPT0wKQotCQkJCQlyZXR1cm4gbmV3IElQYXRoW10ge2dldFJ1bnRpbWVQYXRoKCl9OwotCQkJCXJldHVybiBlc3RpbWF0ZWRQYXRoczsKLQkJCX0KLQkJfSAKLSAKLQkJcmV0dXJuIG5ldyBJUGF0aFtdIHtnZXRSdW50aW1lUGF0aCgpfTsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHsgCi0JCWlmIChnZXRSdW50aW1lUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiLyIpKSkgeyAKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50ID0gZ2V0UmVhZE9ubHlDb21wb25lbnQoKTsKLQkJCWlmIChhQ29tcG9uZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoKChXb3JrYmVuY2hDb21wb25lbnRJbXBsKSBhQ29tcG9uZW50KS5nZXREZWZhdWx0U291cmNlUm9vdCgpICE9IG51bGwpCi0JCQkJCXJldHVybiAoKFdvcmtiZW5jaENvbXBvbmVudEltcGwpIGFDb21wb25lbnQpLmdldERlZmF1bHRTb3VyY2VSb290KCk7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBnZXRQcm9qZWN0UmVsYXRpdmVQYXRocygpWzBdOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuU2VhcmNoQ29udGludWUoQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMsIElQYXRoIHNlYXJjaFBhdGgpIHsKLQkJcmV0dXJuIChzZWFyY2hQYXRoLnNlZ21lbnRDb3VudCgpID4gMCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aFtdIGZpbmRCZXN0TWF0Y2hlcyhDb21wb25lbnRSZXNvdXJjZVtdIHRoZUNvbXBvbmVudFJlc291cmNlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGN1cnJlbnRNYXRjaExlbmd0aCA9IDA7Ci0JCWludCBiZXN0TWF0Y2hMZW5ndGggPSAtMTsKLQkJSVBhdGggZXN0aW1hdGVkUGF0aCA9IG51bGw7Ci0JCUlQYXRoIGN1cnJlbnRQYXRoID0gbnVsbDsKLQkJZmluYWwgSVBhdGggYVJ1bnRpbWVQYXRoID0gZ2V0UnVudGltZVBhdGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCWN1cnJlbnRQYXRoID0gdGhlQ29tcG9uZW50UmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQlpZiAoY3VycmVudFBhdGguaXNQcmVmaXhPZihhUnVudGltZVBhdGgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRQYXRoLnNlZ21lbnRDb3VudCgpID09IGFSdW50aW1lUGF0aC5zZWdtZW50Q291bnQoKSkgewotCQkJCQlyZXN1bHQuYWRkKHRoZUNvbXBvbmVudFJlc291cmNlc1tpXS5nZXRTb3VyY2VQYXRoKCkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9CQotCQkJCWN1cnJlbnRNYXRjaExlbmd0aCA9IGN1cnJlbnRQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhhUnVudGltZVBhdGgpOwotCQkJCWlmIChjdXJyZW50TWF0Y2hMZW5ndGggPT0gY3VycmVudFBhdGguc2VnbWVudENvdW50KCkgJiYgY3VycmVudE1hdGNoTGVuZ3RoID4gYmVzdE1hdGNoTGVuZ3RoKSB7Ci0JCQkJCWJlc3RNYXRjaExlbmd0aCA9IGN1cnJlbnRNYXRjaExlbmd0aDsKLQkJCQkJSVBhdGggc291cmNlUGF0aCA9IHRoZUNvbXBvbmVudFJlc291cmNlc1tpXS5nZXRTb3VyY2VQYXRoKCk7Ci0JCQkJCUlQYXRoIHN1YnBhdGggPSBhUnVudGltZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjdXJyZW50TWF0Y2hMZW5ndGgpOwotCQkJCQllc3RpbWF0ZWRQYXRoID0gc291cmNlUGF0aC5hcHBlbmQoc3VicGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQuc2l6ZSgpPjApCi0JCQlyZXR1cm4gKElQYXRoW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUGF0aFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCWlmIChlc3RpbWF0ZWRQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElQYXRoW10ge307Ci0JCXJldHVybiBuZXcgSVBhdGhbXSB7ZXN0aW1hdGVkUGF0aH07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZ2V0UnVudGltZVBhdGgoKS5zZWdtZW50Q291bnQoKT4wKQotCQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJcmV0dXJuIGdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQljb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gY29tcG9uZW50OwotCX0KLSAgICAKLQkvL3JldHVybnMgbnVsbCBpZiB0aGUgZm9sZGVyIGlzIGFscmVhZHkgdGhlIHJvb3QgZm9sZGVyCi0JcHVibGljIElWaXJ0dWFsQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJaWYgKGdldFJ1bnRpbWVQYXRoKCkuc2VnbWVudENvdW50KCkgPj0gMSkKLQkJCXJldHVybiBDb21wb25lbnRDb3JlLmNyZWF0ZUZvbGRlcihnZXRQcm9qZWN0KCksIGdldFJ1bnRpbWVQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBjb21wb25lbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHRvU3RyaW5nID09IG51bGwpCi0JCQl0b1N0cmluZyA9ICJbIiArIE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKSArICI6IiArIGdldFJ1bnRpbWVQYXRoKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiB0b1N0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAoaGFzaENvZGUgPT0gMCkKLQkJCWhhc2hDb2RlID0gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk90aGVyKSB7Ci0JCXJldHVybiBoYXNoQ29kZSgpID09ICgoYW5PdGhlciAhPSBudWxsICYmIGFuT3RoZXIgaW5zdGFuY2VvZiBWaXJ0dWFsUmVzb3VyY2UpID8gYW5PdGhlci5oYXNoQ29kZSgpIDogMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VUeXBlKFN0cmluZyBhUmVzb3VyY2VUeXBlKSB7Ci0JCXJlc291cmNlVHlwZSA9IGFSZXNvdXJjZVR5cGU7IAotCQlXb3JrYmVuY2hDb21wb25lbnQgYUNvbXBvbmVudCA9IGdldFJlYWRPbmx5Q29tcG9uZW50KCk7Ci0JCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gYUNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc291cmNlc1tpXS5zZXRSZXNvdXJjZVR5cGUoYVJlc291cmNlVHlwZSk7Ci0JCX0KLQkJIAotCX0KLQotCS8vIFRPRE8gRmV0Y2ggdGhlIHJlc291cmNlIHR5cGUgZnJvbSB0aGUgbW9kZWwuCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCWlmIChudWxsID09IHJlc291cmNlVHlwZSkgeyAKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBhQ29tcG9uZW50ID0gZ2V0UmVhZE9ubHlDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gYUNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChnZXRSdW50aW1lUGF0aCgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzb3VyY2VUeXBlID0gcmVzb3VyY2VzW2ldLmdldFJlc291cmNlVHlwZSgpOwotCQkJCXJldHVybiByZXNvdXJjZVR5cGU7Ci0JCQl9Ci0JCQkgCi0JCX0KLQkJcmVzb3VyY2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlKElDb250YWluZXIgcmVzb3VyY2UsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHJlc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlpZiAoIXJlc291cmNlLmdldFBhcmVudCgpLmV4aXN0cygpKQotCQkJY3JlYXRlUmVzb3VyY2UocmVzb3VyY2UuZ2V0UGFyZW50KCksIHVwZGF0ZUZsYWdzLCBtb25pdG9yKTsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJKChJRm9sZGVyKSByZXNvdXJjZSkuY3JlYXRlKHVwZGF0ZUZsYWdzLCB0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUG90ZW50YWxNYXRjaChJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGFSdW50aW1lUGF0aC5pc1ByZWZpeE9mKGdldFJ1bnRpbWVQYXRoKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZSNyZW1vdmVMaW5rKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgaW50LCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlSZXNvdXJjZVRyZWVSb290IHJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldERlcGxveVJlc291cmNlVHJlZVJvb3QoY29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gcm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKGdldFJ1bnRpbWVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCQkJaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgcmVzb3VyY2VJbmR4ID0gMDsgcmVzb3VyY2VJbmR4IDwgcmVzb3VyY2VzLmxlbmd0aDsgcmVzb3VyY2VJbmR4KyspIHsKLQkJCQkJaWYgKGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbi5tYWtlQWJzb2x1dGUoKS5lcXVhbHMocmVzb3VyY2VzW3Jlc291cmNlSW5keF0uZ2V0U291cmNlUGF0aCgpKSkgewotCQkJCQkJY29tcG9uZW50LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZXNbcmVzb3VyY2VJbmR4XSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobW9uaXRvcik7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFdvcmtiZW5jaENvbXBvbmVudCBnZXRSZWFkT25seUNvbXBvbmVudCgpIHsKLQkJaWYoIW1hcHBpbmcuaGFzQ2hhbmdlZChnZXRQcm9qZWN0KCkpICYmIG1hcHBpbmcuaGFzQ2FjaGVEYXRhKGdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gKFdvcmtiZW5jaENvbXBvbmVudCkgbWFwcGluZy5nZXREYXRhKGdldFByb2plY3QoKSk7Ci0JCQotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKGdldFByb2plY3QoKSk7Ci0JCQljb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJbWFwcGluZy5tYXJrKGdldFByb2plY3QoKSwgY29tcG9uZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsgCi0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudDsKLQkJCi0JCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOTRmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFkYXB0cyB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0gdG8gYW4ge0BzZWUgQXJ0aWZhY3RFZGl0KSAKLSAqIGluc3RhbmNlIGZhY2FkZSwgaWYgcG9zc2libGUuIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgCi0gKiByZWdpc3RlcmVkIHdpdGggdGhlIFBsYXRmb3JtIEFkYXB0ZXIgTWFuYWdlciBpbiAKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpfQotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQVJUSUZBQ1RfRURJVF9NT0RFTF9DTEFTUyA9IEFydGlmYWN0RWRpdE1vZGVsLmNsYXNzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIEFSVElGQUNUX0VESVRfQ0xBU1MgPSBBcnRpZmFjdEVkaXQuY2xhc3M7Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiBhbkFkYXB0YWJsZU9iamVjdCwgaWYgcG9zc2libGUuCi0JICogPC9wPiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhbkFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYW5BZGFwdGVyVHlwZSkgewotCQlpZiAoYW5BZGFwdGVyVHlwZSA9PSBBcnRpZmFjdEVkaXRNb2RlbC5BREFQVEVSX1RZUEUpIHsKLQkJCWlmIChhbkFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0RWRpdCkgewotCQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdClhbkFkYXB0YWJsZU9iamVjdDsKLQkJCQlJUHJvamVjdCBhUHJvamVjdCA9IGVkaXQuZ2V0UHJvamVjdCgpOwotCQkJCVVSSSBjb21wb25lbnRVUkkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShhUHJvamVjdCk7Ci0JCQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUoZWRpdC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQkJCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCXBhcmFtcy5wdXQoQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5LlBBUkFNX01PRFVMRV9VUkksIGNvbXBvbmVudFVSSSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nW10gZWRpdE1vZGVsSURzID0gRWRpdE1vZGVsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSZWdpc3RlcmVkRWRpdE1vZGVsSURzKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaTxlZGl0TW9kZWxJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG5hdHVyZS5nZXRFeGlzdGluZ0VkaXRNb2RlbChlZGl0TW9kZWxJRHNbaV0scGFyYW1zLGVkaXQuaXNSZWFkT25seSgpKTsKLQkJCQkJCQlpZiAoZWRpdE1vZGVsICE9bnVsbCkKLQkJCQkJCQkJcmV0dXJuIGVkaXRNb2RlbDsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCQkvL1JldHVybiBudWxsCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChhbkFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKLQkJCWlmIChhbkFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0RWRpdE1vZGVsKQotCQkJCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0KChBcnRpZmFjdEVkaXRNb2RlbCkgYW5BZGFwdGFibGVPYmplY3QpOwotCQkJaWYgKGFuQWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCSAgICAJCUlBcnRpZmFjdEVkaXRGYWN0b3J5IGZhY3RvcnkgPSByZWFkZXIuZ2V0QXJ0aWZhY3RFZGl0KCgoSVZpcnR1YWxDb21wb25lbnQpYW5BZGFwdGFibGVPYmplY3QpLmdldFByb2plY3QoKSk7Ci0JICAgIAkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkgICAgCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yUmVhZCgoSVZpcnR1YWxDb21wb25lbnQpYW5BZGFwdGFibGVPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKiAgCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0FSVElGQUNUX0VESVRfTU9ERUxfQ0xBU1MsQVJUSUZBQ1RfRURJVF9DTEFTU307Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMDVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9BcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0VESVRfRVhURU5TSU9OX1BPSU5UID0gImFydGlmYWN0ZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNURURJVCA9ICJhcnRpZmFjdGVkaXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGVJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNURURJVENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIGluc3RhbmNlID0gbmV3IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXAvKjxTdHJpbmcsIEFydGlmYWN0RWRpdERlc2NyaXB0b3I+Ki8gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgZmluYWwgTWFwLyo8QXJ0aWZhY3RFZGl0RGVzY3JpcHRvciwgSUFydGlmYWN0RWRpdEZhY3Rvcnk+Ki8gaW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgaW5zdGFuY2UoKSB7Ci0JCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdHJ5IHJlYWQgYnkgdGhlIHRpbWUgdGhlIGNsYXNzIGluaXRpYWxpemVzICovCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcihNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgQVJUSUZBQ1RfRURJVF9FWFRFTlNJT05fUE9JTlQpOwotCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCi0JCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlyZWFkUmVnaXN0cnkoKTsJCQkJCi0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoQVJUSUZBQ1RFRElULmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQotCQkJLyogQmVjYXVzZSB0aGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIHR5cGUgaXMgY3JlYXRlZCBmcm9tIGEgc3RhdGljIHNpbmdsZXRvbiAKLQkJCSAqIGZpZWxkLCBhbmQgdGhlIHJlZ2lzdHJ5IGlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIHR5cGUsIAotCQkJICogb3RoZXIgdGhyZWFkcyBjYW5ub3QgY29tcGV0ZSB3aXRoIHJlYWRFbGVtZW50KCkgZm9yIGFjY2VzcyB0byA8aT5kZXNjcmlwdG9yczwvaT4gCi0JCQkgKi8KLQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRSk7Ci0JCQlpZih0eXBlICE9IG51bGwpCi0JCQkJZGVzY3JpcHRvcnMucHV0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRZUEUpLCBuZXcgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQllbHNlIAotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgIk5vIHR5cGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBmb3IgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuIiArIEFSVElGQUNUX0VESVRfRVhURU5TSU9OX1BPSU5UICsgIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkJIiBleHRlbnNpb24gaW4gIiAgKyBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKSwgbnVsbCk7ICAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUFydGlmYWN0RWRpdEZhY3RvcnkgZ2V0QXJ0aWZhY3RFZGl0KFN0cmluZyB0eXBlSUQpIHsKLQkJCi0JCUFydGlmYWN0RWRpdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChBcnRpZmFjdEVkaXREZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQodHlwZUlEKTsKLQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsgIAotCQkJCi0JCQlmYWN0b3J5ID0gKElBcnRpZmFjdEVkaXRGYWN0b3J5KSBpbnN0YW5jZXMuZ2V0KGRlc2NyaXB0b3IpOwotCQkJCi0JCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkKLQkJCQlpZigoZmFjdG9yeSA9IGRlc2NyaXB0b3IuY3JlYXRlRmFjdG9yeSgpKSAhPSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlcy5wdXQoZGVzY3JpcHRvciwgZmFjdG9yeSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRvcnMucmVtb3ZlKGRlc2NyaXB0b3IpOwotCQkJCX0gCi0JCQl9IAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwkJCQotCX0gCi0JCi0JLy8gVE9ETyBEb24ndCBsaWtlIHRoaXMgYmVjYXVzZSBpdCdzIGdvaW5nIHRvIGN5Y2xlIGV2ZXJ5IHByb2plY3QgZmFjZXQgZm9yIGVhY2ggcHJvamVjdAotCXB1YmxpYyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSBnZXRBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJSXRlcmF0b3Iga2V5cyA9IGRlc2NyaXB0b3JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdHlwZUlEID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCQkJaWYgKHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpKQotCQkJCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdCh0eXBlSUQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSnVzdCByZXR1cm4gbnVsbAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0gCi0JCi0JcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdERlc2NyaXB0b3IgewotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCQlwdWJsaWMgQXJ0aWZhY3RFZGl0RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkJZWxlbWVudCA9IGNvbmZpZ0VsZW1lbnQ7Ci0JCQl0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVFlQRSk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBDcmVhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciAKLQkJICogPGI+bnVsbDwvYj4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIGluc3RhbnRpYXRpbmcgdGhlIGV4dGVuc2lvbi4KLQkJICogQHJldHVybiBBbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciAKLQkJICogPGI+bnVsbDwvYj4gaWYgdGhlcmUgYXJlIHByb2JsZW1zIGluc3RhbnRpYXRpbmcgdGhlIGV4dGVuc2lvbi4KLQkJICovCi0JCXB1YmxpYyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSBjcmVhdGVGYWN0b3J5KCkgewotCQkJCi0JCQlmaW5hbCBJQXJ0aWZhY3RFZGl0RmFjdG9yeVtdIGZhY3RvcnkgPSBuZXcgSUFydGlmYWN0RWRpdEZhY3RvcnlbMV07Ci0JCQkKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQkJTW9kdWxlY29yZVBsdWdpbi5sb2dFcnJvcigwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOyAKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJZmFjdG9yeVswXSA9IChJQXJ0aWZhY3RFZGl0RmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFSVElGQUNURURJVENMQVNTKTsgCi0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCQkKLQkJCXJldHVybiBmYWN0b3J5WzBdOyAKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBUaGUgdHlwZSBpZCBvZiB0aGlzIEFydGlmYWN0RWRpdCBkZWZpbml0aW9uIAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0gCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50SW1wbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudEltcGxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzJmZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50SW1wbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlY29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlVGltZXN0YW1wTWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudEltcGxNYW5hZ2VyICB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRkFDRVRTID0gIk5PTkUiOy8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UID0gImNvbXBvbmVudGltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT01QT05FTlRfSU1QTCA9ICJjb21wb25lbnRpbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudEltcGxNYW5hZ2VyIGluc3RhbmNlID0gbmV3IENvbXBvbmVudEltcGxNYW5hZ2VyKCk7Ci0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9BRF9GQUlMRUQgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcC8qIDxTdHJpbmcsIENvbXBvbmVudEltcGxEZXNjcmlwdG9yPiAqLyBkZXNjcmlwdG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgZmluYWwgTWFwLyogPENvbXBvbmVudEltcGxEZXNjcmlwdG9yLCBJQ29tcG9uZW50SW1wbEZhY3Rvcnk+ICovIGluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIGZpbmFsIFJlc291cmNlVGltZXN0YW1wTWFwcGluZ3MgZmFjdG9yeU1hcCA9IG5ldyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9uZW50SW1wbE1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdHJ5IHJlYWQgYnkgdGhlIHRpbWUgdGhlIGNsYXNzIGluaXRpYWxpemVzICovCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9uZW50SW1wbE1hbmFnZXIoKSB7Ci0JCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJbmV3IENvbXBvbmVudEltcGxSZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkoU3RyaW5nIHR5cGVJRCkgewotCi0JCUNvbXBvbmVudEltcGxEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQ29tcG9uZW50SW1wbERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCh0eXBlSUQpOwotCQlJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCi0JCQlmYWN0b3J5ID0gKElDb21wb25lbnRJbXBsRmFjdG9yeSkgaW5zdGFuY2VzLmdldChkZXNjcmlwdG9yKTsKLQotCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCi0JCQkJaWYgKChmYWN0b3J5ID0gZGVzY3JpcHRvci5jcmVhdGVGYWN0b3J5KCkpICE9IG51bGwpIHsKLQkJCQkJaW5zdGFuY2VzLnB1dChkZXNjcmlwdG9yLCBmYWN0b3J5KTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZXNjcmlwdG9ycy5yZW1vdmUoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQkgCi0JcHJpdmF0ZSBJQ29tcG9uZW50SW1wbEZhY3RvcnkgZmluZEZhY3RvcnlGb3JQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQl0cnkgewotCQkJSUNvbXBvbmVudEltcGxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwkJCi0JCQkKLQkJCWlmKCAhZmFjdG9yeU1hcC5oYXNDaGFuZ2VkKHByb2plY3QpICkgewkJCQkKLQotCQkJCWlmKCBmYWN0b3J5TWFwLmhhc0NhY2hlRXJyb3IocHJvamVjdCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCQotCQkJCWlmKCBmYWN0b3J5TWFwLmhhc0NhY2hlRGF0YShwcm9qZWN0KSkgCi0JCQkJCXJldHVybiAoSUNvbXBvbmVudEltcGxGYWN0b3J5KSBmYWN0b3J5TWFwLmdldERhdGEocHJvamVjdCk7Ci0JCQl9IAotCQkJCi0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCl7Ci0JCQkJZmFjdG9yeSA9IGdldENvbXBvbmVudEltcGxGYWN0b3J5KE5PX0ZBQ0VUUyk7Ci0JCQkJZmFjdG9yeU1hcC5tYXJrKHByb2plY3QsIGZhY3RvcnkpOwotCQkJCXJldHVybiBmYWN0b3J5OwotCQkJfQotCQkJSXRlcmF0b3Iga2V5cyA9IGRlc2NyaXB0b3JzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdHlwZUlEID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJaWYodHlwZUlELmVxdWFscyhOT19GQUNFVFMpKXsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGVJRCk7Ci0JCQkJCWlmIChwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KSl7Ci0JCQkJCQlmYWN0b3J5ID0gZ2V0Q29tcG9uZW50SW1wbEZhY3RvcnkodHlwZUlEKTsKLQkJCQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJCQkJZmFjdG9yeU1hcC5tYXJrKHByb2plY3QsIGZhY3RvcnkpOwotCQkJCQkJCXJldHVybiBmYWN0b3J5OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsICJSZXR1cm5pbmcgbnVsbCBmYWN0b3J5IGZvciBwcm9qZWN0OiAiICsgcHJvamVjdCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZhY3RvcnlNYXAubWFya0Vycm9yKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkgCi0JCi0JCi0JcHVibGljIElWaXJ0dWFsRm9sZGVyIGNyZWF0ZUZvbGRlcihJUHJvamVjdCBhUHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKXsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KGFQcm9qZWN0KTsKLQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRm9sZGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSnVzdCByZXR1cm4gYSBkZWZhdWx0IGZvbGRlcgotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbEZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KHByb2plY3QpOwotCQkJaWYobnVsbCAhPSBmYWN0b3J5KXsKLQkJCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKdXN0IHJldHVybiBhIGRlZmF1bHQgY29tcG9uZW50Ci0JCX0KLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgVmlydHVhbENvbXBvbmVudChwcm9qZWN0LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlDb21wb25lbnRJbXBsRmFjdG9yeSBmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JQcm9qZWN0KGFQcm9qZWN0KTsKLQkJCWlmKG51bGwgIT0gZmFjdG9yeSl7Ci0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChhUHJvamVjdCwgYUNvbXBvbmVudE5hbWUsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKdXN0IHJldHVybiBhIGRlZmF1bHQgYXJjaGl2ZSBjb21wb25lbnQKLQkJfQotCQlyZXR1cm4gbmV3IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KGFQcm9qZWN0LCBhQ29tcG9uZW50TmFtZSwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRJbXBsRGVzY3JpcHRvciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKLQotCQlwdWJsaWMgQ29tcG9uZW50SW1wbERlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSBjb25maWdFbGVtZW50OwotCQkJdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciA8Yj5udWxsPC9iPgotCQkgKiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgaW5zdGFudGlhdGluZyB0aGUgZXh0ZW5zaW9uLgotCQkgKiAKLQkJICogQHJldHVybiBBbiB7QGxpbmsgSUFydGlmYWN0RWRpdEZhY3Rvcnl9IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBvciA8Yj5udWxsPC9iPiBpZiB0aGVyZQotCQkgKiAgICAgICAgIGFyZSBwcm9ibGVtcyBpbnN0YW50aWF0aW5nIHRoZSBleHRlbnNpb24uCi0JCSAqLwotCQlwdWJsaWMgSUNvbXBvbmVudEltcGxGYWN0b3J5IGNyZWF0ZUZhY3RvcnkoKSB7Ci0KLQkJCWZpbmFsIElDb21wb25lbnRJbXBsRmFjdG9yeVtdIGZhY3RvcnkgPSBuZXcgSUNvbXBvbmVudEltcGxGYWN0b3J5WzFdOwotCi0JCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJCU1vZHVsZWNvcmVQbHVnaW4ubG9nRXJyb3IoMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJZmFjdG9yeVswXSA9IChJQ29tcG9uZW50SW1wbEZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCX0KLQotCQkJfSk7Ci0KLQkJCXJldHVybiBmYWN0b3J5WzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSB0eXBlIGlkIG9mIHRoaXMgQXJ0aWZhY3RFZGl0IGRlZmluaXRpb24KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21wb25lbnRJbXBsUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkJcHVibGljIENvbXBvbmVudEltcGxSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBDT01QT05FTlRfSU1QTF9FWFRFTlNJT05fUE9JTlQpOwotCQl9IAotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChUQUdfQ09NUE9ORU5UX0lNUEwuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCi0JCQkJLyoKLQkJCQkgKiBCZWNhdXNlIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMgdHlwZSBpcyBjcmVhdGVkIGZyb20gYSBzdGF0aWMgc2luZ2xldG9uIGZpZWxkLCBhbmQKLQkJCQkgKiB0aGUgcmVnaXN0cnkgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoaXMgdHlwZSwgb3RoZXIgdGhyZWFkcyBjYW5ub3QKLQkJCQkgKiBjb21wZXRlIHdpdGggcmVhZEVsZW1lbnQoKSBmb3IgYWNjZXNzIHRvIDxpPmRlc2NyaXB0b3JzPC9pPgotCQkJCSAqLwotCQkJCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RZUEUpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJCWRlc2NyaXB0b3JzLnB1dChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSksIG5ldyBDb21wb25lbnRJbXBsRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQkJZWxzZQotCQkJCQlNb2R1bGVjb3JlUGx1Z2luLmxvZ0Vycm9yKDAsICJObyB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgZm9yICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCU1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi4iICsgQ09NUE9ORU5UX0lNUExfRVhURU5TSU9OX1BPSU5UICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJIiBleHRlbnNpb24gaW4gIiArIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmODMzNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLk1vZHVsZWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gX0RFQlVHID0gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL0NvbXBvbmVudFJlc29sdmVyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wyID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9TVFJJTkcgPSBQYXRoLlJPT1QudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVmFyaW91cyByZXNvbHZlcnMgZGlzYWdyZWUgb24gaG93IG1hbnkgcHJlY2VkaW5nIHNsYXNoZXMgc2hvdWxkCi0JICogYWN0dWFsbHkgYmUgdXNlZC4gT24gV2luMzIsIDIgc2xhc2hlcyByZXN1bHRzIGluIGEgVVJMIG9iamVjdCB3aGVyZSB0aGUKLQkgKiB2b2x1bWUgaXMgc3RyaXBwZWQgb3V0IG9mIHRoZSBmaWxlIHBhdGggYXMgdGhlIGhvc3QgbmFtZSwgYnV0IG9uIFVuaXggMgotCSAqIGlzIHRoZSBjb3JyZWN0IG51bWJlci4gT24gV2luMzIsIGphdmEuaW8uRmlsZS50b1VSTCBhZGRzIG9ubHkgMSBzbGFzaCwKLQkgKiBhbmQgb24gVW5peCBpdCBhZGRzIDIuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4gVGhlIElGaWxlIGZvciB0aGlzIGZpbGUgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIElGaWxlIHJlY2FsY3VsYXRlRmlsZShTdHJpbmcgdXJpKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCi0JCWxvbmcgdGltZTAgPSAtMTsKLQkJaWYgKF9ERUJVRykKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkgewotCQkJSUZpbGUgZmlsZXNbXSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb25VUkkoVVJJLmNyZWF0ZSh1cmkpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcIiIgKyB1cmkgKyAiXCIgZmluZEZpbGVzRm9yTG9jYXRpb25VUkk6IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSkgewotCQkJCWxvY2F0aW9uID0gdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wyKSkgewotCQkJCWxvY2F0aW9uID0gdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MMi5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsb2NhdGlvbiA9IHVyaTsKLQkJCX0KLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKF9ERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXCIiICsgbG9jYXRpb24gKyAiXCIgZmluZEZpbGVzRm9yTG9jYXRpb246IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoX0RFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJDb21wb25lbnRSZXNvbHZlcjogcmVzb2x2ZSBcIlt7IiArIHB1YmxpY0lkICsgIn17IiArIHN5c3RlbUlkICsgIn1dXCIgZnJvbSBcIiIgKyBiYXNlTG9jYXRpb24gKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCS8vIGFyZ3VtZW50IHNhbml0eSBjaGVja3MKLQkJLyoKLQkJICogQ2hlY2sgZm9yIGEgc3lzdGVtIHJlZmVyZW5jZTsgd2l0aG91dCBvbmUsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KLQkJICogY29udGludWluZyAod2UgY2FuJ3QgcmVzb2x2ZSBqdXN0IGEgcHVibGljIGlkZW50aWZpZXIpLgotCQkgKi8KLQkJaWYgKHN5c3RlbUlkID09IG51bGwgfHwgc3lzdGVtSWQubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChubyBzeXN0ZW0gcmVmZXJlbmNlKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qIFJlY29tcHV0ZSB0aGUgSUZpbGUsIGlmIG5lZWRlZCwgZnJvbSB0aGUgYmFzZSBsb2NhdGlvbi4gKi8KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsIHx8IGJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBjYW4ndCBwcm9jZWVkIGlmIHdlIGxhY2sgYm90aCBhbiBJRmlsZSBhbmQgYSBzeXN0ZW0KLQkJCQkgKiByZWZlcmVuY2UKLQkJCQkgKi8KLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChubyBiYXNlIGxvY2F0aW9uIG9yIGZpbGUgZ2l2ZW4pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmaWxlID0gcmVjYWxjdWxhdGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBhIHdvcmtzcGFjZSBJRmlsZSBpcyAoc3RpbGwpIG5vdCB0aGUgYmFzZSBwb2ludCBvZiByZWZlcmVuY2UsCi0JCSAqIGRvbid0IGNvbnRpbnVlLgotCQkgKi8KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChub3QgYSB3b3Jrc3BhY2UgZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgYW4gYWJzb2x1dGUgVVJMIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQl0cnkgewotCQkJVVJMIHRlc3RVUkwgPSBuZXcgVVJMKHN5c3RlbUlkKTsKLQkJCWlmICh0ZXN0VVJMICE9IG51bGwpIHsKLQkJCQlpZiAoX0RFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYWxyZWFkeSBhIFVSTCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENvbnRpbnVlIHJlc29sdmluZwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGEgVVJJIHdpdGhvdXQgYSBzY2hlbWUsIGJ1dCB3aXRoIGEgaG9zdCAqLwotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc3lzdGVtSWQpOwotCQkJaWYgKCh1cmkuZ2V0U2NoZW1lKCkgPT0gbnVsbCkgJiYgKHVyaS5nZXRIb3N0KCkgIT0gbnVsbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1c2UpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmctIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBsb2NhbCBmaWxlCi0JCX0KLQotCQkvKiBDaGVjayBmb3IgYSBzeXN0ZW0gZmlsZSBuYW1lIGFzIHRoZSBzeXN0ZW0gcmVmZXJlbmNlLiAqLwotCQlJUGF0aCBzeXN0ZW1QYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQlpZiAoc3lzdGVtUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIChyZWZlcmVuY2UgaXMgYSBzeXN0ZW0gZmlsZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlib29sZWFuIHByZXBlbmRGaWxlUHJlZml4ID0gYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gNzsKLQkJYm9vbGVhbiBwcmVwZW5kRmlsZVByZWZpeDIgPSBiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MMikgJiYgYmFzZUxvY2F0aW9uLmxlbmd0aCgpID4gODsKLQotCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gbnVsbDsKLQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgIkV4Y2VwdGlvbiBjYWxsaW5nIENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKCkiLCBlKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPbmx5IHJldHVybiByZXN1bHRzIGZvciBGbGV4aWJsZSBwcm9qZWN0cwotCQlpZiAodmlydHVhbFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoICYmIHJlc29sdmVkUGF0aCA9PSBudWxsOyBpKyspIHsKLQkJCQlJUGF0aCByZXNvbHZlZFJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCQlpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aChST09UX1BBVEhfU1RSSU5HKSkgewotCQkJCQlyZXNvbHZlZFJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoc3lzdGVtSWQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzb2x2ZWRSdW50aW1lUGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKHN5c3RlbUlkKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGaWxlKGZpbGUuZ2V0UHJvamVjdCgpLCByZXNvbHZlZFJ1bnRpbWVQYXRoKTsKLQkJCQlJRmlsZSByZXNvbHZlZEZpbGUgPSBudWxsOwotCQkJCWlmICh2aXJ0dWFsRmlsZS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJcmVzb2x2ZWRGaWxlID0gdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJlc29sdmVkRmlsZSAhPSBudWxsICYmIHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJaWYgKHByZXBlbmRGaWxlUHJlZml4KSB7Ci0JCQkJCQlyZXNvbHZlZFBhdGggPSBGSUxFX1BST1RPQ09MICsgcmVzb2x2ZWRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVwZW5kRmlsZVByZWZpeDIpIHsKLQkJCQkJCXJlc29sdmVkUGF0aCA9IEZJTEVfUFJPVE9DT0wyICsgcmVzb2x2ZWRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc29sdmVkUGF0aCA9IHJlc29sdmVkRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKG5vdCBpbiBmbGV4aWJsZSBwcm9qZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLT4gXCIiICsgcmVzb2x2ZWRQYXRoICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXNvbHZlZFBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliZDdjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50VXRpbGl0aWVzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzIENvbnRleHRSb290TWFwcGluZyA9IG5ldyBSZXNvdXJjZVRpbWVzdGFtcE1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhlIGNvbnRhaW5lciBpcyBub3QgcmVhZC1vbmx5LgotCSAqIDxwPgotCSAqIEZvciBMaW51eCwgYSBSZXNvdXJjZSBjYW5ub3QgYmUgY3JlYXRlZCBpbiBhIFJlYWRPbmx5IGZvbGRlci4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgbmV3Ci0JICogZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCi0JICogQHBsYW5uZWRmb3IgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5leGlzdHMoKSkgeyAvLyBpdCBtdXN0IGJlIG5ldwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOwotCQkJCWlmICghYXR0ci5pc1JlYWRPbmx5KCkpCi0JCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKLQkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBjcmVhdGVGb2xkZXJJbkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmb2xkZXJOYW1lICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3Rmb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChyb290Zm9sZGVyLmdldFByb2plY3QoKS5nZXROYW1lKCkpLmFwcGVuZChmb2xkZXJOYW1lKSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCVByb2plY3RVdGlsaXRpZXMuZW5zdXJlQ29udGFpbmVyTm90UmVhZE9ubHkoZm9sZGVyKTsKLQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZvbGRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCk7Ci0JCQlJQXJ0aWZhY3RFZGl0RmFjdG9yeSBmYWN0b3J5ID0gcmVhZGVyLmdldEFydGlmYWN0RWRpdChjb21wLmdldFByb2plY3QoKSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBjb21wLCBTdHJpbmcgdHlwZSkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpOwotCQkJSUFydGlmYWN0RWRpdEZhY3RvcnkgZmFjdG9yeSA9IHJlYWRlci5nZXRBcnRpZmFjdEVkaXQodHlwZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIElGaWxlIGZpbmRGaWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIElQYXRoIGFQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb21wID09IG51bGwgfHwgYVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVmlydHVhbEZvbGRlciByb290ID0gY29tcC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZmlsZSA9IHJvb3QuZmluZE1lbWJlcihhUGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFKXsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpewotCQkJCXJldHVybiAoSUZpbGUpIHJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZmluZENvbXBvbmVudChJUmVzb3VyY2UgcmVzKSB7Ci0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudClyZXMuZ2V0QWRhcHRlcihJVmlydHVhbENvbXBvbmVudC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqICoqKioqKioqKioqKioqKioqKioqKipQbGVhc2UgcmVhZCBqYXZhIGRvYyBiZWZvcmUgdXNpbmcgdGhpcyBhcGkqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBhIHZlcnkgZXhwZW5zaXZlIGFwaSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgYXMgaXQgZG9lcyBhIHN0cnVjdHVyZSBlZGl0Ci0JICogYWNjZXNzIGFuZCByZWxlYXNlIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlLiBVc2UgdGhpcyBhcGkgdmVyeSBzcGFyaW5nbHkKLQkgKiBhbmQgaWYgdXNlZCBjYWNoZWQgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoaXMgYXBpIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKLQkgKiBAcmV0dXJuIC0gQSBhbiBhcnJheSBvZiBhbGwgdmlydHVhbCBjb21wb25lbnRzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEFsbFdvcmtiZW5jaENvbXBvbmVudHMoKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcm9qZWN0cyA9IEFycmF5cy5hc0xpc3QoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJaWYoIE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QoKElQcm9qZWN0KXByb2plY3RzLmdldChpKSkpewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHdiQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClwcm9qZWN0cy5nZXQoaSkpOwotCQkJCWNvbXBvbmVudHMuYWRkKHdiQ29tcCk7Ci0JCQl9Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnRbXSB0ZW1wID0gKElWaXJ0dWFsQ29tcG9uZW50W10pIGNvbXBvbmVudHMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbY29tcG9uZW50cy5zaXplKCldKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCQotCS8qKgotCSAqICoqKioqKioqKioqKioqKioqKioqKipQbGVhc2UgcmVhZCBqYXZhIGRvYyBiZWZvcmUgdXNpbmcgdGhpcyBhcGkqKioqKioqKioqKioqKioqKioqCi0JICogVGhpcyBpcyBhIHZlcnkgZXhwZW5zaXZlIGFwaSBmcm9tIGEgcGVyZm9ybWFuY2UgcG9pbnQgYXMgaXQgZG9lcyBhIHN0cnVjdHVyZSBlZGl0Ci0JICogYWNjZXNzIGFuZCByZWxlYXNlIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlLiBVc2UgdGhpcyBhcGkgdmVyeSBzcGFyaW5nbHkKLQkgKiBhbmQgaWYgdXNlZCBjYWNoZWQgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoaXMgYXBpIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCi0JICogCi0JICogQHJldHVybiAtIEEgdmlydHVhbCBjb21wb25lbnQgaW4gdGhlIHdvcmtzcGFjZQotCSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBhbGxDb21wb25lbnRzID0gZ2V0QWxsV29ya2JlbmNoQ29tcG9uZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxDb21wb25lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpCi0JCQkJcmV0dXJuIGFsbENvbXBvbmVudHNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQotCXB1YmxpYyBzdGF0aWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKTsKLQkJCUlBcnRpZmFjdEVkaXRGYWN0b3J5IGZhY3RvcnkgPSByZWFkZXIuZ2V0QXJ0aWZhY3RFZGl0KGNvbXAuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KEVPYmplY3QgYW5PYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzID0gYW5PYmplY3QuZVJlc291cmNlKCk7Ci0JCXJldHVybiBmaW5kQ29tcG9uZW50KHJlcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBmaW5kQ29tcG9uZW50KFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShhUmVzb3VyY2UpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnQpZmlsZS5nZXRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzKTsKLQl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24gY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0vLwkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotLy8JCW1vZGVsLnNldFByb3BlcnR5KElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0vLwkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihtb2RlbCk7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkKLQkJcmV0dXJuIG5ldyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzT3AobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCBjcmVhdGVXTFBSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbiByZW1vdmVXTFBSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24oSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0IHRhcmdldENvbXBvbmVudFByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJTGlzdCBtb2RIYW5kbGVzTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJbW9kSGFuZGxlc0xpc3QuYWRkQWxsKHRhcmdldENvbXBvbmVudFByb2plY3RzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgbW9kSGFuZGxlc0xpc3QpOwotCQkKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRILCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRPcGVyYXRpb24obW9kZWwpOwotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uIHJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbihJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQsIExpc3QgdGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpIHsKLQkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBzb3VyY2VDb21wb25lbnQpOwotCQlMaXN0IG1vZEhhbmRsZXNMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQltb2RIYW5kbGVzTGlzdC5hZGRBbGwodGFyZ2V0Q29tcG9uZW50UHJvamVjdHMpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RIYW5kbGVzTGlzdCk7Ci0JCXJldHVybiBuZXcgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50T3BlcmF0aW9uKG1vZGVsKTsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0Q29tcG9uZW50cyhJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocHJvamVjdHMhPW51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwcm9qZWN0c1tpXSAhPSBudWxsKSB7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0c1tpXSk7Ci0JCQkJCWlmIChjb21wICE9IG51bGwgJiYgY29tcC5leGlzdHMoKSkKLQkJCQkJCXJlc3VsdC5hZGQoY29tcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgY29udGV4dCByb290IGZvciB0aGUgYXNzb2NpYXRlZCB3b3JrYmVuY2ggbW9kdWxlIHdoaWNoIGlzIHVzZWQKLQkgKiBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuICBUaGlzIG1ldGhvZCBpcyBub3QgeWV0IGNvbXBsZXRlZCBhcyB0aGUgY29udGV4dCByb290IGhhcyB0byBiZQotCSAqIGFic3RyYWN0ZWQgYW5kIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2hNb2R1bGUgbW9kZWwuICBUaGlzIEFQSSB3aWxsIG5vdCBjaGFuZ2UgdGhvdWdoLgotCSAqIFJldHVybnMgbnVsbCBmb3Igbm93LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBjb250ZXh0IHJvb3QgZm9yIHJ1bnRpbWUgb2YgdGhlIGFzc29jaWF0ZWQgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgcHJvamVjdCkgewkJCi0JCQotCQlpZighQ29udGV4dFJvb3RNYXBwaW5nLmhhc0NoYW5nZWQocHJvamVjdCkpIHsKLQkJCS8qU2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIGRhdGEqLwotCQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQkJaWYoIUNvbnRleHRSb290TWFwcGluZy5oYXNDYWNoZUVycm9yKHByb2plY3QpICYmIENvbnRleHRSb290TWFwcGluZy5oYXNDYWNoZURhdGEocHJvamVjdCkpCi0JCQkJZGF0YSA9IChTdHJpbmcpIENvbnRleHRSb290TWFwcGluZy5nZXREYXRhKHByb2plY3QpOwotCQkJcmV0dXJuIGRhdGE7Ci0JCX0KLQkJCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGVDb3JlID09IG51bGwgfHwgbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKSA9PSBudWxsKSB7Ci0JCQkJQ29udGV4dFJvb3RNYXBwaW5nLm1hcmtFcnJvcihwcm9qZWN0KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlMaXN0IGV4aXN0aW5nUHJvcHMgPSB3YkNvbXBvbmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdQcm9wcy5zaXplKCk7IGkrKykgewotCQkJUHJvcGVydHkgcHJvcCA9IChQcm9wZXJ0eSkgZXhpc3RpbmdQcm9wcy5nZXQoaSk7Ci0JCQlpZihwcm9wLmdldE5hbWUoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5DT05URVhUUk9PVCkpewotCQkJCUNvbnRleHRSb290TWFwcGluZy5tYXJrKHByb2plY3QsIHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQkJCi0JCUNvbnRleHRSb290TWFwcGluZy5tYXJrRXJyb3IocHJvamVjdCk7Ci0JCS8vIElmIGFsbCBlbHNlIGZhaWxzLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgY29udGV4dCByb290IG9uIHRoZSBhc3NvY2lhdGVkIHdvcmtiZW5jaCBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nCi0JICogdmFsdWUgcGFzc2VkIGluLiAgVGhpcyBjb250ZXh0IHJvb3QgaXMgdXNlZCBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuICBUaGlzIG1ldGhvZCBpcyBub3QgeWV0Ci0JICogY29tcGxldGVkIGFzIHRoZSBjb250ZXh0IHJvb3Qgc3RpbGwgbmVlZHMgdG8gYmUgYWJzdHJhY3RlZCBhbmQgYWRkZWQgdG8gdGhlIHdvcmtiZW5jaCBtb2R1bGUKLQkgKiBtb2RlbC4gIFRoaXMgQVBJIHdpbGwgbm90IGNoYW5nZSB0aG91Z2guCi0JICogRG9lcyBub3RoaW5nIGFzIG9mIG5vdy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dFJvb3Qgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWNvbXAuc2V0TWV0YVByb3BlcnR5KElNb2R1bGVDb25zdGFudHMuQ09OVEVYVFJPT1QsIGNvbnRleHRSb290KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXBsb3lVcmlPZlV0aWxDb21wb25lbnQoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKXsKLQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gcmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCk7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlpZiggYXJjaGl2ZU5hbWUgIT0gbnVsbCAmJiBhcmNoaXZlTmFtZSAhPSAiIiApeyAvLyROT04tTkxTLTEkCi0JCQl1cmkgPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKSArICIvIiArIHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX1lbHNlewotCQkJdXJpID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkgKyAiLyIgKyByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvQ29tcG9uZW50Y29yZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxNjI5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBvbmVudGNvcmVBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS42IDIwMDUvMTAvMTggMjI6Mjc6MTggY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvamVjdENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudGNvcmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9uZW50Y29yZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudGNvcmVTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQ29tcG9uZW50Y29yZVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtiZW5jaENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtiZW5jaENvbXBvbmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvbmVudFJlc291cmNlKENvbXBvbmVudFJlc291cmNlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb21wb25lbnRSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvbmVudFR5cGUoQ29tcG9uZW50VHlwZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJlZmVyZW5jZWRDb21wb25lbnQoUmVmZXJlbmNlZENvbXBvbmVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVmZXJlbmNlZENvbXBvbmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3RDb21wb25lbnRzKFByb2plY3RDb21wb25lbnRzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9qZWN0Q29tcG9uZW50c0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50IDxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UgPGVtPkNvbXBvbmVudCBSZXNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50UmVzb3VyY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRUeXBlIDxlbT5Db21wb25lbnQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb25lbnRUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQgPGVtPlJlZmVyZW5jZWQgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cyA8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9qZWN0Q29tcG9uZW50c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Db21wb25lbnRjb3JlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudGNvcmVTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudGNvcmVTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1NmFiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRjb3JlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb25lbnRjb3JlU3dpdGNoLmphdmEsdiAxLjYgMjAwNS8xMC8xOCAyMjoyNzoxOCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Y29yZVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb25lbnRjb3JlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudGNvcmVTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLldPUktCRU5DSF9DT01QT05FTlQ6IHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnQgd29ya2JlbmNoQ29tcG9uZW50ID0gKFdvcmtiZW5jaENvbXBvbmVudCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2JlbmNoQ29tcG9uZW50KHdvcmtiZW5jaENvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5DT01QT05FTlRfUkVTT1VSQ0U6IHsKLQkJCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tcG9uZW50UmVzb3VyY2UoY29tcG9uZW50UmVzb3VyY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgQ29tcG9uZW50Y29yZVBhY2thZ2UuQ09NUE9ORU5UX1RZUEU6IHsKLQkJCQlDb21wb25lbnRUeXBlIGNvbXBvbmVudFR5cGUgPSAoQ29tcG9uZW50VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlBST1BFUlRZOiB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIENvbXBvbmVudGNvcmVQYWNrYWdlLlJFRkVSRU5DRURfQ09NUE9ORU5UOiB7Ci0JCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlZmVyZW5jZWRDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBDb21wb25lbnRjb3JlUGFja2FnZS5QUk9KRUNUX0NPTVBPTkVOVFM6IHsKLQkJCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0Q29tcG9uZW50cyA9IChQcm9qZWN0Q29tcG9uZW50cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvamVjdENvbXBvbmVudHMocHJvamVjdENvbXBvbmVudHMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrYmVuY2ggQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtiZW5jaCBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdvcmtiZW5jaENvbXBvbmVudChXb3JrYmVuY2hDb21wb25lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb25lbnQgUmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9uZW50IFJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRSZXNvdXJjZShDb21wb25lbnRSZXNvdXJjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvbmVudCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wb25lbnRUeXBlKENvbXBvbmVudFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHkoUHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWZlcmVuY2VkIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVmZXJlbmNlZENvbXBvbmVudChSZWZlcmVuY2VkQ29tcG9uZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdCBDb21wb25lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3QgQ29tcG9uZW50czwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvamVjdENvbXBvbmVudHMoUHJvamVjdENvbXBvbmVudHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0NvbXBvbmVudGNvcmVTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGVuZGVuY3lUeXBlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTEyN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVR5cGVUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciBpbXBsZW1lbnRzIFdUUE1vZHVsZXNYbWxNYXBwZXJJewotCQotCXB1YmxpYyBEZXBlbmRlbmN5VHlwZVRyYW5zbGF0b3IoKXsKLQkJc3VwZXIoREVQRU5ERU5DWV9UWVBFLENvbXBvbmVudGNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0RlcGVuZGVuY3lUeXBlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlTdHJpbmcgY29ycmVjdCA9IHN0clZhbHVlOwotCQlpZiAoc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIkNPTlNVTUVTIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FU19MSVRFUkFMLmdldE5hbWUoKTsgCi0JCWVsc2UgaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJVU0VTIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSBEZXBlbmRlbmN5VHlwZS5VU0VTX0xJVEVSQUwuZ2V0TmFtZSgpOyAKLQkJCQotCQlyZXR1cm4gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoY29ycmVjdCwgb3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwbG95ZWRQYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0RlcGxveWVkUGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjQyMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvRGVwbG95ZWRQYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXBsb3llZFBhdGhQcm92aWRlciBpbXBsZW1lbnRzIElQYXRoUHJvdmlkZXIgewotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGhQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBEZXBsb3llZFBhdGhQcm92aWRlcigpOwotCQotCXByaXZhdGUgRGVwbG95ZWRQYXRoUHJvdmlkZXIoKSB7fSAKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51dGlsLklQYXRoUHJvdmlkZXIjZ2V0UGF0aChvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKENvbXBvbmVudFJlc291cmNlIGFNb2R1bGVSZXNvdXJjZSkgeyAKLQkJcmV0dXJuIGFNb2R1bGVSZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpOwotCX0KLQkKLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0VjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0VjbGlwc2VSZXNvdXJjZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkOGNiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9FY2xpcHNlUmVzb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gRWNsaXBzZVJlc291cmNlQWRhcHRlci5jbGFzczsKLQlwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsgCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gYU5vdGlmaWNhdGlvbikgewotCQlpZiAoYU5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX1NvdXJjZVBhdGgoKSkgewotCQkJaWYgKGFOb3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCXJlc291cmNlID0gbnVsbDsKLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0RWNsaXBzZVJlc291cmNlKCkgeyAKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCi0JCQkJSVByb2plY3QgY29udGFpbmVyID0gbnVsbDsKLQkJCQlDb21wb25lbnRSZXNvdXJjZSBtb2R1bGVSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgZ2V0VGFyZ2V0KCk7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IG1vZHVsZVJlc291cmNlLmdldFNvdXJjZVBhdGgoKTsKLQkJCQlpZiAobW9kdWxlUmVzb3VyY2UuZ2V0T3duaW5nUHJvamVjdCgpICE9IG51bGwpCi0JCQkJCWNvbnRhaW5lciA9IG1vZHVsZVJlc291cmNlLmdldE93bmluZ1Byb2plY3QoKTsKLQkJCQllbHNlCi0JCQkJCWNvbnRhaW5lciA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QobW9kdWxlUmVzb3VyY2UuZ2V0Q29tcG9uZW50KCkpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkKLQkJCQkJcmVzb3VyY2UgPSBjb250YWluZXIuZmluZE1lbWJlcihzb3VyY2VQYXRoKTsgCi0JCQkJaWYocmVzb3VyY2UgPT0gbnVsbCkKLQkJCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoc291cmNlUGF0aCk7ICAKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCBhVHlwZSkgewotCQlyZXR1cm4gQURBUFRFUl9UWVBFID09IGFUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0hSZWZUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9IUmVmVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmEwMTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0hSZWZUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLXB1YmxpYyBjbGFzcyBIUmVmVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgewotCi0JcHVibGljIEhSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEhSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCUVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBlQ2xhc3MpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgSFJlZlRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yUGF0aCBwYXRoKSB7Ci0JCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBIUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwKLQkJCWludCBzdHlsZSkgewotCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgYVZhbHVlLCBFT2JqZWN0IGFuT3duZXIpIHsKLQkJT2JqZWN0IHJldFZhbCA9IG51bGw7Ci0JCWlmIChhVmFsdWUgIT0gbnVsbCkKLQkJewotCQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJV29ya2JlbmNoQ29tcG9uZW50IGVhckNvbXAgPSAoV29ya2JlbmNoQ29tcG9uZW50KWFuT3duZXIuZUNvbnRhaW5lcigpOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChlYXJDb21wKSk7Ci0JCQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSAoQXJ0aWZhY3RFZGl0KXZpcnR1YWxDb21wLmdldEFkYXB0ZXIoQXJ0aWZhY3RFZGl0LmNsYXNzKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCXsKLQkJCQkJRU9iamVjdCBjb250ZW50TW9kZWxSb290ID0gZWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7IAotCQkJCQlpZiggY29udGVudE1vZGVsUm9vdCAhPSBudWxsICkKLQkJCQkJewotCQkJCQkJcmVzID0gY29udGVudE1vZGVsUm9vdC5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJCQlyZXRWYWwgPSByZXMuZ2V0RU9iamVjdChhVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKChyZXMgIT0gbnVsbCkgJiYgcmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotLy8JCQkJcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlcyk7Ci0vLwkJCQlyZXMudW5sb2FkKCk7Ci0vLwkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFuT3duZXIpIHsgCi0JCVN0cmluZyBmcmFnID0gbnVsbDsKLQkJUmVzb3VyY2UgdGhlUmVzb3VyY2UgPSAoKEVPYmplY3QpYVZhbHVlKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHRoZVJlc291cmNlICE9IG51bGwpCi0JCXsKLQkJCWlmICh0aGVSZXNvdXJjZSBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKLQkJCQlmcmFnID0gdGhlUmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoKEVPYmplY3QpYVZhbHVlKTsKLQkJCWVsc2UKLQkJCQlmcmFnID0gbnVsbDsKLQkJfQotCQllbHNlCi0JCQlmcmFnID0gRWNvcmVVdGlsLmdldElEKChFT2JqZWN0KWFWYWx1ZSk7Ci0JCXJldHVybiBmcmFnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUFydGlmYWN0RWRpdEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lBcnRpZmFjdEVkaXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWY0NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUFydGlmYWN0RWRpdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RFZGl0RmFjdG9yeSB7Ci0JCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpOwotCQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lDb21wb25lbnRJbXBsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUNvbXBvbmVudEltcGxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzNiMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSUNvbXBvbmVudEltcGxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudEltcGxGYWN0b3J5IHsKLQotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QpOwotCQotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBjcmVhdGVGb2xkZXIoSVByb2plY3QgYVByb2plY3QsIElQYXRoIGFSdW50aW1lUGF0aCk7Ci0JCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGNyZWF0ZUFyY2hpdmVDb21wb25lbnQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBhcmNoaXZlTG9jYXRpb24sIElQYXRoIGFSdW50aW1lUGF0aCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjOThkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JTW9kdWxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU0VUVElOR1MgPSAgIi5zZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT01QT05FTlRfRklMRV9OQU1FID0gIi5jb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBQYXRoIENPTVBPTkVOVF9GSUxFX1BBVEggPSBuZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1RQTU9EVUxFX0ZJTEVfTkFNRSA9ICIud3RwbW9kdWxlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFBhdGggUjFfTU9EVUxFX01FVEFfRklMRV9QQVRIID0gbmV3IFBhdGgoIi5zZXR0aW5ncy8uY29tcG9uZW50Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFBhdGggV1RQTU9EVUxFX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKFdUUE1PRFVMRV9GSUxFX05BTUUpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PRFVMRV9QTFVHX0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNT0RVTEVfTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9tb2R1bGVUeXBlcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX0VKQl9NT0RVTEUgPSAianN0LmVqYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfVVRJTElUWV9NT0RVTEUgPSAianN0LnV0aWxpdHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NUX1dFQl9NT0RVTEUgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfRUFSX01PRFVMRSA9ICJqc3QuZWFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9BUFBDTElFTlRfTU9EVUxFID0gImpzdC5hcHBjbGllbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX0NPTk5FQ1RPUl9NT0RVTEUgPSAianN0LmNvbm5lY3RvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfSkFWQSA9ICJqc3QuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVBFTkRFTlRfTU9EVUxFID0gImRlcGVuZGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvL1Byb3BlcnR5IENvbnN0YW50cwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pfUkVMX0pBVkFfT1VUUFVUX1BBVEggPSAiamF2YS1vdXRwdXQtcGF0aCI7IC8vJE5PTi1OTFMtMSQgCi0gICAgCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEVYVFJPT1QgPSAiY29udGV4dC1yb290IjsgLy8kTk9OLU5MUy0xJAotCSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lQYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lQYXRoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5ZWRkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JUGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBhdGhQcm92aWRlciB7Ci0JCi0JSVBhdGggZ2V0UGF0aChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpOwotCQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lQYXRoVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTJjYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSVBhdGhUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgSVBhdGhUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgSVBhdGhUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIGFUcmFuc2xhdG9yUGF0aCkgewotCQlzdXBlcihhRG9tUGF0aCwgYUZlYXR1cmUsIG5ldyBUcmFuc2xhdG9yUGF0aFtde2FUcmFuc2xhdG9yUGF0aH0pOwotCX0KLQkKLQlwdWJsaWMgSVBhdGhUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHRoZVRyYW5zbGF0b3JQYXRocykgewotCQlzdXBlcihhRG9tUGF0aCwgYUZlYXR1cmUsIHRoZVRyYW5zbGF0b3JQYXRocyk7Ci0JfQotCQotCXB1YmxpYyBJUGF0aFRyYW5zbGF0b3IoU3RyaW5nIGFEb21QYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBhU3R5bGVNYXNrKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgYVN0eWxlTWFzayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJcmV0dXJuIG5ldyBQYXRoKGFWYWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJaWYoYVZhbHVlIGluc3RhbmNlb2YgSVBhdGgpIAotCQkJcmV0dXJuICgoSVBhdGgpYVZhbHVlKS50b1N0cmluZygpOwotCQlyZXR1cm4gc3VwZXIuY29udmVydFZhbHVlVG9TdHJpbmcoYVZhbHVlLCBhbk93bmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL01vZHVsZUNvcmVFY2xpcHNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzZTYwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Nb2R1bGVDb3JlRWNsaXBzZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29yZUVjbGlwc2VBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgTU9EVUxFX0NPUkVfQ0xBU1MgPSBTdHJ1Y3R1cmVFZGl0LmNsYXNzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFZJUlRVQUxfQ09NUE9ORU5UX0NMQVNTID0gSVZpcnR1YWxDb21wb25lbnQuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IE1PRFVMRV9DT1JFX0NMQVNTLCBWSVJUVUFMX0NPTVBPTkVOVF9DTEFTU307Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUsIENsYXNzIGFuQWRhcHRlclR5cGUpIHsKLQkJaWYoYW5BZGFwdGVyVHlwZSA9PSBNT0RVTEVfQ09SRV9DTEFTUykKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZUVkaXQoKE1vZHVsZVN0cnVjdHVyYWxNb2RlbClhZGFwdGFibGUpOwotCQlpZihhbkFkYXB0ZXJUeXBlID09IFZJUlRVQUxfQ09NUE9ORU5UX0NMQVNTKQotCQkJcmV0dXJuIGdldENvbXBvbmVudCgoSVJlc291cmNlKWFkYXB0YWJsZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldENvbXBvbmVudChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IG51bGw7Ci0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHJldHVybiBudWxsOwotCQkJCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKG1vZHVsZUNvcmUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQlXb3JrYmVuY2hDb21wb25lbnRbXSBjb21wcyA9IG1vZHVsZUNvcmUuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkJCWlmIChjb21wcy5sZW5ndGggPiAwKQotCQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCW1vZHVsZSA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwkKLQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZSA9PSBudWxsID8gbnVsbCA6IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7IAotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvTW9kdWxlQ29yZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Nb2R1bGVDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlMzk1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9Nb2R1bGVDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1vZHVsZWNvcmVOTFMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBNb2R1bGVDb3JlTWVzc2FnZXMoKSB7Ci0JCS8vZG8gbm90IGluc3RhbnRpYXRlCi0JfQotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1vZHVsZUNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1JlYWRfRXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjcXVpcmluZ19BcnRpZmFjdEVkaXRfRm9yX1dyaXRlX0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1NvdXJjZVBhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvU291cmNlUGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzRhYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvU291cmNlUGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZVBhY2thZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGF0aFByb3ZpZGVyIGltcGxlbWVudHMgSVBhdGhQcm92aWRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFNvdXJjZVBhdGhQcm92aWRlcigpOwotCQotCXByaXZhdGUgU291cmNlUGF0aFByb3ZpZGVyKCkge30gCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudXRpbC5JUGF0aFByb3ZpZGVyI2dldFBhdGgob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLldvcmtiZW5jaENvbXBvbmVudCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChDb21wb25lbnRSZXNvdXJjZSBhTW9kdWxlUmVzb3VyY2UpIHsKLQkJcmV0dXJuIGFNb2R1bGVSZXNvdXJjZS5nZXRTb3VyY2VQYXRoKCk7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvbmVudFJlc291cmNlX1NvdXJjZVBhdGgoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9VUklUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9VUklUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzQzZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvVVJJVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUGF0aDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgZXhwZXJpbWVudGFsIHVudGlsIGZ1bGx5IGRvY3VtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVUklUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7Ci0KLQlwdWJsaWMgVVJJVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgewotCQlzdXBlcihhRG9tUGF0aCwgYUZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgVVJJVHJhbnNsYXRvcihTdHJpbmcgYURvbVBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggYVRyYW5zbGF0b3JQYXRoKSB7Ci0JCXN1cGVyKGFEb21QYXRoLCBhRmVhdHVyZSwgbmV3IFRyYW5zbGF0b3JQYXRoW117YVRyYW5zbGF0b3JQYXRofSk7Ci0JfQotCQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aFtdIHRoZVRyYW5zbGF0b3JQYXRocykgewotCQlzdXBlcihhRG9tUGF0aCwgYUZlYXR1cmUsIHRoZVRyYW5zbGF0b3JQYXRocyk7Ci0JfQotCQotCXB1YmxpYyBVUklUcmFuc2xhdG9yKFN0cmluZyBhRG9tUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgYVN0eWxlTWFzaykgewotCQlzdXBlcihhRG9tUGF0aCwgYUZlYXR1cmUsIGFTdHlsZU1hc2spOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgYVZhbHVlLCBFT2JqZWN0IGFuT3duZXIpIHsgCi0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGFWYWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCBhVmFsdWUsIEVPYmplY3QgYW5Pd25lcikgeyAKLQkJaWYoYVZhbHVlIGluc3RhbmNlb2YgVVJJKSAKLQkJCXJldHVybiAoKFVSSSlhVmFsdWUpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VmFsdWVUb1N0cmluZyhhVmFsdWUsIGFuT3duZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1dUUE1vZHVsZXNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OGFmNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5HZW5lcmljVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5JRFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgV1RQTW9kdWxlc1RyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvciBpbXBsZW1lbnRzIFdUUE1vZHVsZXNYbWxNYXBwZXJJewotCXB1YmxpYyBzdGF0aWMgV1RQTW9kdWxlc1RyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgV1RQTW9kdWxlc1RyYW5zbGF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50Y29yZVBhY2thZ2UgTU9EVUxFX0NPUkVfUEtHID0gQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFOwotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKi8KLQlwdWJsaWMgV1RQTW9kdWxlc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKFBST0pFQ1RfTU9EVUxFUywgQ29tcG9uZW50Y29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2plY3RDb21wb25lbnRzKCkpOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7Ci0JCWlmKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IGNyZWF0ZVdUUE1vZHVsZXNUcmFuc2xhdG9yKCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZVdUUE1vZHVsZXNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJCW5ldyBUcmFuc2xhdG9yKFBST0pFQ1RfVkVSU0lPTiwgTU9EVUxFX0NPUkVfUEtHLmdldFByb2plY3RDb21wb25lbnRzX1ZlcnNpb24oKSwgRE9NX0FUVFJJQlVURSksIAotCQkJCWNyZWF0ZVdCTW9kdWxlVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0UHJvamVjdENvbXBvbmVudHNfQ29tcG9uZW50cygpKQotCQl9OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVdCTW9kdWxlVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdPUktCRU5DSF9DT01QT05FTlQsIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewotCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAotCQkJLy9uZXcgVHJhbnNsYXRvcihIQU5ETEUsIE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfSGFuZGxlKCksIERPTV9BVFRSSUJVVEUpLCBSRU1PVkVEIFNJTkNFIEhBTkRMRSBTSE9VTEQgTk9XIEJFIERFUklWRUQgLU1ERQotCQkJbmV3IFRyYW5zbGF0b3IoUlVOVElNRV9OQU1FLCBNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X05hbWUoKSwgRE9NX0FUVFJJQlVURSksIAotCQkJY3JlYXRlTW9kdWxlVHlwZVRyYW5zbGF0b3IoTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9Db21wb25lbnRUeXBlKCkpLAotCQkJY3JlYXRlV0JSZXNvdXJjZVRyYW5zbGF0b3IoTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9SZXNvdXJjZXMoKSksCi0JCQljcmVhdGVEZXBlbmRlbnRNb2R1bGVUcmFuc2xhdG9yKE1PRFVMRV9DT1JFX1BLRy5nZXRXb3JrYmVuY2hDb21wb25lbnRfUmVmZXJlbmNlZENvbXBvbmVudHMoKSksCi0JCQluZXcgSVBhdGhUcmFuc2xhdG9yKE1FVEFfUkVTT1VSQ0VTLCBNT0RVTEVfQ09SRV9QS0cuZ2V0V29ya2JlbmNoQ29tcG9uZW50X01ldGFkYXRhUmVzb3VyY2VzKCkpLAotCQkJY3JlYXRlUHJvcGVydGllc1RyYW5zbGF0b3IoTU9EVUxFX0NPUkVfUEtHLmdldFdvcmtiZW5jaENvbXBvbmVudF9Qcm9wZXJ0aWVzKCkpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZU1vZHVsZVR5cGVUcmFuc2xhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhZmVhdHVyZSkgewotCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoTU9EVUxFX1RZUEUsIGFmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10gewkJCQotCQkJbmV3IFRyYW5zbGF0b3IoQ09NUE9ORU5UX1RZUEVfSUQsIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX0NvbXBvbmVudFR5cGVJZCgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBUcmFuc2xhdG9yKE1FVEFfUkVTT1VSQ0VTLCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50VHlwZV9NZXRhZGF0YVJlc291cmNlcygpKSwKLQkJCW5ldyBUcmFuc2xhdG9yKENPTVBPTkVOVF9UWVBFX1ZFUlNJT04sIE1PRFVMRV9DT1JFX1BLRy5nZXRDb21wb25lbnRUeXBlX1ZlcnNpb24oKSksCi0JCQljcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcihNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50VHlwZV9Qcm9wZXJ0aWVzKCkpCi0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUHJvcGVydGllc1RyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKXsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBST1BFUlRZLCBhZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKLQkJCW5ldyBUcmFuc2xhdG9yKFBST1BFUlRZX05BTUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRQcm9wZXJ0eV9OYW1lKCksIERPTV9BVFRSSUJVVEUgKSwKLQkJCW5ldyBUcmFuc2xhdG9yKFBST1BFUlRZX1ZBTFVFLCBNT0RVTEVfQ09SRV9QS0cuZ2V0UHJvcGVydHlfVmFsdWUoKSwgRE9NX0FUVFJJQlVURSApLAotCQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZURlcGVuZGVudE1vZHVsZVRyYW5zbGF0b3IoRVN0cnVjdHVyYWxGZWF0dXJlIGFmZWF0dXJlKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihSRUZFUkVOQ0VEX0NPTVBPTkVOVCwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7IAotCQkJbmV3IElQYXRoVHJhbnNsYXRvcihSVU5USU1FX1BBVEgsIE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X1J1bnRpbWVQYXRoKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IFVSSVRyYW5zbGF0b3IoSEFORExFLCBNT0RVTEVfQ09SRV9QS0cuZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9IYW5kbGUoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgSFJlZlRyYW5zbGF0b3IoREVQX09CSkVDVCxNT0RVTEVfQ09SRV9QS0cuZ2V0UmVmZXJlbmNlZENvbXBvbmVudF9EZXBlbmRlbnRPYmplY3QoKSksCi0JCQluZXcgVHJhbnNsYXRvcihBUkNISVZFX05BTUUsIE1PRFVMRV9DT1JFX1BLRy5nZXRSZWZlcmVuY2VkQ29tcG9uZW50X0FyY2hpdmVOYW1lKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IERlcGVuZGVuY3lUeXBlVHJhbnNsYXRvcigpCi0JCX0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVXQlJlc291cmNlVHJhbnNsYXRvcihFU3RydWN0dXJhbEZlYXR1cmUgYWZlYXR1cmUpIHsKLQkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKENPTVBPTkVOVF9SRVNPVVJDRSwgYWZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCi0JCQluZXcgSVBhdGhUcmFuc2xhdG9yKFNPVVJDRV9QQVRILCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50UmVzb3VyY2VfU291cmNlUGF0aCgpLCBET01fQVRUUklCVVRFKSwKLQkJCW5ldyBJUGF0aFRyYW5zbGF0b3IoUlVOVElNRV9QQVRILCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUnVudGltZVBhdGgoKSwgRE9NX0FUVFJJQlVURSksCi0JCQluZXcgVHJhbnNsYXRvcihSRVNPVVJDRV9UWVBFLCBNT0RVTEVfQ09SRV9QS0cuZ2V0Q29tcG9uZW50UmVzb3VyY2VfUmVzb3VyY2VUeXBlKCksIERPTV9BVFRSSUJVVEUpLAotCQkJbmV3IFRyYW5zbGF0b3IoRVhDTFVTSU9OUywgTU9EVUxFX0NPUkVfUEtHLmdldENvbXBvbmVudFJlc291cmNlX0V4Y2x1c2lvbnMoKSkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzWG1sTWFwcGVySS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvV1RQTW9kdWxlc1htbE1hcHBlckkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkOWRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9XVFBNb2R1bGVzWG1sTWFwcGVySS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdUUE1vZHVsZXNYbWxNYXBwZXJJIHsKLQlTdHJpbmcgUFJPSkVDVF9NT0RVTEVTID0gInByb2plY3QtbW9kdWxlcyI7Ly8kTk9OLU5MUy0xJCAgCi0JU3RyaW5nIFdPUktCRU5DSF9DT01QT05FTlQgPSAid2ItbW9kdWxlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFRkVSRU5DRURfQ09NUE9ORU5UID0gImRlcGVuZGVudC1tb2R1bGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09NUE9ORU5UX1JFU09VUkNFID0gIndiLXJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNT0RVTEVfVFlQRSA9ICJtb2R1bGUtdHlwZSI7Ly8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgTUVUQV9SRVNPVVJDRVMgPSAibWV0YS1yZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIENPTVBPTkVOVF9UWVBFX1ZFUlNJT04gPSAidmVyc2lvbiI7Ly8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgSEFORExFID0gImhhbmRsZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBfT0JKRUNUID0gImRlcGVuZGVudC1vYmplY3QiOy8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIE9CSkVDVFJFRiA9ICJocmVmIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFUEVOREVOQ1lfVFlQRSA9ICJkZXBlbmRlbmN5LXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX1BBVEggPSAic291cmNlLXBhdGgiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJVTlRJTUVfUEFUSCA9ICJkZXBsb3ktcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhDTFVTSU9OUyA9ICJleGNsdXNpb25zIjsvLyROT04tTkxTLTEkICAKLQlTdHJpbmcgQ09NUE9ORU5UX1RZUEVfSUQgPSAibW9kdWxlLXR5cGUtaWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJVTlRJTUVfTkFNRSA9ICJkZXBsb3ktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBST1BFUlRZX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWV9WQUxVRSA9ICJ2YWx1ZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBSRVNPVVJDRV9UWVBFID0gInJlc291cmNlLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVJDSElWRV9OQU1FPSJhcmNoaXZlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9KRUNUX1ZFUlNJT049InByb2plY3QtdmVyc2lvbiI7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9aaXBGaWxlRXhwb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1ppcEZpbGVFeHBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBhNWI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL1ppcEZpbGVFeHBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogRXhwb3J0cyByZXNvdXJjZXMgdG8gYSAuemlwIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIFppcEZpbGVFeHBvcnRlciB7Ci0JcHJpdmF0ZSBaaXBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNvbXByZXNzaW9uID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21wcmVzcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqIEBwYXJhbSBpbmNsdWRlTWFuaWZlc3RGaWxlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFppcEZpbGVFeHBvcnRlcihTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gY29tcHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdGggZGlyZWN0b3J5UGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkJZGlyZWN0b3J5UGF0aCA9IChQYXRoKSBkaXJlY3RvcnlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJRmlsZSBuZXdaaXBGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5UGF0aC50b1N0cmluZygpKTsKLQkJbmV3WmlwRmlsZS5ta2RpcnMoKTsKLQkJb3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpOwotCQl1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotCX0KLQotCS8qKgotCSAqIERvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnRseS1vcGVuIC56aXAKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBFbnRyeSB3aXRoIHRoZSBwYXNzZWQgcGF0aG5hbWUgYW5kIGNvbnRlbnRzLCBhbmQgd3JpdGUgaXQgdG8gdGhlIGN1cnJlbnQKLQkgKiBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShTdHJpbmcgcGF0aG5hbWUsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkocGF0aG5hbWUpOwotCi0JCS8vIGlmIHRoZSBjb250ZW50cyBhcmUgYmVpbmcgY29tcHJlc3NlZCB0aGVuIHdlIGdldCB0aGUgYmVsb3cgZm9yIGZyZWUuCi0JCWlmICghdXNlQ29tcHJlc3Npb24pIHsKLQkJCW5ld0VudHJ5LnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOwotCQkJbmV3RW50cnkuc2V0U2l6ZShjb250ZW50cy5sZW5ndGgpOwotCQkJQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0JCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRlbnRzKTsKLQkJCW5ld0VudHJ5LnNldENyYyhjaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlKGNvbnRlbnRzKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUZvbGRlcihTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWRlc3RpbmF0aW9uUGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoICsgJy8nOwotCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShkZXN0aW5hdGlvblBhdGgpOwotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgcGFzc2VkIHJlc291cmNlIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShJRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50U3RyZWFtID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoZmFsc2UpOwotCQkJd3JpdGUoY29udGVudFN0cmVhbSwgZGVzdGluYXRpb25QYXRoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0JCQkJY29udGVudFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWludCBjaHVua1NpemUgPSBjb250ZW50U3RyZWFtLmF2YWlsYWJsZSgpOwotCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVtjaHVua1NpemVdOwotCQkJaW50IG4gPSBjb250ZW50U3RyZWFtLnJlYWQocmVhZEJ1ZmZlcik7Ci0KLQkJCXdoaWxlIChuID4gMCkgewotCQkJCW91dHB1dC53cml0ZShyZWFkQnVmZmVyKTsKLQkJCQluID0gY29udGVudFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCW91dHB1dC5jbG9zZSgpOwotCQl9Ci0KLQkJd3JpdGUoZGVzdGluYXRpb25QYXRoLCBvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5MDRkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5tb2R1bGVjb3JlIGFwaSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPgotICAgICAgICBUaGUgQ29tcG9uZW50Q29yZSBBUEkgYWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIHRoZSBTdHJ1Y3R1cmFsIAotICAgICAgICBNZXRhbW9kZWxzIHRoYXQgZGVmaW5lIGFic3RyYWN0IG1vZHVsZXMgd2l0aGluIEVjbGlwc2UgcHJvamVjdHMuIAotICAgICAgICBUaGVzZSBtZXRhbW9kZWxzIGFyZSBleHBvc2VkIHRocm91Z2ggdGhlIFZpcnR1YWwgUGF0aCBBUEkgbGF5ZXIgCi0gICAgICAgIChzZWUgPGEgaHJlZj0iQ29tcG9uZW50Q29yZS5odG1sIj5Db21wb25lbnRDb3JlPC9hPikuIENsaWVudHMgCi0gICAgICAgIHNob3VsZCBhbHNvIHJldmlldyB0aGUgPGI+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczwvYj4KLSAgICAgICAgcGFja2FnZS4KLQkJPC9wPgotPGEgbmFtZT0idG9wIj48L2E+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCQotPGxpPgotPGEgaHJlZj0iI3N0cnVjdHVyYWwtbWV0YW1vZGVsIj5Db21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKTwvYT4gCi0JCQkJCXVzZWQgdG8gdW5kZXJzdGFuZCB3aGljaCBmaWxlcyBzaG91bGQgb3Igc2hvdWxkIG5vdCBiZSAKLQkJCQkJaW5jbHVkZWQgd2l0aGluIGEgbW9kdWxlLjwvbGk+IAotCQkJCQotPGxpPgotPGEgaHJlZj0iI2NvbnN0cmFpbnRzIj5Db25zdHJhaW50czwvYT4gZW5mb3JjZWQgYnkgdGhlIAotCQkJCQlkZXNpZ248L2xpPiAKLQkJCQkKLTxsaT4KLTxhIGhyZWY9IiNtb2R1bGUtY29yZS1leGFtcGxlcyI+VGhlIEFQSSBlbnRyeS1wb2ludDwvYT4KLTwvbGk+Ci0JCQkKLTwvdWw+Ci0JCQotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgbmFtZT0ic3RydWN0dXJhbC1tZXRhbW9kZWwiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+Q29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSk8L2ZvbnQ+PC9iPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08QlI+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSBDb21wb25lbnRDb3JlIE1ldGFtb2RlbCAoQ0NNKSBpcyBhbiBFTUYgbW9kZWwgdGhhdCBhbGxvd3MgCi0JCQl0aGUgdG9vbGluZyB0byB1bmRlcnN0YW5kIG1vc3QgcHJvamVjdCBzdHJ1Y3R1cmVzLiBFYWNoIHByb2plY3QgCi0JCQloYXMgYSBzaW5nbGUgQ0NNIHdoaWNoIGlzIHN0b3JlZCB1bmRlciB0aGUgcHJvamVjdCByb290IG5hbWVkCi0gICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgIC4gVGhlIFhNTCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgCi0gICAgICAgICAgICA8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRDb3JlLnhzZCI+Q29tcG9uZW50Q29yZSBzY2hlbWE8L2E+LgotICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaWFncmFtIGlzIGEgVU1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKLQkJCUNvbXBvbmVudENvcmUgTWV0YW1vZGVsLiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1Ymxpc2hlZCBmb3IgCi0JCQlwb3RlbnRpYWwgY29udHJpYnV0b3JzIG9mIGVkaXRvcnMsIGJ1dCB0aGUgRU1GIG1vZGVsIGlzIAotCQkJbm90IGV4cG9zZWQgZGlyZWN0bHkgYXMgQVBJLCBhbmQgY291bGQgY2hhbmdlIGluIHZpZXcgb2YgCi0JCQljaGFuZ2VzIGZvciBXVFAgMS4xLgotCQk8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Y29yZV9tb2RlbC5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogVGhlIENvbXBvbmVudCBDb3JlIE1ldGFtb2RlbDwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgRWFjaCBsb2dpY2FsIGNvbXBvbmVudCBjb250YWluZWQgaW4gdGhlIHByb2plY3QgaXMgcmVwcmVzZW50ZWQgYnkgYQotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBlbGVtZW50LiBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBkZWZpbmVzIAotICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgY29tcG9uZW50LCB0aGUgcmVzb3VyY2VzIGNvbnN1bWVkIGJ5IHRoZSAKLSAgICAgICAgICAgIG1vZHVsZSBmcm9tIHRoZSBwcm9qZWN0LCBhbmQgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50cy4gVGhlIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBpcyB2ZXJ5IGdlbmVyaWMsIGFuZCBhcyBtb2RlbGVkLCBkb2VzIAotICAgICAgICAgICAgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gb25seSBKMkVFIGFydGlmYWN0cy4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBoYXMgYQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgICwgd2hpY2ggaXMgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcnVudGltZSBmb3JtIG9mIHRoZQotICAgICAgICAgICAgY29tcG9uZW50IGlzIGNvbnN0cnVjdGVkLiBGb3IgYSB3ZWIgYXBwbGljYXRpb24sIHRoZQotICAgICAgICAgICAgPGk+bmFtZTwvaT4KLSAgICAgICAgICAgIG1pZ2h0IGJlICJNeVdlYkFwcGxpY2F0aW9uIi4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBtYXkgYmUgdW5pcXVlbHkgcmVmZXJlbmNlZCBieSBhIFVSSS4gVGhlIAotICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIFVSSSB0byBhbnkgY29tcG9uZW50IG11c3QgYmVnaW4gd2l0aCB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBwcm90b2NvbCAoImNvbXBvbmVudDoiKSwgc3BlY2lmeSBhIHN1YnByb3RvY29sICgicmVzb3VyY2V8Y2xhc3NwYXRoIikgYW5kCi0gICAgICAgICAgICB0aGVuIGEgcGF0aCB0byB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQuIEEgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiB3aXRoIHRoZQotICAgICAgICAgICAgbmFtZSAiTXlXZWJBcHBsaWNhdGlvbiIgZGVmaW5lZCBpbiBhIHByb2plY3QgbmFtZWQKLSAgICAgICAgICAgICJNeVdlYk1vZHVsZXNQcm9qZWN0IiB3b3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBmb2xsb3dpbmcgVVJJOgotICAgICAgICAgICAgImNvbXBvbmVudDovcmVzb3VyY2UvTXlXZWJNb2R1bGVzUHJvamVjdC9NeVdlYkFwcGxpY2F0aW9uIi4gQXMgYSBmdXR1cmUgCi0gICAgICAgICAgICBleHRlbnNpb24sIGEgY29tcG9uZW50IHJlZmVyZW5jZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBhIHByb2plY3QgKHBlcmhhcHMgCi0gICAgICAgICAgICBhIFV0aWxpdHkgSmFyIG9yIGFuIEVKQiBDbGllbnQgSmFyKSwgdGhlIFVSSSBtaWdodCBiZSBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgICAgICJjb21wb25lbnQ6L2NsYXNzcGF0aC9NeVdlYk1vZHVsZXNQcm9qZWN0L0N1c3RvbWVyRUpCQ2xpZW50LmphciIuIAotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGhhcyBhIDxiPkNvbXBvbmVudFR5cGU8L2I+LiBUaGUgCi0gICAgICAgICAgICA8Yj5Db21wb25lbnRUeXBlPC9iPiBkZWZpbmVzIGEgPGk+Y29tcG9uZW50VHlwZUlkPC9pPgotICAgICAgICAgICAgLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHNwZWNpZmljIGtpbmQgb2YgY29tcG9uZW50LiBUaGUgV2ViIFRvb2xzIFBsYXRmb3JtCi0gICAgICAgICAgICB1c2VzIHRoZSA8aT5jb21wb25lbnRUeXBlSWQ8L2k+Ci0gICAgICAgICAgICB0byBkZXRlcm1pbmUgaG93IHRvIHdvcmsgd2l0aCB0aGUgY29udGVudCBjb21wb25lbnQgb2YgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4KLSAgICAgICAgICAgIGFuZCBwcmVwYXJlIHRoZSBjb21wb25lbnQgZm9yIGRlcGxveW1lbnQuIFRoZSA8Yj5Db21wb25lbnRUeXBlPC9iPiBtYXkgCi0gICAgICAgICAgICBhbHNvIGRlZmluZSB0aGUgcnVudGltZS1wYXRocyBvZiBzcGVjaWFsIG1ldGFkYXRhIHJlc291cmNlcyB3aGljaCBhcmUgCi0gICAgICAgICAgICBpbXBvcnRhbnQgdG8gdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4uICJNZXRhZGF0YSIgcmVmZXJzIHRvIHJlc291cmNlcyAKLSAgICAgICAgICAgIHdoaWNoIGV4cGxhaW4gdGhlIGNvbnRlbnQgZGV0YWlscyBvZiB0aGUgc3BlY2lmaWMgbW9kdWxlcy4gQW4gZXhhbXBsZSBvZiAKLSAgICAgICAgICAgIHN1Y2ggYSBmaWxlIHdvdWxkIGJlIHRoZSAiV0VCLUlORi93ZWIueG1sIiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIAotICAgICAgICAgICAgV2ViIEFwcGxpY2F0aW9ucy4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBjb250YWlucyBhIGxpc3Qgb2YgQ29tcG9uZW50UmVzb3VyY2VzLiBFYWNoCi0gICAgICAgICAgICA8Yj5Db21wb25lbnRSZXNvdXJjZTwvYj4gaGFzICJzb3VyY2VQYXRoIiBhbmQgYSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAicnVudGltZVBhdGgiLiBUaGUgInNvdXJjZVBhdGgiIGNhbiByZWZlcmVuY2UgZWl0aGVyIGEgZmlsZSBvciBmb2xkZXIsCi0gICAgICAgICAgICBidXQgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UgbXVzdCBiZSBjb250YWluZWQgaW4gdGhlIHNhbWUgcHJvamVjdCBhcyB0aGUKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gZGVmaW5pdGlvbi4gVGhlICJydW50aW1lUGF0aCIgc3BlY2lmaWVzIGEgbG9jYXRpb24KLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBkZXBsb3llZCBzdHJ1Y3R1cmUgb2YgdGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gd2hlcmUgdGhlCi0gICAgICAgICAgICBjb250ZW50cyBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZSB3aWxsIGJlIHJlcHJlc2VudGVkIHdoZW4gdGhlIG1vZHVsZSBpcwotICAgICAgICAgICAgcHJlcGFyZWQgZm9yIHJ1bnRpbWUuCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+cy4gCi0gICAgICAgICAgICBFYWNoIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+IHByb3ZpZGVzIGEgaGFuZGxlIHRoYXQgbXVzdCByZXNvbHZlIHRvIGEgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhIHJ1bnRpbWVQYXRoIHRoYXQgZGVmaW5lcyB3aGVyZSB0aGUgY29uc3RydWN0ZWQgCi0gICAgICAgICAgICBjb21wb25lbnQgd2lsbCBiZSBwbGFjZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBydW50aW1lIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiwgYW5kIGEgPGI+RGVwZW5kZW5jeVR5cGU8L2I+Ci0gICAgICAgICAgICB0aGF0IGNhbiBiZSBlaXRoZXIgImNvbnN1bWUiIG9yICJ1c2UiIHRvIGluZGljYXRlIGhvdyB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoYXQgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gc2hvdWxkIGJlIGFic29yYmVkIGJ5IHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LgotICAgICAgICAgICAgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zIG1heSByZWZlcmVuY2UgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgaW4gCi0gICAgICAgICAgICBvdGhlciBwcm9qZWN0cyBhbmQgb24gY3VycmVudCBwcm9qZWN0J3MgY2xhc3NwYXRoIChOb3QgeWV0IGltcGxlbWVudGVkKS4gCi0gICAgICAgICAgICBUaGUgPGI+RGVwZW5kZW5jeVR5cGU8L2I+IHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICB0aGUgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gYXJlIGFic29yYmVkIGFzLWlzIG9yIGFyY2hpdmVkIGludG8gYSAqLnt3fGp8ZX1hcgotICAgICAgICAgICAgZmlsZS4KLSAgICAgICAgPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+Ci0gICAgICAgICAgICBUaGUgPGI+UHJvamVjdENvbXBvbmVudHM8L2I+IG9iamVjdCBwcm92aWRlcyBhIHJvb3QgY29udGFpbmVyIGZvciBhbGwKLSAgICAgICAgICAgIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj5zIGRlZmluZWQgaW4gYSBnaXZlbiBwcm9qZWN0LgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLSAgICAgICAgICAgIAotPGI+Q29tcG9uZW50Q29yZTwvYj4gcHJvdmlkZXMgYSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGZvcgotICAgICAgICAgICAgY2xpZW50cy4gU3RhdGljIG1ldGhvZHMKLSAgICAgICAgICAgIDxjb2RlPk1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvclJlYWQoKTwvY29kZT4KLSAgICAgICAgICAgIGFuZAotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoKTwvY29kZT4KLSAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGFjcXVpcmUgYW4gTW9kdWxlQ29yZSBhZGFwdGVyLCBhbmQgY2xpZW50cyBhcmUgcmVzcG9uc2libGUKLSAgICAgICAgICAgIGZvciBpbnZva2luZwotICAgICAgICAgICAgPGNvZGU+ZGlzcG9zZSgpPC9jb2RlPgotICAgICAgICAgICAgd2hlbmV2ZXIgdGhleSBhcmUgZmluaXNoZWQgdXNpbmcgdGhlIG1vZGVsLgotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08YSBocmVmPSIjdG9wIj50b3A8L2E+PGEgbmFtZT0iY29uc3RyYWludHMiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+Q29uc3RyYWludHMgZW5mb3JjZWQgYnkgdGhlIENDTTwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgZW5mb3JjZWQgYnkgdGhlIG1vZGVsOgotICAgICAgICAgICAgPG9sPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGNoZWNrIGRlcGVuZGVuY2llcyBmb3IgY29tcG9uZW50cyB0aGF0IGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBzYW1lIHByb2plY3QuIFRvIGdldCB0aGUgZnVsbCBiZW5lZml0cyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXItY29tcG9uZW50IGRlcGVuZGVuY3kgY2hlY2tpbmcsIGNvbXBvbmVudHMgbXVzdCBiZSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGludG8gZGlmZmVyZW50IHByb2plY3RzLiBXZSBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGV4aWJpbGl0eSBpbiBjb25zdHJ1Y3RpbmcgYW5kIHNjb3BpbmcgY2xhc3NwYXRocyBvbiBhIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGdyYW51bGFyIHRoYW4gdGhlIHByb2plY3QgbGV2ZWwsIHdoaWNoIHdvdWxkIGJlIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgYSBzaW5nbGUgY29tcG9uZW50IHRvIHNwYW4gbW9yZSB0aGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBvbmUgcHJvamVjdC4gV2l0aGluIHRoYXQgcHJvamVjdCwgd2Ugd2lsbCBoYXZlIGZhaXJseSBicm9hZAotICAgICAgICAgICAgICAgICAgICAgICAgZmxleGliaWxpdHkgdG8gc3BlY2lmeSB3aGljaCByZXNvdXJjZXMgbWFwIHRvIHdoaWNoIGNvbXBvbmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBFYWNoIGNvbXBvbmVudCB3aXRoaW4gYSBwcm9qZWN0IG11c3QgaGF2ZSBpdHMgb3duIHNvdXJjZSBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBidXQgYSBjb21wb25lbnQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2UgZm9sZGVyLiBFYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZm9sZGVyIG1heSBiZSBjb250YWluZWQgYnkgYXQgbW9zdCBvbmUgY29tcG9uZW50LiBDb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXkgcmVmZXJlbmNlIGRlcGVuZGVudCBjb21wb25lbnRzIGluIG90aGVyIHByb2plY3RzIChzbyBhIFdlYgotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gbWF5IHJlZmVyZW5jZSBhIFdlYiBMaWJyYXJ5IG91dHNpZGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIFdlYiBBcHBsaWNhdGlvbikuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAgICAgCi08bGk+Ci0gICAgICAgICAgICAgICAgICAgIAotPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc29sdXRpb24gd2lsbCBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBzZXJ2ZXIgdGFyZ2V0IHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IChhbmQgcmVhbGx5IHBlci1wcm9qZWN0KSBhdCBhIHRpbWUuIFRoZSBhYmlsaXR5IHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggdGhpcyBzZXJ2ZXIgdGFyZ2V0ICh2aWEgc29tZSBhY3Rpb24gb3IgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpIHdpbGwgY29udGludWUgdG8gYmUgcG9zc2libGUuIFVzZXJzIHRoYXQgbmVlZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkgdG8gZGV2ZWxvcCBmb3IgbXVsdGlwbGUgc2VydmVyIHRhcmdldHMgd2lsbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBtYW51YWxseSBzd2l0Y2ggYW5kIHRlc3QgYXMgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgCi08L2xpPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb21wb25lbnQgaW4gYSBwcm9qZWN0IG1heSBoYXZlIGl0cyBvd24gb3V0cHV0IGZvbGRlcgotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0ZWQgZm9yIGl0LiBUaGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgd2lsbCBtYXRjaCB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uIG91dHB1dCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGUgY29tcG9uZW50IHR5cGUgKGZvciBKMkVFIG1vZHVsZXMpLiBBIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciB3aWxsIGhhbmRsZSB0aGlzIHJlc3BvbnNpYmlsaXR5IGFuZCB3b3JrCi0gICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGl2ZWx5IHdpdGggdGhlIEphdmEgYnVpbGRlciB0byBjb25zdHJ1Y3QgYQotICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95YWJsZSwgb24tZGlzayByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gd2lsbCBmb2xsb3cgdGhpcyBwYXR0ZXJuLCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICBob29rcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHZhcnkgdGhpcyBiZWhhdmlvci4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuZWNlc3NpdHkgZm9yIHRoaXMgb24tZGlzayBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYQotICAgICAgICAgICAgICAgICAgICAgICAgSjJFRS1jb21wbGlhbnQgbGF5b3V0IGlzIG1vdGl2YXRlZCBieSB0aGUgcmVxdWlyZW1lbnQgdG8gaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4td29ya2JlbmNoIHRlc3RpbmcsIHNvIHRoYXQgdXNlcnMgd2lsbCBub3QgaGF2ZSB0byBkZWFsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgZGVwbG95ZXIgYWN0dWFsbHkgY29uc3RydWN0aW5nIGEgZGVwbG95YWJsZSBtb2R1bGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZyBpdCBvZmYgdG8gYSBzZXJ2ZXIgdG8gdGVzdCB0aGVpciBjb2RlLiBUaGlzIGFwcHJvYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zaXN0ZW50IHdpdGggZXhpc3RpbmcgQW50LWJhc2VkIGFwcHJvYWNoZXMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBTZXJ2ZXJzIHdoaWNoIGNhbiBydW4gaW4gYSAiZGVidWciIG1vZGUgb24gZGlzay4KLSAgICAgICAgICAgICAgICAgICAgICAgIE91ciB2YWx1ZS1hZGQgd2lsbCBiZSBncmVhdGVyIGF1dG9tYXRpb24gYW5kIGludGVncmF0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggLS0gcGFydGljdWxhcmx5IGZvciBpbmNyZW1lbnRhbCBiYXNlZCBzdXBwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpYWxpemVkIG1vZHVsZSBidWlsZGVyIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Ugd2FzIGFscmVhZHkgaW4gdGhlIGFwcHJvcHJpYXRlIEoyRUUgc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxpYW50IHN0cnVjdHVyZS4gVGhlIGRlZmF1bHQgY3JlYXRpb24gd2lsbCBzdGlsbAotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VyYWdlIGEgc2luZ2xlIG1vZHVsZSBwZXIgcHJvamVjdCwgd2hpY2ggY29uZm9ybXMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0IEoyRUUgc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgCi08L2xpPgotICAgICAgICAgICAgICAgIAotPGxpPgotICAgICAgICAgICAgICAgICAgICAKLTxwPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50cyB3aWxsIGJlIGRlc2NyaWJlZCB1c2luZyBhIHNpbXBsZSBYTUwgZm9ybWF0LCBhbmQgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCB3aWxsIGNvbnRhaW4gb25lCi0gICAgICAgICAgICAgICAgICAgICAgICA8ST4ud3RwbW9kdWxlczwvST4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGhhdCB3aWxsIGRlc2NyaWJlIGFsbCBvZiB0aGUgY29tcG9uZW50cyBmb3IgdGhhdCBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGxldmVsIG9mIHRvb2xpbmcgdG8gaGVscCB1c2VycyBjcmVhdGUgdGhlc2UgZmlsZXMgaXMgeWV0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBkZXRlcm1pbmVkIGZvciBXVFAgTTQuIFRoaXMgd291bGQgYmUgYSBncmVhdCBhcmVhIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIHRvIHN1Z2dlc3QgYW5kIHByb3ZpZGUgdG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gYSBXaXphcmQgb3IgRWRpdG9yKSB0byBjcmVhdGUgdGhlc2UgZmlsZXMgZnJvbSBleGlzdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcy4gQSBzY2hlbWEgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcnMgdGhhdCB3YW50IHRvIGJ1aWxkIHRoZWlyIG93bgotICAgICAgICAgICAgICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAgICAgICAgICAgICBieSBoYW5kIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBjb250ZW50IGFzc2lzdCBpbiB0aGUgWE1MCi0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuCi0gICAgICAgICAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgICAgICAKLTwvbGk+Ci0gICAgICAgICAgICAKLTwvb2w+Ci0gICAgICAgIAotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGEgaHJlZj0iI3RvcCI+dG9wPC9hPjxhIG5hbWU9Im1vZHVsZS1jb3JlLWV4YW1wbGVzIj48L2E+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI1IiBjZWxscGFkZGluZz0iMiIgYm9yZGVyPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgYmdjb2xvcj0iIzAwODBjMCIgYWxpZ249ImxlZnQiIGNvbHNwYW49IjIiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSIgY29sb3I9IiNmZmZmZmYiPkNvbXBvbmVudENvcmUgQVBJOiBXb3JraW5nIHdpdGggdGhlIG1ldGFtb2RlbDwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxCUj4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotCQkJQ29tcG9uZW50Q29yZSB1c2VzIGEgaGFuZGxlIGJhc2VkIG1vZGVsIG11Y2ggbGlrZSB0aGUgZXhpc3RpbmcgUGxhdGZvcm0gCi0JCQlSZXNvdXJjZSBtb2RlbC4gVGhlIENvbXBvbmVudENvcmUgZmFjYWRlIGlzIG5vdCB0aWVkIHRvIGFueSBwcm9qZWN0LCBhbmQgCi0JCQl0aGUgaGFuZGxlcyB0aGF0IGl0IHJldHVybnMgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSBjb21wbGV4aXR5IG9mIAotCQkJbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcgRU1GIG1vZGVsIGlzIGhhbmRsZWQgdW5kZXIgdGhlIGNvdmVyIGZvciB1c2Vycy4gCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSBjZWxscGFkZGluZz0iMTAiIGNlbGxzcGFjaW5nPSIxMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLTxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9vdmVydmlldy9jb21wb25lbnRjb3JlX3BhY2thZ2UuanBnIj48L3A+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxwPgotPGk+RmlndXJlIDI6IFRoZSBDb21wb25lbnRDb3JlIEFQSTwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YzAwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8bWV0YQotICAgICAgICAgICAgbmFtZT0icm9vdCIKLSAgICAgICAgICAgIGNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLyIgLz4KLSAgICAgICAgPHRpdGxlPm1vZHVsZWNvcmUgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFN0cnVjdHVyYWwgCi0gICAgICAgIE1ldGFtb2RlbHMgdGhhdCBkZWZpbmUgYWJzdHJhY3QgbW9kdWxlcyB3aXRoaW4gRWNsaXBzZSBwcm9qZWN0cy4gCi0gICAgICAgIFRoZXNlIG1ldGFtb2RlbHMgYXJlIGV4cG9zZWQgdGhyb3VnaCB0aGUgVmlydHVhbCBQYXRoIEFQSSBsYXllciAKLSAgICAgICAgKHNlZSA8YSBocmVmPSJDb21wb25lbnRDb3JlLmh0bWwiPkNvbXBvbmVudENvcmU8L2E+KS4gQ2xpZW50cyAKLSAgICAgICAgc2hvdWxkIGFsc28gcmV2aWV3IHRoZSA8Yj5vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzPC9iPgotICAgICAgICBwYWNrYWdlLgotCQk8L2Fic3RyYWN0PgotCi0JCTxhIG5hbWU9InRvcCIvPgotCQk8cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCTxsaT48YSBocmVmPSIjc3RydWN0dXJhbC1tZXRhbW9kZWwiPkNvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pPC9hPiAKLQkJCQkJdXNlZCB0byB1bmRlcnN0YW5kIHdoaWNoIGZpbGVzIHNob3VsZCBvciBzaG91bGQgbm90IGJlIAotCQkJCQlpbmNsdWRlZCB3aXRoaW4gYSBtb2R1bGUuPC9saT4gCi0JCQkJPGxpPjxhIGhyZWY9IiNjb25zdHJhaW50cyI+Q29uc3RyYWludHM8L2E+IGVuZm9yY2VkIGJ5IHRoZSAKLQkJCQkJZGVzaWduPC9saT4gCi0JCQkJPGxpPjxhIGhyZWY9IiNtb2R1bGUtY29yZS1leGFtcGxlcyI+VGhlIEFQSSBlbnRyeS1wb2ludDwvYT48L2xpPgotCQkJPC91bD4KLQkJPC9wPgotCQk8YSBuYW1lPSJzdHJ1Y3R1cmFsLW1ldGFtb2RlbCIvPgotICAgICAgICA8aDI+Q29tcG9uZW50Q29yZSBNZXRhbW9kZWwgKENDTSk8L2gyPgotICAgICAgICA8QlIgLz4gCi0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIENvbXBvbmVudENvcmUgTWV0YW1vZGVsIChDQ00pIGlzIGFuIEVNRiBtb2RlbCB0aGF0IGFsbG93cyAKLQkJCXRoZSB0b29saW5nIHRvIHVuZGVyc3RhbmQgbW9zdCBwcm9qZWN0IHN0cnVjdHVyZXMuIEVhY2ggcHJvamVjdCAKLQkJCWhhcyBhIHNpbmdsZSBDQ00gd2hpY2ggaXMgc3RvcmVkIHVuZGVyIHRoZSBwcm9qZWN0IHJvb3QgbmFtZWQKLSAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgLiBUaGUgWE1MIGZvcm1hdCBpcyBkZWZpbmVkIGJ5IHRoZSAKLSAgICAgICAgICAgIDxhIGhyZWY9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudENvcmUueHNkIj5Db21wb25lbnRDb3JlIHNjaGVtYTwvYT4uCi0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaXMgYSBVTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIAotCQkJQ29tcG9uZW50Q29yZSBNZXRhbW9kZWwuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHVibGlzaGVkIGZvciAKLQkJCXBvdGVudGlhbCBjb250cmlidXRvcnMgb2YgZWRpdG9ycywgYnV0IHRoZSBFTUYgbW9kZWwgaXMgCi0JCQlub3QgZXhwb3NlZCBkaXJlY3RseSBhcyBBUEksIGFuZCBjb3VsZCBjaGFuZ2UgaW4gdmlldyBvZiAKLQkJCWNoYW5nZXMgZm9yIFdUUCAxLjEuCi0JCTwvcD4JICAKLQkJPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L2NvbXBvbmVudGNvcmVfbW9kZWwuanBnIiBjYXB0aW9uPSJUaGUgQ29tcG9uZW50IENvcmUgTWV0YW1vZGVsIiAvPiAKLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBFYWNoIGxvZ2ljYWwgY29tcG9uZW50IGNvbnRhaW5lZCBpbiB0aGUgcHJvamVjdCBpcyByZXByZXNlbnRlZCBieSBhCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGVsZW1lbnQuIFRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGRlZmluZXMgCi0gICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBjb21wb25lbnQsIHRoZSByZXNvdXJjZXMgY29uc3VtZWQgYnkgdGhlIAotICAgICAgICAgICAgbW9kdWxlIGZyb20gdGhlIHByb2plY3QsIGFuZCB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnRzLiBUaGUgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGlzIHZlcnkgZ2VuZXJpYywgYW5kIGFzIG1vZGVsZWQsIGRvZXMgCi0gICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBvbmx5IEoyRUUgYXJ0aWZhY3RzLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaGFzIGEKLSAgICAgICAgICAgIDxpPm5hbWU8L2k+Ci0gICAgICAgICAgICAsIHdoaWNoIGlzIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHJ1bnRpbWUgZm9ybSBvZiB0aGUKLSAgICAgICAgICAgIGNvbXBvbmVudCBpcyBjb25zdHJ1Y3RlZC4gRm9yIGEgd2ViIGFwcGxpY2F0aW9uLCB0aGUKLSAgICAgICAgICAgIDxpPm5hbWU8L2k+Ci0gICAgICAgICAgICBtaWdodCBiZSAiTXlXZWJBcHBsaWNhdGlvbiIuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiBtYXkgYmUgdW5pcXVlbHkgcmVmZXJlbmNlZCBieSBhIFVSSS4gVGhlIAotICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIFVSSSB0byBhbnkgY29tcG9uZW50IG11c3QgYmVnaW4gd2l0aCB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBwcm90b2NvbCAoImNvbXBvbmVudDoiKSwgc3BlY2lmeSBhIHN1YnByb3RvY29sICgicmVzb3VyY2V8Y2xhc3NwYXRoIikgYW5kCi0gICAgICAgICAgICB0aGVuIGEgcGF0aCB0byB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQuIEEgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiB3aXRoIHRoZQotICAgICAgICAgICAgbmFtZSAiTXlXZWJBcHBsaWNhdGlvbiIgZGVmaW5lZCBpbiBhIHByb2plY3QgbmFtZWQKLSAgICAgICAgICAgICJNeVdlYk1vZHVsZXNQcm9qZWN0IiB3b3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBmb2xsb3dpbmcgVVJJOgotICAgICAgICAgICAgImNvbXBvbmVudDovcmVzb3VyY2UvTXlXZWJNb2R1bGVzUHJvamVjdC9NeVdlYkFwcGxpY2F0aW9uIi4gQXMgYSBmdXR1cmUgCi0gICAgICAgICAgICBleHRlbnNpb24sIGEgY29tcG9uZW50IHJlZmVyZW5jZWQgb24gdGhlIGNsYXNzcGF0aCBvZiBhIHByb2plY3QgKHBlcmhhcHMgCi0gICAgICAgICAgICBhIFV0aWxpdHkgSmFyIG9yIGFuIEVKQiBDbGllbnQgSmFyKSwgdGhlIFVSSSBtaWdodCBiZSBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgICAgICJjb21wb25lbnQ6L2NsYXNzcGF0aC9NeVdlYk1vZHVsZXNQcm9qZWN0L0N1c3RvbWVyRUpCQ2xpZW50LmphciIuIAotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gaGFzIGEgPGI+Q29tcG9uZW50VHlwZTwvYj4uIFRoZSAKLSAgICAgICAgICAgIDxiPkNvbXBvbmVudFR5cGU8L2I+IGRlZmluZXMgYSA8aT5jb21wb25lbnRUeXBlSWQ8L2k+Ci0gICAgICAgICAgICAsIHdoaWNoIGluZGljYXRlcyB0aGUgc3BlY2lmaWMga2luZCBvZiBjb21wb25lbnQuIFRoZSBXZWIgVG9vbHMgUGxhdGZvcm0KLSAgICAgICAgICAgIHVzZXMgdGhlIDxpPmNvbXBvbmVudFR5cGVJZDwvaT4KLSAgICAgICAgICAgIHRvIGRldGVybWluZSBob3cgdG8gd29yayB3aXRoIHRoZSBjb250ZW50IGNvbXBvbmVudCBvZiB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPgotICAgICAgICAgICAgYW5kIHByZXBhcmUgdGhlIGNvbXBvbmVudCBmb3IgZGVwbG95bWVudC4gVGhlIDxiPkNvbXBvbmVudFR5cGU8L2I+IG1heSAKLSAgICAgICAgICAgIGFsc28gZGVmaW5lIHRoZSBydW50aW1lLXBhdGhzIG9mIHNwZWNpYWwgbWV0YWRhdGEgcmVzb3VyY2VzIHdoaWNoIGFyZSAKLSAgICAgICAgICAgIGltcG9ydGFudCB0byB0aGUgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPi4gIk1ldGFkYXRhIiByZWZlcnMgdG8gcmVzb3VyY2VzIAotICAgICAgICAgICAgd2hpY2ggZXhwbGFpbiB0aGUgY29udGVudCBkZXRhaWxzIG9mIHRoZSBzcGVjaWZpYyBtb2R1bGVzLiBBbiBleGFtcGxlIG9mIAotICAgICAgICAgICAgc3VjaCBhIGZpbGUgd291bGQgYmUgdGhlICJXRUItSU5GL3dlYi54bWwiIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgCi0gICAgICAgICAgICBXZWIgQXBwbGljYXRpb25zLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIENvbXBvbmVudFJlc291cmNlcy4gRWFjaAotICAgICAgICAgICAgPGI+Q29tcG9uZW50UmVzb3VyY2U8L2I+IGhhcyAic291cmNlUGF0aCIgYW5kIGEgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgInJ1bnRpbWVQYXRoIi4gVGhlICJzb3VyY2VQYXRoIiBjYW4gcmVmZXJlbmNlIGVpdGhlciBhIGZpbGUgb3IgZm9sZGVyLAotICAgICAgICAgICAgYnV0IHRoZSByZWZlcmVuY2VkIHJlc291cmNlIG11c3QgYmUgY29udGFpbmVkIGluIHRoZSBzYW1lIHByb2plY3QgYXMgdGhlCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IGRlZmluaXRpb24uIFRoZSAicnVudGltZVBhdGgiIHNwZWNpZmllcyBhIGxvY2F0aW9uCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgZGVwbG95ZWQgc3RydWN0dXJlIG9mIHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+IHdoZXJlIHRoZQotICAgICAgICAgICAgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2Ugd2lsbCBiZSByZXByZXNlbnRlZCB3aGVuIHRoZSBtb2R1bGUgaXMKLSAgICAgICAgICAgIHByZXBhcmVkIGZvciBydW50aW1lLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgVGhlIDxiPldvcmtiZW5jaENvbXBvbmVudDwvYj4gY29udGFpbnMgYSBsaXN0IG9mIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+cy4gCi0gICAgICAgICAgICBFYWNoIDxiPlJlZmVyZW5jZWRDb21wb25lbnQ8L2I+IHByb3ZpZGVzIGEgaGFuZGxlIHRoYXQgbXVzdCByZXNvbHZlIHRvIGEgCi0gICAgICAgICAgICA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LCBhIHJ1bnRpbWVQYXRoIHRoYXQgZGVmaW5lcyB3aGVyZSB0aGUgY29uc3RydWN0ZWQgCi0gICAgICAgICAgICBjb21wb25lbnQgd2lsbCBiZSBwbGFjZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBydW50aW1lIAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPiwgYW5kIGEgPGI+RGVwZW5kZW5jeVR5cGU8L2I+Ci0gICAgICAgICAgICB0aGF0IGNhbiBiZSBlaXRoZXIgImNvbnN1bWUiIG9yICJ1c2UiIHRvIGluZGljYXRlIGhvdyB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoYXQgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gc2hvdWxkIGJlIGFic29yYmVkIGJ5IHRoZSA8Yj5Xb3JrYmVuY2hDb21wb25lbnQ8L2I+LgotICAgICAgICAgICAgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj5zIG1heSByZWZlcmVuY2UgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgaW4gCi0gICAgICAgICAgICBvdGhlciBwcm9qZWN0cyBhbmQgb24gY3VycmVudCBwcm9qZWN0J3MgY2xhc3NwYXRoIChOb3QgeWV0IGltcGxlbWVudGVkKS4gCi0gICAgICAgICAgICBUaGUgPGI+RGVwZW5kZW5jeVR5cGU8L2I+IHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mCi0gICAgICAgICAgICB0aGUgPGI+UmVmZXJlbmNlZENvbXBvbmVudDwvYj4gYXJlIGFic29yYmVkIGFzLWlzIG9yIGFyY2hpdmVkIGludG8gYSAqLnt3fGp8ZX1hcgotICAgICAgICAgICAgZmlsZS4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIFRoZSA8Yj5Qcm9qZWN0Q29tcG9uZW50czwvYj4gb2JqZWN0IHByb3ZpZGVzIGEgcm9vdCBjb250YWluZXIgZm9yIGFsbAotICAgICAgICAgICAgPGI+V29ya2JlbmNoQ29tcG9uZW50PC9iPnMgZGVmaW5lZCBpbiBhIGdpdmVuIHByb2plY3QuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICA8Yj5Db21wb25lbnRDb3JlPC9iPiBwcm92aWRlcyBhIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgZm9yCi0gICAgICAgICAgICBjbGllbnRzLiBTdGF0aWMgbWV0aG9kcwotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yUmVhZCgpPC9jb2RlPgotICAgICAgICAgICAgYW5kCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZSgpPC9jb2RlPgotICAgICAgICAgICAgbWF5IGJlIHVzZWQgdG8gYWNxdWlyZSBhbiBNb2R1bGVDb3JlIGFkYXB0ZXIsIGFuZCBjbGllbnRzIGFyZSByZXNwb25zaWJsZQotICAgICAgICAgICAgZm9yIGludm9raW5nCi0gICAgICAgICAgICA8Y29kZT5kaXNwb3NlKCk8L2NvZGU+Ci0gICAgICAgICAgICB3aGVuZXZlciB0aGV5IGFyZSBmaW5pc2hlZCB1c2luZyB0aGUgbW9kZWwuCi0gICAgICAgIDwvcD4gIAotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0JCTxhIG5hbWU9ImNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxoMj5Db25zdHJhaW50cyBlbmZvcmNlZCBieSB0aGUgQ0NNPC9oMj4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBlbmZvcmNlZCBieSB0aGUgbW9kZWw6Ci0gICAgICAgICAgICA8b2w+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzb2x1dGlvbiB3aWxsIG5vdCBjaGVjayBkZXBlbmRlbmNpZXMgZm9yIGNvbXBvbmVudHMgdGhhdCBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgc2FtZSBwcm9qZWN0LiBUbyBnZXQgdGhlIGZ1bGwgYmVuZWZpdHMgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVyLWNvbXBvbmVudCBkZXBlbmRlbmN5IGNoZWNraW5nLCBjb21wb25lbnRzIG11c3QgYmUgc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGRpZmZlcmVudCBwcm9qZWN0cy4gV2UgZG8gbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICAgICAgZmxleGliaWxpdHkgaW4gY29uc3RydWN0aW5nIGFuZCBzY29waW5nIGNsYXNzcGF0aHMgb24gYSBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBncmFudWxhciB0aGFuIHRoZSBwcm9qZWN0IGxldmVsLCB3aGljaCB3b3VsZCBiZSBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGFsbG93IGEgc2luZ2xlIGNvbXBvbmVudCB0byBzcGFuIG1vcmUgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICAgb25lIHByb2plY3QuIFdpdGhpbiB0aGF0IHByb2plY3QsIHdlIHdpbGwgaGF2ZSBmYWlybHkgYnJvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhpYmlsaXR5IHRvIHNwZWNpZnkgd2hpY2ggcmVzb3VyY2VzIG1hcCB0byB3aGljaCBjb21wb25lbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb21wb25lbnQgd2l0aGluIGEgcHJvamVjdCBtdXN0IGhhdmUgaXRzIG93biBzb3VyY2UgZm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGEgY29tcG9uZW50IG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgc291cmNlIGZvbGRlci4gRWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZvbGRlciBtYXkgYmUgY29udGFpbmVkIGJ5IGF0IG1vc3Qgb25lIGNvbXBvbmVudC4gQ29tcG9uZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IHJlZmVyZW5jZSBkZXBlbmRlbnQgY29tcG9uZW50cyBpbiBvdGhlciBwcm9qZWN0cyAoc28gYSBXZWIKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIG1heSByZWZlcmVuY2UgYSBXZWIgTGlicmFyeSBvdXRzaWRlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBXZWIgQXBwbGljYXRpb24pLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNvbHV0aW9uIHdpbGwgbm90IGFsbG93IG1vcmUgdGhhbiBvbmUgc2VydmVyIHRhcmdldCBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAoYW5kIHJlYWxseSBwZXItcHJvamVjdCkgYXQgYSB0aW1lLiBUaGUgYWJpbGl0eSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIHRoaXMgc2VydmVyIHRhcmdldCAodmlhIHNvbWUgYWN0aW9uIG9yIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKSB3aWxsIGNvbnRpbnVlIHRvIGJlIHBvc3NpYmxlLiBVc2VycyB0aGF0IG5lZWQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5IHRvIGRldmVsb3AgZm9yIG11bHRpcGxlIHNlcnZlciB0YXJnZXRzIHdpbGwgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFudWFsbHkgc3dpdGNoIGFuZCB0ZXN0IGFzIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVhY2ggY29tcG9uZW50IGluIGEgcHJvamVjdCBtYXkgaGF2ZSBpdHMgb3duIG91dHB1dCBmb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdGVkIGZvciBpdC4gVGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdpbGwgbWF0Y2ggdGhlIEoyRUUgc3BlY2lmaWNhdGlvbiBvdXRwdXQgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgdGhlIGNvbXBvbmVudCB0eXBlIChmb3IgSjJFRSBtb2R1bGVzKS4gQSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgd2lsbCBoYW5kbGUgdGhpcyByZXNwb25zaWJpbGl0eSBhbmQgd29yawotICAgICAgICAgICAgICAgICAgICAgICAgY29vcGVyYXRpdmVseSB3aXRoIHRoZSBKYXZhIGJ1aWxkZXIgdG8gY29uc3RydWN0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWFibGUsIG9uLWRpc2sgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHdpbGwgZm9sbG93IHRoaXMgcGF0dGVybiwgYnV0IAotICAgICAgICAgICAgICAgICAgICAgICAgaG9va3Mgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byB2YXJ5IHRoaXMgYmVoYXZpb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmVjZXNzaXR5IGZvciB0aGlzIG9uLWRpc2sgc3RydWN0dXJlIHRvIG1hdGNoIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIEoyRUUtY29tcGxpYW50IGxheW91dCBpcyBtb3RpdmF0ZWQgYnkgdGhlIHJlcXVpcmVtZW50IHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLXdvcmtiZW5jaCB0ZXN0aW5nLCBzbyB0aGF0IHVzZXJzIHdpbGwgbm90IGhhdmUgdG8gZGVhbAotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGRlcGxveWVyIGFjdHVhbGx5IGNvbnN0cnVjdGluZyBhIGRlcGxveWFibGUgbW9kdWxlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgc2hpcHBpbmcgaXQgb2ZmIHRvIGEgc2VydmVyIHRvIHRlc3QgdGhlaXIgY29kZS4gVGhpcyBhcHByb2FjaAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgY29uc2lzdGVudCB3aXRoIGV4aXN0aW5nIEFudC1iYXNlZCBhcHByb2FjaGVzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gU2VydmVycyB3aGljaCBjYW4gcnVuIGluIGEgImRlYnVnIiBtb2RlIG9uIGRpc2suCi0gICAgICAgICAgICAgICAgICAgICAgICBPdXIgdmFsdWUtYWRkIHdpbGwgYmUgZ3JlYXRlciBhdXRvbWF0aW9uIGFuZCBpbnRlZ3JhdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29ya2JlbmNoIC0tIHBhcnRpY3VsYXJseSBmb3IgaW5jcmVtZW50YWwgYmFzZWQgc3VwcG9ydC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzcGVjaWFsaXplZCBtb2R1bGUgYnVpbGRlciB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIHdhcyBhbHJlYWR5IGluIHRoZSBhcHByb3ByaWF0ZSBKMkVFIHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsaWFudCBzdHJ1Y3R1cmUuIFRoZSBkZWZhdWx0IGNyZWF0aW9uIHdpbGwgc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY291cmFnZSBhIHNpbmdsZSBtb2R1bGUgcGVyIHByb2plY3QsIHdoaWNoIGNvbmZvcm1zIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdCBKMkVFIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudHMgd2lsbCBiZSBkZXNjcmliZWQgdXNpbmcgYSBzaW1wbGUgWE1MIGZvcm1hdCwgYW5kIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Qgd2lsbCBjb250YWluIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgPEk+Lnd0cG1vZHVsZXM8L0k+Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRoYXQgd2lsbCBkZXNjcmliZSBhbGwgb2YgdGhlIGNvbXBvbmVudHMgZm9yIHRoYXQgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsZXZlbCBvZiB0b29saW5nIHRvIGhlbHAgdXNlcnMgY3JlYXRlIHRoZXNlIGZpbGVzIGlzIHlldAotICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZGV0ZXJtaW5lZCBmb3IgV1RQIE00LiBUaGlzIHdvdWxkIGJlIGEgZ3JlYXQgYXJlYSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGludGVyZXN0ZWQgZGV2ZWxvcGVycyB0byBzdWdnZXN0IGFuZCBwcm92aWRlIHRvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGEgV2l6YXJkIG9yIEVkaXRvcikgdG8gY3JlYXRlIHRoZXNlIGZpbGVzIGZyb20gZXhpc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMuIEEgc2NoZW1hIGlzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJzIHRoYXQgd2FudCB0byBidWlsZCB0aGVpciBvd24KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJPi53dHBtb2R1bGVzPC9JPgotICAgICAgICAgICAgICAgICAgICAgICAgYnkgaGFuZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY29udGVudCBhc3Npc3QgaW4gdGhlIFhNTAotICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLgotICAgICAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDwvb2w+Ci0gICAgICAgIDwvcD4gIAotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0JCTxhIG5hbWU9Im1vZHVsZS1jb3JlLWV4YW1wbGVzIi8+Ci0gICAgICAgIDxoMj5Db21wb25lbnRDb3JlIEFQSTogV29ya2luZyB3aXRoIHRoZSBtZXRhbW9kZWw8L2gyPgotICAgICAgICA8QlIgLz4gIAotICAgICAgICA8cD4KLQkJCUNvbXBvbmVudENvcmUgdXNlcyBhIGhhbmRsZSBiYXNlZCBtb2RlbCBtdWNoIGxpa2UgdGhlIGV4aXN0aW5nIFBsYXRmb3JtIAotCQkJUmVzb3VyY2UgbW9kZWwuIFRoZSBDb21wb25lbnRDb3JlIGZhY2FkZSBpcyBub3QgdGllZCB0byBhbnkgcHJvamVjdCwgYW5kIAotCQkJdGhlIGhhbmRsZXMgdGhhdCBpdCByZXR1cm5zIG1heSBvciBtYXkgbm90IGV4aXN0LiBUaGUgY29tcGxleGl0eSBvZiAKLQkJCW1hbmFnaW5nIHRoZSB1bmRlcmx5aW5nIEVNRiBtb2RlbCBpcyBoYW5kbGVkIHVuZGVyIHRoZSBjb3ZlciBmb3IgdXNlcnMuIAotICAgICAgICA8L3A+IAotICAgICAgICA8aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvY29tcG9uZW50Y29yZV9wYWNrYWdlLmpwZyIgY2FwdGlvbj0iVGhlIENvbXBvbmVudENvcmUgQVBJIiAvPiAgCi0gICAgICAgIDwhLS0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgICBDbGllbnRzIHNob3VsZCB1c2Ugb25lIG9mCi0gICAgICAgICAgICA8Y29kZT5Nb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JSZWFkKCk8L2NvZGU+Ci0gICAgICAgICAgICBvcgotICAgICAgICAgICAgPGNvZGU+TW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoKTwvY29kZT4KLSAgICAgICAgICAgIHRvIGFjcXVpcmUgYW4gaW5zdGFuY2Ugb2YgTW9kdWxlQ29yZS4gICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQk8Y29kZXNuaXBwZXQgY2FwdGlvbj0iQWNxdWlyaW5nIGFuIGluc3RhbmNlIG9mIENvbXBvbmVudENvcmUgZm9yIHJlYWQtb25seSBhY2Nlc3MiPgotSVByb2plY3QgY3VycmVudFByb2plY3QgPSAuLi4gCi1Nb2R1bGVDb3JlIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvclJlYWQoY3VycmVudFByb2plY3QpOwotV29ya2JlbmNoQ29tcG9uZW50W10gbW9kdWxlcyA9IG1vZHVsZUNvcmVJbnN0YW5jZS5nZXRXb3JrYmVuY2hDb21wb25lbnRzKCk7IAotLi4uIHdvcmsgd2l0aCBtb2R1bGVzIC4uLiAKLW1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCQk8L2NvZGVzbmlwcGV0PiAKLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICAgIEZvciBjbGllbnRzIHRoYXQgd291bGQgbGlrZSB0byBidWlsZCB1cCB0aGVpciBvd24gbW9kZWxzIGZvciBhIGdpdmVuCi0gICAgICAgICAgICBwcm9qZWN0LCBvciBtb2RpZnkgdGhlIGV4aXN0aW5nIG1ldGFtb2RlbCwgdGhlIE1vZHVsZUNvcmUgaW5zdGFuY2Ugc2hvdWxkCi0gICAgICAgICAgICBiZSBhY3F1aXJlZCBmb3Igd3JpdGUtYWNjZXNzLiAKLSAgICAgICAgPC9wPgotCQk8Y29kZXNuaXBwZXQgY2FwdGlvbj0iQ3JlYXRpbmcgYSBXb3JrYmVuY2hDb21wb25lbnQiPiAgICAgICAgICAgIAotLi4uCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsgCi0uLi4KLQotcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVdlYkFwcE1vZHVsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBhSmF2YVNvdXJjZUZvbGRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBhV2ViQ29udGVudEZvbGRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIGFXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBhUHJvZ3Jlc3NNb25pdG9yKSAKLXsKLSAgICBNb2R1bGVDb3JlIG1vZHVsZUNvcmVJbnN0YW5jZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gCi0gICAgICAgICAgICBNb2R1bGVDb3JlLmdldE1vZHVsZUNvcmVGb3JXcml0ZShhVGFyZ2V0UHJvamVjdCk7Ci0KLSAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG1vZHVsZSB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICBjb250YWluZWQgYnkgdGhlIGN1cnJlbnQgTW9kdWxlQ29yZSAqLwotICAgICAgICBXb3JrYmVuY2hDb21wb25lbnQgbmV3TW9kdWxlID0gCi0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuY3JlYXRlV29ya2JlbmNoQ29tcG9uZW50KCJNeVdlYk1vZHVsZS53YXIiKTsKLQotICAgICAgICAvKiBBIEphdmEgc291cmNlIGZvbGRlciB0aGF0IGNvbnRhaW5zIAotICAgICAgICAgICAgICAgIHRoZSBjbGFzc2VzIGZvciB0aGUgY3VycmVudCBtb2R1bGUgKi8KLSAgICAgICAgQ29tcG9uZW50UmVzb3VyY2UgamF2YVNvdXJjZSA9IAotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUphdmFTb3VyY2VGb2xkZXIpOwotICAgICAgICBqYXZhU291cmNlLnNldERlcGxveWVkUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlVVJJKCIvV0VCLUlORi9jbGFzc2VzIikpOwotICAgICAgICBuZXdNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKGphdmFTb3VyY2UpOwotCi0gICAgICAgIC8qIEEgcmVzb3VyY2UgZm9sZGVyIHRoYXQgY29udGFpbnMgCi0gICAgICAgICAgICB0aGUgKi5qc3AsICouaHRtbCwgLmltZywgLi4uIGZpbGVzICovCi0gICAgICAgIENvbXBvbmVudFJlc291cmNlIHdlYkNvbnRlbnQgPSAKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5jcmVhdGVDb21wb25lbnRSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhV2ViQ29udGVudEZvbGRlcik7Ci0gICAgICAgIHdlYkNvbnRlbnQuc2V0RGVwbG95ZWRQYXRoKFVSSS5jcmVhdGVVUkkoIi8iKSk7Ci0gICAgICAgIG5ld01vZHVsZS5nZXRSZXNvdXJjZXMoKS5hZGQod2ViQ29udGVudCk7Ci0KLSAgICAgICAgLyogQSByZXNvdXJjZSB0aGF0IHBvaW50cyB0byBhIHZhbGlkIHdlYi54bWwgCi0gICAgICAgICAgICAgICAgZmlsZSB0aGF0IGZvbGxvd3MgdGhlIEoyRUUgV2ViIERlcGxveW1lbnQKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIFNwZWNpZmljYXRpb24KLSAgICAgICAgICovCi0gICAgICAgIENvbXBvbmVudFJlc291cmNlIGRlcGxveW1lbnREZXNjcmlwdG9yID0gCi0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpOwotICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvci5zZXREZXBsb3llZFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlVVJJKCIvV0VCLUlORi93ZWIueG1sIikpOwotICAgICAgICBuZXdNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKGRlcGxveW1lbnREZXNjcmlwdG9yKTsKLQotICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2Uuc2F2ZUlmTmVjZXNzYXJ5KGFQcm9ncmVzc01vbml0b3IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChtb2R1bGVDb3JlSW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQkJPC9jb2Rlc25pcHBldD4gIAotICAgICAgICA8cD4KLSAgICAgICAgICAgIEZvciBjbGllbnRzIHRoYXQgd291bGQgbGlrZSB0byB0YWtlIGFuIGV4aXN0aW5nIHByb2plY3QgYW4gYWRkIEZsZXhpYmxlCi0gICAgICAgICAgICBQcm9qZWN0IFN1cHBvcnQsIHVzZSB0aGUgTW9kdWxlQ29yZU5hdHVyZS5hZGRNb2R1bGVDb3JlSWZOZWNlc3NhcnkoKSBBUEkKLSAgICAgICAgICAgIHRvIHByZXBhcmUgdGhlIHByb2plY3QgdG8gc3VwcG9ydCBmbGV4aWJsZSBtb2R1bGUgc3RydWN0dXJlcy4gdGhlCi0gICAgICAgICAgICBleGlzdGluZyBtZXRhbW9kZWwsIHRoZW4gYWNxdWlyZSB0aGUgTW9kdWxlQ29yZSBpbnN0YW5jZSBmb3IgbW9kaWZpY2F0aW9uLgotICAgICAgICA8L3A+Ci0JCTxjb2Rlc25pcHBldCBjYXB0aW9uPSJBZGQgRmxleGlibGUgUHJvamVjdCBzdXBwb3J0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIHByb2plY3QiPgotLi4uIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7IAotLi4uCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFrZUZsZXhpYmxlKElQcm9qZWN0IGFUYXJnZXRQcm9qZWN0KSB7Ci0gICAgTW9kdWxlQ29yZSBtb2R1bGVDb3JlSW5zdGFuY2UgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICAgIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlID0gTW9kdWxlQ29yZS5nZXRNb2R1bGVDb3JlRm9yV3JpdGUoYVRhcmdldFByb2plY3QpOwotICAgICAgICAuLi4gd29yayB3aXRoIG1vZHVsZUNvcmVJbnN0YW5jZSBhbmQgdW5kZXJseWluZyBtb2RlbCAuLi4KLSAgICAgICAgbW9kdWxlQ29yZUluc3RhbmNlLnNhdmVJZk5lY2Vzc2FyeShhUHJvZ3Jlc3NNb25pdG9yKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICBpZiAobW9kdWxlQ29yZUluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0JCTwvY29kZXNuaXBwZXQ+IAotCQktLT4KLQkJPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGUwODFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgYXMgZGVmaW5lZCBieSB0aGUgLmNvbXBvbmVudCBmaWxlLgotICogPHA+Ci0gKiBBIGNvbXBvbmVudCBpcyBhIGNvbnRhaW5lciBvZiB2aXJ0dWFsIHJlc291cmNlcyB3aGljaCBoYXMgb3RoZXIgZmVhdHVyZXMgdGhhdCBkZXNjcmliZSB0aGUKLSAqIGNvbXBvbmVudCBpbmNsdWRpbmc6Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWaXJ0dWFsQ29tcG9uZW50IGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JCi0JSVBhdGggUk9PVCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUeXBlIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSAxKSB3aGljaCBpZGVudGlmaWVzIGNvbXBvbmVudCBiaW5hcnkgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkFSWSA9IDB4MTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IG11c3QgYmUgdW5pcXVlIHdpdGhpbiBpdHMgZW5jbG9zaW5nIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50LgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBUaGUgZGVwbG95ZWQgbmFtZSBvZiB0aGUgY29tcG9uZW50LgotCSAqLwotCVN0cmluZyBnZXREZXBsb3llZE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnRUeXBlSWQgaXMgdXNlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZWRpdGVkIGFuZCBkZXBsb3llZC4KLQkgKiBFeGFtcGxlcyBpbmNsdWRlICJqc3Qud2ViIiBvciAianN0LnV0aWxpdHkiLiBUaGUgY29tcG9uZW50VHlwZUlkIGNhbiBiZSBzZXQgdG8gYW55IHZhbHVlIHdoZW4KLQkgKiBjcmVhdGVkIHNvIGxvbmcgYXMgdGhhdCB2YWx1ZSBtYWtlcyBzZW5zZSB0byB0aGUgY2xpZW50cy4gU3RhbmRhcmQgY29tcG9uZW50VHlwZUlkcyBtYXkgYmUKLQkgKiBhdmFpbGFibGUgZm9yIGNvbW1vbiBjb21wb25lbnQgdHlwZXMuCi0JICogCi0JICogQHJldHVybiBUaGUgY29tcG9uZW50VHlwZUlkLCBhIHN0cmluZyBiYXNlZCBpZGVudGlmaWVyIHRoYXQgaW5kaWNhdGVzIHRoZSBjb21wb25lbnQKLQkgKi8KLS8vCVN0cmluZyBnZXRDb21wb25lbnRUeXBlSWQoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHJlZmVyZW5jZSB0byBpdHNlbGYuCi0JICogPHA+Ci0JICogIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGNvbnRhaW5zIHRoZSB2aXJ0dWFsIHJlc291cmNlCi0JICovCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCQotCi0JLyoqCi0JICogCi0JICogVGhlIGNvbXBvbmVudFR5cGVJZCBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSBlZGl0ZWQgYW5kIGRlcGxveWVkLgotCSAqIEV4YW1wbGVzIGluY2x1ZGUgImpzdC53ZWIiIG9yICJqc3QudXRpbGl0eSIuIFRoZSBjb21wb25lbnRUeXBlSWQgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUgd2hlbgotCSAqIGNyZWF0ZWQgc28gbG9uZyBhcyB0aGF0IHZhbHVlIG1ha2VzIHNlbnNlIHRvIHRoZSBjbGllbnRzLiBTdGFuZGFyZCBjb21wb25lbnRUeXBlSWRzIG1heSBiZQotCSAqIGF2YWlsYWJsZSBmb3IgY29tbW9uIGNvbXBvbmVudCB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYUNvbXBvbmVudFR5cGVJZAotCSAqICAgICAgICAgICAgQSB2YWx1ZSB3aGljaCBpcyBlaXRoZXIgc3RhbmRhcmQgZm9yIGEgY29tbW9uIGNvbXBvbmVudCB0eXBlIG9yIGNsaWVudC1kZWZpbmVkIGZvcgotCSAqICAgICAgICAgICAgYSBjdXN0b20gY29tcG9uZW50IHR5cGUKLQkgKi8KLS8vCXZvaWQgc2V0Q29tcG9uZW50VHlwZUlkKFN0cmluZyBhQ29tcG9uZW50VHlwZUlkKTsKLQotCS8qKgotCSAqIE1ldGFQcm9wZXJ0aWVzIGFyZSBTdHJpbmctYmFzZWQgbmFtZS12YWx1ZSBwYWlycyB0aGF0IGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcwotCSAqIGNvbXBvbmVudCB0aGF0IG1heSBiZSByZWxldmFudCB0byBjbGllbnRzIG9yIHRoZSB3YXkgdGhhdCBjbGllbnRzIGVkaXQgb3IgZGVwbG95IGNvbXBvbmVudHMuCi0JICogCi0JICogQHJldHVybiBBIGJ5LXJlZmVyZW5jZSBpbnN0YW5jZSBvZiB0aGUgcHJvcGVydGllcyBmb3IgdGhpcyBjb21wb25lbnQuCi0JICovCi0JUHJvcGVydGllcyBnZXRNZXRhUHJvcGVydGllcygpOwotCQotCS8qKgotCSAqIEFkZHMgYSBzaW5nbGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAJCUEgdmFsdWUgd2hpY2ggaXMgbmFtZSwgdmFsdWUgcGFpciwgc2VlIENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpCi0JICogCQkKLQkgKi8KLQl2b2lkIHNldE1ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBwcm9wZXJ0aWVzIHByb3ZpZGVkIGFzIGEgbGlzdAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogCQkJQSBsaXN0IG9mIHByb3BlcnRpZXMKLQkgKi8KLQl2b2lkIHNldE1ldGFQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiBNZXRhUmVzb3VyY2VzIHByb3ZpZGUgYSBsb29zZSBtZWNoYW5pc20gZm9yIGNvbXBvbmVudHMgdGhhdCB3b3VsZCBsaWtlIHRvIGxpc3Qgb2ZmIHRoZQotCSAqIG1ldGFkYXRhLXJlc291cmNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbXBvbmVudCB3aGljaCBjYW4gYWlkIG9yIGV4cGVkaXRlIHNlYXJjaGluZyBmb3IgdGhpcwotCSAqIHJlc291cmNlcy4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8gZ2V0IG9yIHNldCB0aGUgTWV0YVJlc291cmNlcyBmb3IgYSBjb21wb25lbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gQSBieS12YWx1ZSBjb3B5IG9mIHRoZSBNZXRhUmVzb3VyY2VzIGFycmF5Ci0JICogQHNlZSAjc2V0TWV0YVJlc291cmNlcyhJUGF0aFtdKQotCSAqLwotCUlQYXRoW10gZ2V0TWV0YVJlc291cmNlcygpOwotCi0JLyoqCi0JICogCi0JICogTWV0YVJlc291cmNlcyBwcm92aWRlIGEgbG9vc2UgbWVjaGFuaXNtIGZvciBjb21wb25lbnRzIHRoYXQgd291bGQgbGlrZSB0byBsaXN0IG9mZiB0aGUKLQkgKiBtZXRhZGF0YS1yZXNvdXJjZXMgYXZhaWxhYmxlIGluIHRoZSBjb21wb25lbnQgd2hpY2ggY2FuIGFpZCBvciBleHBlZGl0ZSBzZWFyY2hpbmcgZm9yIHRoaXMKLQkgKiByZXNvdXJjZXMuCi0JICogPHA+Ci0JICogQ2xpZW50cyBhcmUgbm90IHJlcXVpcmVkIHRvIGdldCBvciBzZXQgdGhlIE1ldGFSZXNvdXJjZXMgZm9yIGEgY29tcG9uZW50LiBUaGUgZXhpc3RpbmcKLQkgKiBNZXRhUmVzb3VyY2VzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYWZ0ZXIgdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0aGVNZXRhUmVzb3VyY2VQYXRocwotCSAqICAgICAgICAgICAgQW4gYXJyYXkgb2YgcGF0aHMgdGhhdCB3aWxsIGJlY29tZSB0aGUgbmV3IE1ldGFSZXNvdXJjZSBhcnJheS4KLQkgKi8KLQl2b2lkIHNldE1ldGFSZXNvdXJjZXMoSVBhdGhbXSB0aGVNZXRhUmVzb3VyY2VQYXRocyk7Ci0KLQotCS8qKgotCSAqIFZpcnR1YWwgY29tcG9uZW50cyBtYXkgcmVmZXJlbmNlIG90aGVyIHZpcnR1YWwgY29tcG9uZW50cyB0byBidWlsZCBsb2dpY2FsIGRlcGVuZGVuY3kgdHJlZXMuIAotCSAqIDxwPgotCSAqIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBpbmRpY2F0ZSBob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHJlZmVyZW5jZSB3aWxsIGJlIGFic29yYmVkIAotCSAqIGJ5IHRoaXMgY29tcG9uZW50LiBFYWNoIHZpcnR1YWwgcmVmZXJlbmNlIHdpbGwgYWx3YXlzIHNwZWNpZnkgYW4gZW5jbG9zaW5nIGNvbXBvbmVudCB0aGF0IHdpbGwKLQkgKiBiZSB0aGlzIGNvbXBvbmVudC4gICAKLQkgKiA8L3A+Ci0JICogQHJldHVybiBBIGJ5LXZhbHVlIGNvcHkgb2YgdGhlIHZpcnR1YWwgcmVmZXJlbmNlIGFycmF5Ci0JICovCi0JSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKCk7Ci0JLyoqCi0JICogVmlydHVhbCBjb21wb25lbnRzIG1heSByZWZlcmVuY2Ugb3RoZXIgdmlydHVhbCBjb21wb25lbnRzIHRvIGJ1aWxkIGxvZ2ljYWwgZGVwZW5kZW5jeSB0cmVlcy4gCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGluZGljYXRlIGhvdyB0aGUgY29udGVudCBvZiB0aGUgcmVmZXJlbmNlIHdpbGwgYmUgYWJzb3JiZWQgCi0JICogYnkgdGhpcyBjb21wb25lbnQuIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBhbHdheXMgc3BlY2lmeSBhbiBlbmNsb3NpbmcgY29tcG9uZW50IHRoYXQgd2lsbAotCSAqIGJlIHRoaXMgY29tcG9uZW50LiAgIAotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIEEgYnktdmFsdWUgY29weSBvZiB0aGUgdmlydHVhbCByZWZlcmVuY2Ugd2l0aCBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUgZXhpc3QgbWF0Y2hpbmcgdGhpcyBuYW1lCi0JICovCi0JSVZpcnR1YWxSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKFN0cmluZyBhQ29tcG9uZW50TmFtZSk7Ci0JCi0JLyoqCi0JICogVmlydHVhbCBjb21wb25lbnRzIG1heSByZWZlcmVuY2Ugb3RoZXIgdmlydHVhbCBjb21wb25lbnRzIHRvIGJ1aWxkIGxvZ2ljYWwgZGVwZW5kZW5jeSB0cmVlcy4gCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlZmVyZW5jZSB3aWxsIGluZGljYXRlIGhvdyB0aGUgY29udGVudCBvZiB0aGUgcmVmZXJlbmNlIHdpbGwgYmUgYWJzb3JiZWQgCi0JICogYnkgdGhpcyBjb21wb25lbnQuIEVhY2ggdmlydHVhbCByZWZlcmVuY2Ugd2lsbCBhbHdheXMgc3BlY2lmeSBhbiBlbmNsb3NpbmcgY29tcG9uZW50IHRoYXQgd2lsbAotCSAqIGJlIHRoaXMgY29tcG9uZW50LiBBbnkgcmVmZXJlbmNlcyBzcGVjaWZpZWQgaW4gdGhlIGFycmF5IHdoaWNoIGRvIG5vdCBzcGVjaWZ5IGFuIGVuY2xvc2luZwotCSAqIGNvbXBvbmVudCB0aGF0IG1hdGNoZXMgdGhpcyBjb21wb25lbnQgd2lsbCBiZSBtb2RpZmllZCB0byBzcGVjaWZ5IHRoaXMgdmlydHVhbCBjb21wb25lbnQuIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBFeGlzdGluZyB2aXJ0dWFsIHJlZmVyZW5jZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHRoZVJlZmVyZW5jZXMgQSBieS12YWx1ZSBjb3B5IG9mIHRoZSB2aXJ0dWFsIHJlZmVyZW5jZSBhcnJheQotCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlcyhJVmlydHVhbFJlZmVyZW5jZVtdIHRoZVJlZmVyZW5jZXMpOwotCQotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZXMoSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaXMgb2YgYmluYXJ5IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBiaW5hcnkgc3RhdHVzLgotCSAqLwotCWJvb2xlYW4gaXNCaW5hcnkoKTsJCQotCQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50cyBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LiBSZXNvdXJjZXMKLQkgKiBtYXkgYmUgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpZiB0aGUgbWFwcGVkIHBhdGggZG9lcyBub3QgZXhpc3QuIAotCSAqIAotCSAqIEBwYXJhbSB1cGRhdGVGbGFncyBBbnkgb2YgSVZpcnR1YWxSZXNvdXJjZSBvciBJUmVzb3VyY2UgdXBkYXRlIGZsYWdzLiBJZiBhIAotCSAqIAkJCXJlc291cmNlIG11c3QgYmUgY3JlYXRlZCwgdGhlIHVwZGF0ZUZsYWdzIHdpbGwgYmUgc3VwcGxpZWQgdG8gdGhlIAotCSAqIAkJCXJlc291cmNlIGNyZWF0aW9uIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gYU1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsgCi0JCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgcm9vdCBmb2xkZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSBjb250YWluZXIKLQkgKiBub3IgdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRSb290Rm9sZGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgY29tcG9uZW50LiAKLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBtYXkgbm90IChhbmQgbW9zdCBsaWtlbHkgd2lsbCBub3QpIGJlIHJlZmVyZW5jZWQgaW4gdGhlIAotCSAqIHJ1bnRpbWUgcGF0aCBvZiB0aGlzIHZpcnR1YWwgcGF0aCwgYnV0IHdpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGguIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yIHRoZSByZXN1bHRpbmcgcHJvamVjdCBuZWVkCi0JICogZXhpc3QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaGFuZGxlCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21wb25lbnQgaXMgYmFja2VkIGJ5IGFuIGFjY2Vzc2libGUgQ29tcG9uZW50LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnRzIHdoaWNoIHJlZmVyZW5jZSB0aGlzIGNvbXBvbmVudC4gIFRoaXMgaXMgb25seSBhIG9uZSBsYXllcgotCSAqIGRlZXAgc2VhcmNoIGFsZ29yaXRobS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIElWaXJ0dWFsQ29tcG9uZW50cwotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDExYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgYXMgZGVmaW5lZCBieSB0aGUgV1RQIE1vZHVsZXMgZmlsZS4gQSAKLSAqIHZpcnR1YWwgY29udGFpbmVyIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvbmVudC4gCi0gKiA8cD4KLSAqIFZpcnR1YWwgY29udGFpbmVycyBjYW4gcHJvdmlkZSBoYW5kbGVzIHRvIHZpcnR1YWwgZmlsZXMgYW5kIAotICogdmlydHVhbCBmb2xkZXJzIHRoYXQgaXQgY29udGFpbnMuIAotICogPC9wPgotICogPHA+Ci0gKiBUbyBhY3F1aXJlIGEgaGFuZGxlIHRvIGEgY29tcG9uZW50LCB1c2UgdGhlIGZvbGxvd2luZyBzbmlwcGV0Ojxicj4gCi0gKiA8Y29kZT5Nb2R1bGVDb3JlLmNyZWF0ZUNvbnRhaW5lcihjb250YWluaW5nUHJvamVjdCwgY29tcG9uZW50TmFtZSk8L2NvZGU+Ci0gKiB3aGljaCB3aWxsIGNyZWF0ZSBhIGhhbmRsZSB0byBhIHZpcnR1YWwgY29udGFpbmVyIGNvbnRhaW5lZCBieSAKLSAqIDxpPmNvbnRhaW5pbmdQcm9qZWN0PC9pPiB3aXRoIHRoZSBuYW1lIDxpPmNvbXBvbmVudE5hbWU8L2k+LiBJZiB0aGUgCi0gKiBhIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMsIHRoZW4gCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlI2V4aXN0cygpfQotICogd2lsbCByZXR1cm4gdHJ1ZS4gT3RoZXJ3aXNlLCB1c2Uge0BsaW5rICNjcmVhdGUoaW50LCBJUHJvZ3Jlc3NNb25pdG9yKX0gdG8gCi0gKiBjcmVhdGUgdGhlIHJlbGV2YW50IG1vZGVsIGVsZW1lbnRzLiBJZiBhIGNsaWVudCBuZWVkcyB0byBhZGQgYSAKLSAqIG1hcHBpbmcgZnJvbSBhIGZvbGRlciBpbiB0aGUgc2FtZSBwcm9qZWN0IHRvIHJvb3QsIHVzZSAKLSAqIHtAbGluayAjY3JlYXRlTGluayhJUGF0aCwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKX0gd2l0aCBhIAotICogcHJvamVjdC1yZWxhdGl2ZSBwYXRoLiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbENvbnRhaW5lciBleHRlbmRzIElWaXJ0dWFsUmVzb3VyY2UgeyAgCi0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgZWxlbWVudHMgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdC4gUmVzb3VyY2VzCi0JICogbWF5IGJlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaWYgdGhlIG1hcHBlZCBwYXRoIGRvZXMgbm90IGV4aXN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQW55IG9mIElWaXJ0dWFsUmVzb3VyY2Ugb3IgSVJlc291cmNlIHVwZGF0ZSBmbGFncy4gSWYgYSAKLQkgKiAJCQlyZXNvdXJjZSBtdXN0IGJlIGNyZWF0ZWQsIHRoZSB1cGRhdGVGbGFncyB3aWxsIGJlIHN1cHBsaWVkIHRvIHRoZSAKLQkgKiAJCQlyZXNvdXJjZSBjcmVhdGlvbiBvcGVyYXRpb24uCi0JICogQHBhcmFtIGFNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247IAotIAotIAotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhIHZpcnR1YWwgcmVzb3VyY2Ugb2Ygc29tZSB0eXBlIHdpdGggdGhlIGdpdmVuIHBhdGggCi0JICogZXhpc3RzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLiAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhcmUgaWdub3JlZC4KLQkgKiBJZiB0aGUgcGF0aCBpcyBlbXB0eSB0aGlzIGNvbnRhaW5lciBpcyBjaGVja2VkIGZvciBleGlzdGVuY2UuCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVzb3VyY2Ugb2Ygc29tZSB0eXBlIHdpdGggdGhlIGdpdmVuIHBhdGggCi0JICogICAgIGV4aXN0cyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgdmlydHVhbCByZXNvdXJjZSAoZm9sZGVyIG9yIGZpbGUpCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGlzIGNvbnRhaW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAotCSAqIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbWVtYmVyIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgcmVzb3VyY2UgKGZvbGRlciwgb3IgZmlsZSkKLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKLQkgKiB0aGVyZSBpcyBubyBzdWNoIHJlc291cmNlLgotCSAqIDxwPgotCSAqIElmIHRoZSA8Y29kZT5pbmNsdWRlUGhhbnRvbXM8L2NvZGU+IGFyZ3VtZW50IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgCi0JICogb25seSBhIG1lbWJlciByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQgZXhpc3RzIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogSWYgdGhlIDxjb2RlPmluY2x1ZGVQaGFudG9tczwvY29kZT4gYXJndW1lbnQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSByZXNvdXJjZSBpZiB0aGUgd29ya3NwYWNlIGlzIGtlZXBpbmcgdHJhY2sgb2YgYQotCSAqIHBoYW50b20gd2l0aCB0aGF0IG5hbWUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBubyBhdHRlbXB0IGlzIG1hZGUgdG8gZXhjbHVkZSB0ZWFtLXByaXZhdGUgbWVtYmVyIHJlc291cmNlcwotCSAqIGFzIHdpdGggPGNvZGU+bWVtYmVyczwvY29kZT4uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBtZW1iZXIgcmVzb3VyY2UKLQkgKiBAcGFyYW0gaW5jbHVkZVBoYW50b21zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBoYW50b20gcmVzb3VyY2VzIGFyZQotCSAqICAgb2YgaW50ZXJlc3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBwaGFudG9tIHJlc291cmNlcyBhcmUgbm90IG9mCi0JICogICBpbnRlcmVzdAotCSAqIEByZXR1cm4gdGhlIG1lbWJlciByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaAotCSAqIAkJcmVzb3VyY2UgZXhpc3RzCi0JICogQHNlZSAjbWVtYmVycygpCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzUGhhbnRvbSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcgbmFtZSwgaW50IHNlYXJjaEZsYWdzKTsKLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBtZW1iZXIgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbgotCSAqIHRoaXMgY29udGFpbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuICAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhbmQgdGhlIHBhdGgncwotCSAqIGRldmljZSBhcmUgaWdub3JlZC4gSWYgdGhlIHBhdGggaXMgZW1wdHkgdGhpcyBjb250YWluZXIgaXMgcmV0dXJuZWQuICAKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlCi0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoIHBhdGgpOwotCi0JLyoqCi0JICogRmluZHMgYW5kIHJldHVybnMgdGhlIG1lbWJlciByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoIGluCi0JICogdGhpcyBjb250YWluZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcmVzb3VyY2UuCi0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlLiAgVHJhaWxpbmcgc2VwYXJhdG9ycyBhbmQgdGhlIHBhdGgncwotCSAqIGRldmljZSBhcmUgaWdub3JlZC4KLQkgKiBJZiB0aGUgcGF0aCBpcyBlbXB0eSB0aGlzIGNvbnRhaW5lciBpcyByZXR1cm5lZC4gCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZQotCSAqIEBwYXJhbSBpbmNsdWRlUGhhbnRvbXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGhhbnRvbSByZXNvdXJjZXMgYXJlCi0JICogICBvZiBpbnRlcmVzdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHBoYW50b20gcmVzb3VyY2VzIGFyZSBub3Qgb2YKLQkgKiAgIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgbWVtYmVyIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlyZXNvdXJjZSBleGlzdHMKLQkgKiBAc2VlICNtZW1iZXJzKGJvb2xlYW4pCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzUGhhbnRvbSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCBwYXRoLCBpbnQgc2VhcmNoRmxhZ3MpOyAKLQotCS8qKgotCSAqIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGZpbGUgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGlzCi0JICogY29udGFpbmVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8cD4KLQkgKiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmU7IGluIGVpdGhlciBjYXNlLCBpdCBpcwotCSAqIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UgYW5kIGlzIGFwcGVuZGVkCi0JICogdG8gdGhpcyBjb250YWluZXIncyBmdWxsIHBhdGggdG8gZm9ybSB0aGUgZnVsbCBwYXRoIG9mIHRoZSByZXN1bHRhbnQgcmVzb3VyY2UuCi0JICogQSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgaWdub3JlZC4gVGhlIHBhdGggb2YgdGhlIHJlc3VsdGluZyByZXNvdXJjZSBtdXN0IAotCSAqIGhhdmUgYXQgbGVhc3QgdHdvIHNlZ21lbnRzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBtZW1iZXIgZmlsZQotCSAqIEByZXR1cm4gdGhlIChoYW5kbGUgb2YgdGhlKSBtZW1iZXIgZmlsZQotCSAqIEBzZWUgI2dldEZvbGRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmb2xkZXIgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGlzCi0JICogY29udGFpbmVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4gCi0JICogPHA+Ci0JICogVGhlIHN1cHBsaWVkIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlOyBpbiBlaXRoZXIgY2FzZSwgaXQgaXMKLQkgKiBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGlzIHJlc291cmNlIGFuZCBpcyBhcHBlbmRlZAotCSAqIHRvIHRoaXMgY29udGFpbmVyJ3MgZnVsbCBwYXRoIHRvIGZvcm0gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcmVzdWx0YW50IHJlc291cmNlLgotCSAqIEEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIGlnbm9yZWQuIFRoZSBwYXRoIG9mIHRoZSByZXN1bHRpbmcgcmVzb3VyY2UgbXVzdAotCSAqIGhhdmUgYXQgbGVhc3QgdHdvIHNlZ21lbnRzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBtZW1iZXIgZm9sZGVyCi0JICogQHJldHVybiB0aGUgKGhhbmRsZSBvZiB0aGUpIG1lbWJlciBmb2xkZXIKLQkgKiBAc2VlICNnZXRGaWxlKElQYXRoKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoSVBhdGggcGF0aCk7IAotCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoaXMgZm9sZGVyLgotCSAqIDxwPiAKLQkgKiBUaGlzIGlzIGEgcmVzb3VyY2UgaGFuZGxlIG9wZXJhdGlvbjsgbmVpdGhlciB0aGUgcmVzb3VyY2Ugbm9yCi0JICogdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmaWxlCi0JICogQHJldHVybiB0aGUgKGhhbmRsZSBvZiB0aGUpIG1lbWJlciBmaWxlCi0JICogQHNlZSAjZ2V0Rm9sZGVyKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgZm9sZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyBmb2xkZXIuCi0JICogPHA+IAotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyBuZWl0aGVyIHRoZSBjb250YWluZXIKLQkgKiBub3IgdGhlIHJlc3VsdCBuZWVkIGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogVGhlIHZhbGlkYXRpb24gY2hlY2sgb24gdGhlIHJlc291cmNlIG5hbWUvcGF0aCBpcyBub3QgZG9uZQotCSAqIHdoZW4gdGhlIHJlc291cmNlIGhhbmRsZSBpcyBjb25zdHJ1Y3RlZDsgcmF0aGVyLCBpdCBpcyBkb25lCi0JICogYXV0b21hdGljYWxseSBhcyB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG1lbWJlciBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSAoaGFuZGxlIG9mIHRoZSkgbWVtYmVyIGZvbGRlcgotCSAqIEBzZWUgI2dldEZpbGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgZXhpc3RpbmcgbWVtYmVyIHJlc291cmNlcyAocHJvamVjdHMsIGZvbGRlcnMgYW5kIGZpbGVzKQotCSAqIGluIHRoaXMgcmVzb3VyY2UsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0byA8Y29kZT5tZW1iZXJzKElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk8L2NvZGU+LgotCSAqIFRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogPC9wPjxwPgotCSAqIE5vdGUgdGhhdCB0aGUgbWVtYmVycyBvZiBhIHByb2plY3Qgb3IgZm9sZGVyIGFyZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMKLQkgKiBpbW1lZGlhdGVseSBjb250YWluZWQgd2l0aGluIGl0LiAgVGhlIG1lbWJlcnMgb2YgdGhlIHdvcmtzcGFjZSByb290Ci0JICogYXJlIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWVtYmVycyBvZiB0aGlzIHJlc291cmNlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcmVxdWVzdCBmYWlscy4gUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+IFRoaXMgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QuPC9saT4KLQkgKiA8bGk+IFRoaXMgcmVzb3VyY2UgaXMgYSBwcm9qZWN0IHRoYXQgaXMgbm90IG9wZW4uPC9saT4KLQkgKiA8L3VsPgotCSAqIEBzZWUgI2ZpbmRNZW1iZXIoSVBhdGgpCi0JICogQHNlZSBJVmlydHVhbFJlc291cmNlI2lzQWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWVtYmVyIHJlc291cmNlcyAocHJvamVjdHMsIGZvbGRlcnMgYW5kIGZpbGVzKQotCSAqIGluIHRoaXMgcmVzb3VyY2UsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICogPHA+Ci0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+IGZsYWcgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgbWVtYmVyIAotCSAqIGZsYWdzIChyZWNvbW1lbmRlZCksIG9ubHkgbWVtYmVyIHJlc291cmNlcyB0aGF0IGV4aXN0IHdpbGwgYmUgcmV0dXJuZWQuCi0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+IGZsYWcgaXMgc3BlY2lmaWVkLAotCSAqIHRoZSByZXN1bHQgd2lsbCBhbHNvIGluY2x1ZGUgYW55IHBoYW50b20gbWVtYmVyIHJlc291cmNlcyB0aGUKLQkgKiB3b3Jrc3BhY2UgaXMga2VlcGluZyB0cmFjayBvZi4KLQkgKiA8L3A+PHA+Ci0JICogSWYgdGhlIDxjb2RlPklOQ0xVREVfVEVBTV9QUklWQVRFX01FTUJFUlM8L2NvZGU+IGZsYWcgaXMgc3BlY2lmaWVkIAotCSAqIGluIHRoZSBtZW1iZXIgZmxhZ3MsIHRlYW0gcHJpdmF0ZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgYWxvbmcgd2l0aAotCSAqIHRoZSBvdGhlcnMuIElmIHRoZSA8Y29kZT5JTkNMVURFX1RFQU1fUFJJVkFURV9NRU1CRVJTPC9jb2RlPiBmbGFnCi0JICogaXMgbm90IHNwZWNpZmllZCAocmVjb21tZW5kZWQpLCB0aGUgcmVzdWx0IHdpbGwgb21pdCBhbnkgdGVhbSBwcml2YXRlCi0JICogbWVtYmVyIHJlc291cmNlcy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIDxjb2RlPkVYQ0xVREVfREVSSVZFRDwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkLCBkZXJpdmVkIAotCSAqIHJlc291cmNlcyBhcmUgaW5jbHVkZWQuIElmIHRoZSA8Y29kZT5FWENMVURFX0RFUklWRUQ8L2NvZGU+IGZsYWcgaXMgCi0JICogc3BlY2lmaWVkIGluIHRoZSBtZW1iZXIgZmxhZ3MsIGRlcml2ZWQgcmVzb3VyY2VzIGFyZSBub3QgaW5jbHVkZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1lbWJlckZsYWdzIGJpdC13aXNlIG9yIG9mIG1lbWJlciBmbGFnIGNvbnN0YW50cwotCSAqICAgKDxjb2RlPklOQ0xVREVfUEhBTlRPTVM8L2NvZGU+LCA8Y29kZT5JTkNMVURFX1RFQU1fUFJJVkFURV9NRU1CRVJTPC9jb2RlPgotCSAqICAgYW5kIDxjb2RlPkVYQ0xVREVfREVSSVZFRDwvY29kZT4pIGluZGljYXRpbmcgd2hpY2ggbWVtYmVycyBhcmUgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1lbWJlcnMgb2YgdGhpcyByZXNvdXJjZQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIHJlcXVlc3QgZmFpbHMuIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPiBUaGlzIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LjwvbGk+Ci0JICogPGxpPiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGFuZAotCSAqICAgICB0aGlzIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LjwvbGk+Ci0JICogPGxpPiB0aGUgPGNvZGU+SU5DTFVERV9QSEFOVE9NUzwvY29kZT4gZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGFuZAotCSAqICAgICB0aGlzIHJlc291cmNlIGlzIGEgcHJvamVjdCB0aGF0IGlzIG5vdCBvcGVuLjwvbGk+Ci0JICogPC91bD4KLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZXhpc3RzKCkKLQkgKiBAcGxhbm5lZGZvciAyLjAKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50IG1lbWJlckZsYWdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIGdldFJlc291cmNlcyhTdHJpbmcgYVJlc291cmNlVHlwZSk7CQotfQotIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDQ0NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLS8qKgotICogUmVwcmVzZW50cyBhIGZpbGUgdGhhdCBjYW4gYmUgbmF2aWdhdGVkIHRocm91Z2ggCi0gKiBhbiBhYnN0cmFjdCAoInZpcnR1YWwiKSBwYXRoLiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbEZpbGUgZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlIHsgIAotCS8qKgotCSAqIHJldHVybnMgdGhlIHVuZGVybHlpbmcgSUZpbGUsIHJldHVybnMgZmlyc3QgSUZpbGUgaWYgbXVsdGlwbGUgZXhpc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgdW5kZXJseWluZyBJRmlsZQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRVbmRlcmx5aW5nRmlsZSgpOwotCS8qKgotCSAqIHJldHVybnMgdGhlIGFycmF5IG9mIHVuZGVybHlpbmcgSUZpbGVzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgdW5kZXJseWluZyBJRmlsZXMgbWFwcGVkIHRvIHRoZSBydW50aW1lIHBhdGgKLQkgKi8KLQlwdWJsaWMgSUZpbGVbXSBnZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOWU4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL0lWaXJ0dWFsRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogUmVwcmVzZW50cyBhIGZvbGRlciB0aGF0IGNhbiBiZSBuYXZpZ2F0ZWQgdGhyb3VnaCAKLSAqIGFuIGFic3RyYWN0ICgidmlydHVhbCIpIHBhdGguCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxGb2xkZXIgZXh0ZW5kcyBJVmlydHVhbENvbnRhaW5lciB7IAotCS8qKgotCSAqIHJldHVybnMgdGhlIHVuZGVybHlpbmcgSUZvbGRlciBtYXBwZWQgdG8gdGhlIHJ1bnRpbWUgcGF0aCwgCi0JICogcmV0dXJucyBmaXJzdCBJRm9sZGVyIGlmIG11bHRpcGxlIGV4aXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZvbGRlcgotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQkvKioKLQkgKiByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIElGb2xkZXJzIG1hcHBlZCB0byB0aGUgcnVudGltZSBwYXRoLiAKLQkgKiBNdWx0aXBsZSBJRm9sZGVycyBjYW4gYmUgbWFwcGVkIHRvIHRoZSBzYW1lIHJ1bnRpbWUgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB1bmRlcmx5aW5nIElGb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nRm9sZGVycygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYyMjc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBjb21wb25lbnRzOiBFbmNsb3NpbmdDb21wb25lbnQtPlJlZmVyZW5jZWRDb21wb25lbnQuIAotICogPHA+Ci0gKiBUaGUgUmVmZXJlbmNlZENvbXBvbmVudCBtYXkgZXhpc3QgaW4gYW5vdGhlciBwcm9qZWN0IG9yIGFzIGEgYmluYXJ5IGZvcm0gb24gdGhlIGNsYXNzcGF0aCAKLSAqIG9mIHRoZSBwcm9qZWN0LgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZpcnR1YWxSZWZlcmVuY2UgewotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHNob3VsZCBiZSBhcmNoaXZlZCBpbnRvIGEgKi4/YXIgZm9ybWF0IGJlZm9yZSBiZWluZyBhYnNvcmJlZC4KLQkgKi8KLQlpbnQgREVQRU5ERU5DWV9UWVBFX1VTRVMgPSBEZXBlbmRlbmN5VHlwZS5VU0VTOwotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHdpbGwgYmUgYWJzb3JiZWQgYXMgaXMgd2l0aG91dCBhcmNoaXZpbmcuIAotCSAqLwotCWludCBERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMgPSBEZXBlbmRlbmN5VHlwZS5DT05TVU1FUzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoaXMgdmlydHVhbCByZWZlcmVuY2UgaW4gbW9kZWwsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQ3VycmVudGx5IG5vIHVwZGF0ZSBmbGFncyBhcHBseS4gCi0JICogQHBhcmFtIGFNb25pdG9yIEEgcHJvZ3Jlc3MgbW9uaXRvciB0byB0cmFjayB0aGUgY29tcGxldGlvbiBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVmZXJlbmNlIGFjdHVhbCBleGlzdHMgaW4gdGhlIG1vZGVsCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgcmVmZXJlbmNlIGFjdHVhbCBleGlzdHMgaW4gdGhlIG1vZGVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCk7Ci0JCi0JLyoqCi0JICogVGhlIHJ1bnRpbWUgcGF0aCBpbmRpY2F0ZXMgd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkCi0JICogY29tcG9uZW50IHdpbGwgYmUgYWJzb3JiZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgY29tcG9uZW50LgotCSAqIEBwYXJhbSBhUnVudGltZVBhdGggQSB2YWx1ZSBjb21wb25lbnQtcmVsYXRpdmUgcGF0aC4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVBhdGgoSVBhdGggYVJ1bnRpbWVQYXRoKTsKLQkvKioKLQkgKiBUaGUgcnVudGltZSBwYXRoIGluZGljYXRlcyB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb21wb25lbnQgd2lsbCBiZSBhYnNvcmJlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGVuY2xvc2luZyBjb21wb25lbnQuCi0JICogQHJldHVybiBBIHZhbHVlIGNvbXBvbmVudC1yZWxhdGl2ZSBwYXRoLiAKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoKTsKLQkKLQkvKioKLQkgKiBUaGUgZGVwZW5kZW5jeVR5cGUgaW5kaWNhdGVzIGhvdyB0aGUgY29udGVudHMgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IHdpbGwgYmUgYWJzb3JiZWQuCi0JICogQHBhcmFtIGFEZXBlbmRlbmN5VHlwZSBPbmUgb2YgREVQRU5ERU5DWV9UWVBFX1VTRVMgb3IgREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTCi0JICogQHNlZSAjREVQRU5ERU5DWV9UWVBFX1VTRVMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXBlbmRlbmN5VHlwZShpbnQgYURlcGVuZGVuY3lUeXBlKTsKLQkKLQotCS8qKgotCSAqIEByZXR1cm4gT25lIG9mIERFUEVOREVOQ1lfVFlQRV9VU0VTIG9yIERFUEVOREVOQ1lfVFlQRV9DT05TVU1FUwotCSAqIEBzZWUgI0RFUEVOREVOQ1lfVFlQRV9DT05TVU1FUwotCSAqIEBzZWUgI0RFUEVOREVOQ1lfVFlQRV9VU0VTCi0JICovCi0JcHVibGljIGludCBnZXREZXBlbmRlbmN5VHlwZSgpOwotCQotCS8qKgotCSAqIFRoZSBlbmNsb3NpbmcgY29tcG9uZW50IGNvbnRhaW5zIHRoaXMgcmVmZXJlbmNlLCBhbmQgd2lsbCBhYnNvcmIgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudAotCSAqIEByZXR1cm4gVGhlIGVuY2xvc2luZyBjb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCk7Ci0JCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IGlzICJ0YXJnZXRlZCIgYnkgdGhlIHJlZmVyZW5jZSwgYW5kIHdpbGwgYmUgYWJzb3JiZWQgYnkgdGhlIGVuY2xvc2luZyBjb21wb25lbnQuIAotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCB0aGF0IGlzICJ0YXJnZXRlZCIgYnkgdGhlIHJlZmVyZW5jZSBhbmQgd2lsbCBiZSBhYnNvcmJlZCBieSB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4gCi0JICogQHBhcmFtIHJlZmVyZW5jZWRDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQsIEVPYmplY3QgZGVwZW5kZW50T2JqZWN0KTsKLQkKLQkKLQkvKioKLQkgKiBHZXQgdGhlIGFyY2hpdmUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50Ci0JICogQHBhcmFtIGFyY2hpdmVOYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZU5hbWUoU3RyaW5nIGFyY2hpdmVOYW1lKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvSVZpcnR1YWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZThlMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9JVmlydHVhbFJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLQotCi0vKioKLSAqIDxwPgotICogQWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlcyAKLSAqIHVzaW5nIEFQSSBzaW1pbGFyIHRvIHRoZSBFY2xpcHNlIFBsYXRmb3JtIElSZXNvdXJjZSBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogSVZpcnR1YWxSZXNvdXJjZSBhbGxvd3MgcmVzb3VyY2VzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYQotICogYWJzdHJhY3QgcGF0aCByZWZlcnJlZCB0byBhcyBhICJydW50aW1lIHBhdGgiLiAKLSAqIEEgdmlydHVhbCByZXNvdXJjZSBtYXkgcmVwcmVzZW50IG11bHRpcGxlIHVuZGVybHlpbmcgcmVzb3VyY2VzLgotICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBleGFjdGx5IG9uZSBjb21wb25lbnQuCi0gKiBBIHJlc291cmNlIG1heSBiZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB2aXJ0dWFsIHJlc291cmNlcywgd2hpY2gKLSAqIG1heSBiZSBjb250YWluZWQgYnkgb25lIG9yIG1vcmUgY29tcG9uZW50cy4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElWaXJ0dWFsUmVzb3VyY2UgYWxsb3dzIGNsaWVudHMgdG8gYWNxdWlyZQotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaW5jbHVkaW5nIHRoZSBuYW1lLCAKLSAqIGFuZCB0aGUgcGF0aHMgd2hpY2ggYXJlIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IHJlc291cmNlLCBzdWNoCi0gKiBhcyB0aGUge0BsaW5rICNnZXRSdW50aW1lUGF0aCgpIHJ1bnRpbWUgcGF0aH0sIHRoZSAKLSAqIHtAbGluayAjZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGh9Ci0gKiBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwgYW5kIHRoZSAKLSAqIHtAbGluayAjZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpIHByb2plY3QtcmVsYXRpdmUgcGF0aH0KLSAqIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogPGEgbmFtZT0icmVmZXJlbmNlcyIgLz4KLSAqIDxwPkVhY2ggSVZpcnR1YWxSZXNvdXJjZSBjYW4gcmVwcmVzZW50IGFuIDxiPmltcGxpY2l0PC9iPiByZWZlcmVuY2Ugb3IKLSAqIGFuIDxiPmV4cGxpY2l0PC9iPiByZWZlcmVuY2UuIEFuIDxiPmV4cGxpY2l0PC9iPiByZWZlcmVuY2UgaXMgYSBmb3JtYWwKLSAqIG1hcHBpbmcgZnJvbSBzb21lIHBhdGggd2l0aGluIHRoZSBmaWxlIHN0cnVjdHVyZSB0byBhIHJ1bnRpbWUgcGF0aC4gQ2hhbmdpbmcKLSAqIG9yIHJlbW92aW5nIGFuIGV4cGxpY2l0IHJlZmVyZW5jZSBvbmx5IHJlcXVpcmVzIG1vZGVsIG1vZGlmaWNhdGlvbnMuIEFuIAotICogPGI+aW1wbGljaXQ8L2I+IHJlZmVyZW5jZSBoYXMgYSByb290IHdoaWNoIGlzIGRlcml2ZWQgZnJvbSBhbiBleHBsaWNpdCBwYXRoLAotICogYnV0IHNvbWUgZnJhZ21lbnQgb2YgdGhlIHBhdGggdG93YXJkcyB0aGUgZW5kIGlzIGRlcml2ZWQgZnJvbSB0aGUgbGl0ZXJhbCAKLSAqIHBhdGggd2l0aGluIHRoZSBmaWxlIHN0cnVjdHVyZS4gTW9kaWZpY2F0aW9ucyB0byBpbXBsaWNpdCBwYXRocyBtYXkgY2F1c2UgCi0gKiBjaGFuZ2VzIHRvIHN0cnVjdHVyZSBvbiBkaXNrLiBGb3IgcmVzb3VyY2UgbW9kaWZpY2F0aW9ucyB0aGF0IHNob3VsZCBub3QgbW9kaWZ5Ci0gKiBzdHJ1Y3R1cmVzIG9uIGRpc2ssIHVzZSB7QGxpbmsgI0lHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFfS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmlydHVhbFJlc291cmNlIGV4dGVuZHMgSVNjaGVkdWxpbmdSdWxlLCBJQWRhcHRhYmxlIHsgIAotCQkJCQkJCQkJCQkJCQkJCQkKLQotCS8qCi0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0JICogQ29uc3RhbnRzIGRlZmluaW5nIHJlc291cmNlIHR5cGVzOiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSByZXNvdXJjZSAKLQkgKiB0eXBlcyBhbmQgdGhlaXIgdHlwZSBjb25zdGFudHMgYXJlIGluIHRoZSBoZXggcmFuZ2UgMHgxMCB0byAweDgwIAotCSAqIGFzIGRlZmluZWQgYmVsb3cuCi0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkgKi8KLQotCS8qKgotCSAqIFR5cGUgY29uc3RhbnQgKGJpdCBtYXNrIHZhbHVlIDE2KSB3aGljaCBpZGVudGlmaWVzIGZpbGUgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgSVZpcnR1YWxSZXNvdXJjZSNnZXRUeXBlKCkKLQkgKiBAc2VlIElWaXJ0dWFsRmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEUgPSAweDEwOwotCi0JLyoqCi0JICogVHlwZSBjb25zdGFudCAoYml0IG1hc2sgdmFsdWUgMzIpIHdoaWNoIGlkZW50aWZpZXMgZm9sZGVyIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSBJVmlydHVhbEZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPTERFUiA9IDB4MjA7Ci0KLQkvKioKLQkgKiBUeXBlIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSA2NCkgd2hpY2ggaWRlbnRpZmllcyB0aGUgcm9vdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAc2VlIElWaXJ0dWFsUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSBJVmlydHVhbENvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVCA9IDB4NDA7Ci0JCi0JLyoqCi0JICogR2VuZXJhbCBwdXJwb3NlIHplcm8tdmFsdWVkIGJpdCBtYXNrIGNvbnN0YW50LiBVc2VmdWwgd2hlbmV2ZXIgeW91IG5lZWQgdG8gc3VwcGx5IGEgYml0IG1hc2sKLQkgKiB3aXRoIG5vIGJpdHMgc2V0LgotCSAqIDxwPgotCSAqIEV4YW1wbGUgdXNhZ2U6IDxjb2RlPgotCSAqIDxwcmU+Ci0JICogZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuTk9ORSwgbnVsbCkKLQkgKiA8L3ByZT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwbGFubmVkZm9yIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JLyoKLQkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb25zdGFudHMgZm9yIHVwZGF0ZQotCSAqIGZsYWdzIGZvciBkZWxldGUsIG1vdmUsIGNvcHksIG9wZW4sIGV0Yy46Ci0JICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkgKi8KLQotCS8qKgotCSAqIFVwZGF0ZSBmbGFnIGNvbnN0YW50IChiaXQgbWFzayB2YWx1ZSAyNTYpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBwcm9jZWVkIGV2ZW4gaWYKLQkgKiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICogCi0JICogQHBsYW5uZWRmb3IgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SQ0UgPSAweDEwMDsgCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBleGNsdXNpb25zIGVudW1lcmF0ZWQgaW4gdGhlIG1vZGVsIHNob3VsZCBiZSBpZ25vcmVkLiAoYml0IG1hc2sgdmFsdWUgNTEyKSAgCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0VYQ0xVU0lPTlMgPSAweDIwMDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGF0IG1vZGlmaWNhdGlvbnMgc2hvdWxkIG9ubHkgbW9kaWZ5IHRoZSBtZXRhbW9kZWwgYW5kIGlnbm9yZSB0aGUgdW5kZXJseWluZwotCSAqIHJlc291cmNlcyB3aGVyZSBhcHBsaWNhYmxlLiAgU2VlIHRoZSAKLQkgKiA8YSBocmVmPSJJVmlydHVhbFJlc291cmNlLmh0bWwjcmVmZXJlbmNlcyI+ZG9jdW1lbnRhdGlvbiBvbiByZWZlcmVuY2VzPC9hPiAKLQkgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aHkgdGhpcyBmbGFnIGlzIHJlbGV2YW50LiAoYml0IG1hc2sgdmFsdWUgMTAyNCkgIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFID0gMHg0MDA7ICAKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gdGhlIHN1cHBsaWVkIGxvY2F0aW9uIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyAKLQkgKiB2aXJ0dWFsIHJlc291cmNlLiBNb2RlbCBjaGFuZ2VzIHdpbGwgb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QsIAotCSAqIGFuZCBwb3RlbnRpYWxseSByZXNvdXJjZS1sZXZlbCBjcmVhdGlvbnMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uIEEgcHJvamVjdCByZWxhdGl2ZSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJ1bnRpbWUgcGF0aCBhZnRlciB0aGlzIGNhbGwKLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MgQSBiaXRtYXNrIG9mIGZsYWdzIHRvIHN1cHBseSB0byB0aGUgbWV0aG9kLiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtYXBwaW5nLCBpZiBpdCBleGlzdHMsIGZyb20gdGhlIHN1cHBsaWVkIGxvY2F0aW9uIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyAKLQkgKiB2aXJ0dWFsIHJlc291cmNlLiBNb2RlbCBjaGFuZ2VzIHdpbGwgb2NjdXIgYXMgYSByZXN1bHQgb2YgdGhpcyBtZXRob2QsIAotCSAqIGFuZCBwb3RlbnRpYWxseSByZXNvdXJjZS1sZXZlbCBjcmVhdGlvbnMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uIEEgcHJvamVjdCByZWxhdGl2ZSBsb2NhdGlvbiB3aG9zZSBtYXBwaW5nIHRvIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIHJlbW92ZWQuCi0JICogQHBhcmFtIHVwZGF0ZUZsYWdzIEEgYml0bWFzayBvZiBmbGFncyB0byBzdXBwbHkgdG8gdGhlIG1ldGhvZC4gCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaW5rKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiwgaW50IHVwZGF0ZUZsYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JCi0JLyoqICAgCi0JICogUmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBmbGV4aWJsZSBzdHJ1Y3R1cmUuIFJlbW92aW5nIHRoZSByZXNvdXJjZSBjb3VsZCByZXF1aXJlCi0JICogY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBtZXRhbW9kZWwgb3IgY2hhbmdlcyB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUuIFRvIGF2b2lkCi0JICogY2hhbmdlcyB0aGUgYWN0dWFsIGRpc2sgc3RydWN0dXJlLCB1c2Uge0BsaW5rICNJR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRX0uCi0JICogPHA+Ci0JICogVXBkYXRlIGZsYWdzIHN1cHBsaWVkIHRvIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGFzc2VkIGludG8gYW55IElSZXNvdXJjZSBtb2RpZmljYXRpb24KLQkgKiBBUEkgd2hpY2ggaXMgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgbWV0aG9kJ3MgaW52b2NhdGlvbi4gIAotCSAqIDwvcD4KLQkgKiBAc2VlICNJR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRQotCSAqIEBzZWUgSVJlc291cmNlI2RlbGV0ZShpbnQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHk7IGZvciByZXNvdXJjZXMsIGVxdWFsaXR5IGlzIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlaXIKLQkgKiBoYW5kbGVzOiBzYW1lIHJlc291cmNlIHR5cGUsIGVxdWFsIGZ1bGwgcGF0aHMsIGFuZCBpZGVudGljYWwgd29ya3NwYWNlcy4gUmVzb3VyY2VzIGFyZSBub3QKLQkgKiBlcXVhbCB0byBvYmplY3RzIG90aGVyIHRoYW4gcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBvdGhlcgotCSAqICAgICAgICAgICAgdGhlIG90aGVyIG9iamVjdAotCSAqIEByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBvYmplY3RzIGFyZSBlcXVhbHMKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHZpcnR1YWwgcmVzb3VyY2UgaXMgYmFja2VkIGJ5IGFuIGFjY2Vzc2libGUgSVJlc291cmNlLiAKLQkgKiA8cD4KLQkgKiA8Y29kZT5JVmlydHVhbFJlc291cmNlPC9jb2RlPiBvYmplY3RzIGFyZSBsaWdodHdlaWdodCBoYW5kbGUgb2JqZWN0cyB1c2VkIHRvIGFjY2VzcwotCSAqIElSZXNvdXJjZXMuIEhvd2V2ZXIsIGhhdmluZyBhbiBJVmlydHVhbFJlc291cmNlIGhhbmRsZSBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZQotCSAqIHVuZGVybHlpbmcgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGhhbmRsZSBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSwgb3IgaXMgYWNjZXNzaWJsZS4KLQkgKiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBleGlzdGVuY2Ugb3IgYWNjZXNzaWJpbGl0eSBvZiB0aGUgdW5kZXJseWluZyAKLQkgKiByZXNvdXJjZSwge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UjZXhpc3RzKCkKLQkgKiBAc2VlICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gb2YgdGhpcyB2aXJ0dWFsIHJlc291cmNlJ3MgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcwotCSAqIG5vdCBoYXZlIG9uZS4gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIHdpbGwgYmUgcmV0dXJuZWQsIHdoaWNoIG1heSBvciBtYXkgbm90IG1hdGNoCi0JICogdGhhdCBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4gCi0JICogPHA+Ci0JICogVGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gaXMgZGVmaW5lZCBhcyB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdCBwZXJpb2QgKCIuIikgY2hhcmFjdGVyCi0JICogaW4gdGhlIG5hbWUuIElmIHRoZXJlIGlzIG5vIHBlcmlvZCBpbiB0aGUgbmFtZSwgdGhlIHBhdGggaGFzIG5vIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24uIElmCi0JICogdGhlIG5hbWUgZW5kcyBpbiBhIHBlcmlvZCwgdGhlIGZpbGUgZXh0ZW5zaW9uIHBvcnRpb24gaXMgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0cmluZyBmaWxlIGV4dGVuc2lvbgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuIElmIHRoaXMgcmVzb3VyY2UgZG9lcwotCSAqIGV4aXN0LCBpdHMgcGF0aCBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhpcyByZXNvdXJjZQotCSAqIEBzZWUgI2dldFByb2plY3RSZWxhdGl2ZVBhdGgoKQotCSAqIEBzZWUgSVJlc291cmNlI2dldEZ1bGxQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYSByZWxhdGl2ZSBwYXRoIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHdpdGggcmVzcGVjdCB0byBpdHMgcHJvamVjdC4gIAotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuIElmIHRoaXMgcmVzb3VyY2UgZG9lcwotCSAqIGV4aXN0LCBpdHMgcGF0aCBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFByb2plY3QtcmVsYXRpdmUgcGF0aHMgYXJlIHJlY29tbWVuZGVkIG92ZXIgYWJzb2x1dGUgcGF0aHMsIHNpbmNlIHRoZSBmb3JtZXIgYXJlIG5vdCBhZmZlY3RlZAotCSAqIGlmIHRoZSBwcm9qZWN0IGlzIHJlbmFtZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSB3aXRoIHJlc3BlY3QgdG8gaXRzIHByb2plY3QKLQkgKiBAc2VlICNnZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBzZWUgSVJlc291cmNlI2dldFByb2plY3RSZWxhdGl2ZVBhdGgoKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHBhdGggb2YgdGhpcyB2aXJ0dWFsIHJlc291cmNlLiBUaGUgcnVudGltZSBwYXRoCi0JICogaXMgZGV0ZXJtaW5lZCB0aHJvdWdoIHRoZSBtZXRhbW9kZWwgYW5kIHJlcHJlc2VudHMgdGhlIHBhdGggdGhhdCB0aGUKLQkgKiB1bmRlcmx5aW5nIHJlc291cmNlIHdpbGwgYmUgYWNjZXNzZWQgYXQgcnVudGltZS4gCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSBwYXRoIG9mIHRoaXMgdmlydHVhbCByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuIFRoZSBuYW1lIG9mIGEgdmlydHVhbCByZXNvdXJjZSAKLQkgKiBpcyBzeW5vbnltb3VzIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiBpdHMgcnVudGltZSBwYXRoLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSByZXNvdXJjZSBoYW5kbGUgb3BlcmF0aW9uOyB0aGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoaXMgcmVzb3VyY2UgZXhpc3RzLCBpdHMgbmFtZSBjYW4gYmUgc2FmZWx5IGFzc3VtZWQgdG8gYmUgdmFsaWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UKLQkgKiBAc2VlICNnZXRSdW50aW1lUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGlzIHZpcnR1YWwgcmVzb3VyY2UuCi0JICogPHA+Ci0JICogRWFjaCB2aXJ0dWFsIHJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBhdCBsZWFzdCBvbmUgY29tcG9uZW50LiBBIGNvbXBvbmVudAotCSAqIHJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbGxlY3Rpb24gb2YgZmlsZXMuIElmIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGlzIAotCSAqIGNvbnRhaW5lZCBieSBtdWx0aXBsZSBjb21wb25lbnRzLCB0aGVuIHRoZSBjb21wb25lbnQgbmFtZSByZXR1cm5lZCBieQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBob3cgdGhlIHZpcnR1YWwgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuIAotCSAqIEZvciBlYWNoIHZpcnR1YWwgcmVzb3VyY2UsIHRoZSBjb21wb25lbnQgbmFtZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSAKLQkgKiBjb21wb25lbnQgbmFtZSBvZiB0aGUgcGFyZW50LgotCSAqICAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgdmlydHVhbCByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpcnR1YWwgcmVzb3VyY2Ugd2hpY2ggY29udGFpbnMgdGhpcyB2aXJ0dWFsIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMKLQkgKiBubyBwYXJlbnQgKHRoYXQgaXMsIHRoZSB2aXJ0dWFsIHJlc291cmNlIHJlcHJlc2VudHMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBvbmVudCkuCi0JICogPHA+Ci0JICogVGhlIGZ1bGwgcGF0aCBvZiB0aGUgcGFyZW50IHJlc291cmNlIGlzIHRoZSBzYW1lIGFzIHRoaXMgcmVzb3VyY2UncyBmdWxsIHBhdGggd2l0aCB0aGUgbGFzdAotCSAqIHNlZ21lbnQgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIHJlc291cmNlIG5vciB0aGUgcmVzdWx0aW5nIHJlc291cmNlIG5lZWQKLQkgKiBleGlzdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgY29udGFpbmVyIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHZpcnR1YWwgcmVzb3VyY2UgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50Ci0JICovCi0JcHVibGljIElWaXJ0dWFsQ29udGFpbmVyIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB3aGljaCBjb250YWlucyB0aGUgY29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoaXMgdmlydHVhbCByZXNvdXJjZS4gCi0JICogPHA+Ci0JICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgbWF5IG5vdCAoYW5kIG1vc3QgbGlrZWx5IHdpbGwgbm90KSBiZSByZWZlcmVuY2VkIGluIHRoZSAKLQkgKiBydW50aW1lIHBhdGggb2YgdGhpcyB2aXJ0dWFsIHBhdGgsIGJ1dCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IG5laXRoZXIgdGhlIHJlc291cmNlIG5vciB0aGUgcmVzdWx0aW5nIHByb2plY3QgbmVlZAotCSAqIGV4aXN0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIG9uZSBvZiA8Y29kZT5GSUxFPC9jb2RlPiwKLQkgKiA8Y29kZT5GT0xERVI8L2NvZGU+LCA8Y29kZT5DT01QT05FTlQ8L2NvZGU+Ci0JICogPHA+Ci0JICogPHVsPgotCSAqIDxsaT4gQWxsIHJlc291cmNlcyBvZiB0eXBlIDxjb2RlPkZJTEU8L2NvZGU+IGltcGxlbWVudCA8Y29kZT5JVmlydHVhbEZpbGU8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVzb3VyY2VzIG9mIHR5cGUgPGNvZGU+Rk9MREVSPC9jb2RlPiBpbXBsZW1lbnQgPGNvZGU+SVZpcnR1YWxGb2xkZXI8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVzb3VyY2VzIG9mIHR5cGUgPGNvZGU+Q09NUE9ORU5UPC9jb2RlPiBpbXBsZW1lbnQgPGNvZGU+SVZpcnR1YWxDb250YWluZXI8L2NvZGU+LjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBpcyBhIHJlc291cmNlIGhhbmRsZSBvcGVyYXRpb247IHRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBAc2VlICNGSUxFCi0JICogQHNlZSAjRk9MREVSCi0JICogQHNlZSAjQ09NUE9ORU5UCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGEgcmVwcmVzZW50YXRpb24gb2Ygb25lIG9yIG1vcmUgRWNsaXBzZSBQbGF0Zm9ybSByZXNvdXJjZXMuIAotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlICJwcmltYXJ5IiB1bmRlcmx5aW5nIHJlc291cmNlLiBUaGUgcmVzb3VyY2UgbWF5IG9yIG1heSBub3QgZXhpc3QuIFRoZSByZXNvdXJjZQotCSAqIHdpbGwgYmUgY29udGFpbmVkIGJ5IHRoZSBwcm9qZWN0IHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdCgpfS4gIAotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTaW5jZSBhIHZpcnR1YWwgcmVzb3VyY2UgY291bGQgcmVwcmVzZW50IG11bHRpcGxlIHJlc291cmNlcywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gCi0JICogdGhlICJwcmltYXJ5IiByZXNvdXJjZS4gRm9yIGNsaWVudHMgdGhhdCB3aXNoIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBtdWx0aXBsZSByZXNvdXJjZXMKLQkgKiBhdCBhIHNpbmdsZSBwYXRoLCB1c2Uge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCl9LiAKLQkgKiBAcmV0dXJuIFRoZSBwcmltYXJ5IHJlc291cmNlIHRoYXQgYmFja3MgdGhpcyB2aXJ0dWFsIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCi0JLyoqCi0JICogQSB2aXJ0dWFsIHJlc291cmNlIGlzIGEgcmVwcmVzZW50YXRpb24gb2Ygb25lIG9yIG1vcmUgRWNsaXBzZSBQbGF0Zm9ybSByZXNvdXJjZXMuIAotCSAqIDxwPgotCSAqIFJldHVybnMgYWxsIHVuZGVybHlpbmcgcmVzb3VyY2VzLiBUaGUgcmVzb3VyY2VzIG1heSBvciBtYXkgbm90IGV4aXN0LiBUaGUgcmVzb3VyY2VzCi0JICogd2lsbCBiZSBjb250YWluZWQgYnkgdGhlIHByb2plY3QgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0KCl9LiAgCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFNpbmNlIGEgdmlydHVhbCByZXNvdXJjZSBjb3VsZCByZXByZXNlbnQgbXVsdGlwbGUgcmVzb3VyY2VzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAKLQkgKiBhbGwgdW5kZXJseWluZyByZXNvdXJjZXMuIEZvciBjbGllbnRzIHRoYXQgcHJlZmVyIHRvIGFja25vd2xlZGdlIG9ubHkgb25lIHJlc291cmNlLCAKLQkgKiBhdCBhIHNpbmdsZSBwYXRoLCB1c2Uge0BsaW5rICNnZXRVbmRlcmx5aW5nUmVzb3VyY2UoKX0uIAotCSAqIEByZXR1cm4gQWxsIHJlc291cmNlcyB0aGF0IGJhY2sgdGhpcyB2aXJ0dWFsIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCk7IAotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS4gRm9yIGZpbGVzIGFuZCBmb2xkZXJzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KLQkgKiBleGlzdGluZzsgZm9yIHByb2plY3RzLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gZXhpc3RpbmcgYW5kIGJlaW5nIG9wZW4uIFRoZSB3b3Jrc3BhY2Ugcm9vdCBpcwotCSAqIGFsd2F5cyBhY2Nlc3NpYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKiBAc2VlICNleGlzdHMoKQotCSAqIEBzZWUgSVByb2plY3QjaXNPcGVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc2libGUoKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2VUeXBlIHByb3ZpZGVzIG1ldGEtaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGVzIG9mIGNvbnRlbnQgdGhpcyB2aXJ0dWFsIHJlc291cmNlIG1heSByZXByZXNlbnQuIEV4YW1wbGVzCi0JICogaW5jbHVkZSAiamF2YSIsICJyZXNvdXJjZXMiLCAiYnBlbCIsIGV0Yy4gCi0JICogPHA+Ci0JICogVGhlIHJlc291cmNlVHlwZSBtYXkgYmUgbnVsbCwgYW5kIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0gd2lsbCBhbHdheXMgcmV0dXJuIG51bGwgZm9yIHRoaXMgbWV0aG9kLiAKLQkgKiA8L3A+Ci0JICogQHJldHVybiBBIGNsaWVudC1zZXQgcmVzb3VyY2VUeXBlIHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlVHlwZSBwcm92aWRlcyBtZXRhLWluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBvZiBjb250ZW50IHRoaXMgdmlydHVhbCByZXNvdXJjZSBtYXkgcmVwcmVzZW50LiBFeGFtcGxlcwotCSAqIGluY2x1ZGUgImphdmEiLCAicmVzb3VyY2VzIiwgImJwZWwiLCBldGMuIAotCSAqIDxwPgotCSAqIFRoZSByZXNvdXJjZVR5cGUgbWF5IGJlIG51bGwsIGFuZCB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnR9IHdpbGwgYWx3YXlzIHJldHVybiBudWxsIGZvciB0aGlzIG1ldGhvZC4gCi0JICogPC9wPgotCSAqIEBwYXJhbSBBIGNsaWVudC1zZXQgcmVzb3VyY2VUeXBlIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZShTdHJpbmcgYVJlc291cmNlVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTFiYTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+bW9kdWxlY29yZSByZXNvdXJjZXMgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+Ci0gICAgICAgIFRoZSBDb21wb25lbnRDb3JlIFZpcnR1YWwgUGF0aCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbmF2aWdhdGUgCi0gICAgICAgIGxvZ2ljYWwgY29sbGVjdGlvbnMgb2YgZmlsZXMgd2l0aGluIEVjbGlwc2UgcHJvamVjdHMgdXNpbmcgQVBJIAotICAgICAgICBzaW1pbGFyIHRvIHRoZSBFY2xpcHNlIElSZXNvdXJjZSBBUEkuIAotCQk8L3A+Ci08YSBuYW1lPSJ0b3AiPjwvYT48YSBuYW1lPSJ2aXJ0dWFsLXBhdGgiPjwvYT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiBib3JkZXI9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjMDA4MGMwIiBhbGlnbj0ibGVmdCIgY29sc3Bhbj0iMiI+PGI+PGZvbnQgZmFjZT0iQXJpYWwsSGVsdmV0aWNhIiBjb2xvcj0iI2ZmZmZmZiI+VmlydHVhbCBQYXRoIEFQSTwvZm9udD48L2I+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxCUj4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotCSAgICAgICAgVGhlIFZpcnR1YWwgUGF0aCBBUEkgcHJvdmlkZXMgYSBmYWNhZGUgdG8gdGhlIGZsZXhpYmxlIHByb2plY3QgbW9kZWwuIAotCSAgICAgICAgRWFjaCBJVmlydHVhbFJlc291cmNlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBmcm9tIHRoZSBydW50aW1lIGNvbXBvbmVudCAKLQkgICAgICAgIHVuZGVyIGEgdmlydHVhbCBydW50aW1lIHBhdGguIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgcmVwcmVzZW50IG9uZSAKLQkgICAgICAgIG9yIG1vcmUgRWNsaXBzZSBQbGF0ZnJvbSByZXNvdXJjZXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0gICAgICAgIDwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPgotICAgICAgICAJRWFjaCBJVmlydHVhbFJlc291cmNlIGlzIGNvbnRhaW5lZCBieSBleGFjdGx5IG9uZSBJVmlydHVhbENvbXBvbmVudC4gCi0gICAgICAgIAlIb3dldmVyLCB0aGUgdW5kZXJseWluZyByZXNvdXJjZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIAotICAgICAgICAJSVZpcnR1YWxSZXNvdXJjZSBtYXkgYmUgY29udGFpbmVkIGJ5IG11bHRpcGxlIElWaXJ0dWFsQ29tcG9uZW50cy4gCi0gICAgICAgIAlJVmlydHVhbENvbXBvbmVudHMgYXJlIGNvbnRhaW5lZCBieSBJRmxleGlibGVQcm9qZWN0cy4gRWFjaAotICAgICAgICAJSUZsZXhpYmxlUHJvamVjdCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBJVmlydHVhbENvbXBvbmVudHMuIAotICAgICAgICA8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMTAiPgotPHRyPgotPHRkPgotPHA+Ci08aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vb3ZlcnZpZXcvbWFwcGluZy5qcGciPjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPgotPHA+Ci08aT5GaWd1cmUgMTogQSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBwb3NzaWJsZSBtYXBwaW5nIGJldHdlZW4gYSBWaXJ0dWFsIHN0cnVjdHVyZSBhbmQgYSBQbGF0Zm9ybSBSZXNvdXJjZSBzdHJ1Y3R1cmUuPC9pPgotPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEwIj4KLTx0cj4KLTx0ZD4KLTxwPgotPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L3ZpcnR1YWxfcGF0aF9hcGkuanBnIj48L3A+Ci08L3RkPgotPC90cj4KLTx0cj4KLTx0ZD4KLTxwPgotPGk+RmlndXJlIDI6IFZpcnR1YWwgUGF0aCBNb2RlbDwvaT4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTxhIGhyZWY9IiN0b3AiPnRvcDwvYT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvcmVzb3VyY2VzL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk5ZjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9yZXNvdXJjZXMvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhCi0gICAgICAgICAgICBuYW1lPSJyb290IgotICAgICAgICAgICAgY29udGVudD0iLi4vLi4vLi4vLi4vLi4vIiAvPgotICAgICAgICA8dGl0bGU+Y29tcG9uZW50IGNvcmUgcmVzb3VyY2VzIGFwaSBvdmVydmlldzwvdGl0bGU+Ci0gICAgPC9oZWFkPgotCi0gICAgPGJvZHk+ICAKLQkJPGFic3RyYWN0PgotICAgICAgICBUaGUgQ29tcG9uZW50Q29yZSBWaXJ0dWFsIFBhdGggQVBJIGFsbG93cyBjbGllbnRzIHRvIG5hdmlnYXRlIAotICAgICAgICBsb2dpY2FsIGNvbGxlY3Rpb25zIG9mIGZpbGVzIHdpdGhpbiBFY2xpcHNlIHByb2plY3RzIHVzaW5nIEFQSSAKLSAgICAgICAgc2ltaWxhciB0byB0aGUgRWNsaXBzZSBJUmVzb3VyY2UgQVBJLiAKLQkJPC9hYnN0cmFjdD4KLQotCQk8YSBuYW1lPSJ0b3AiLz4KLQkJPCEtLQotCQk8cD4KLQkJCVRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlc2UgdG9waWNzOgotCQkJPHVsPgotCQkJCTxsaT48YSBocmVmPSIjdmlydHVhbC1wYXRoIj5Qb2ludGVyIDE8L2E+IEEgZGVzY3JpcHRpb248L2xpPiAgCi0JCQk8L3VsPgotCQk8L3A+Ci0JCS0tPgotCQk8YSBuYW1lPSJ2aXJ0dWFsLXBhdGgiLz4KLSAgICAgICAgPGgyPlZpcnR1YWwgUGF0aCBBUEk8L2gyPgotICAgICAgICA8QlIgLz4gCi0gICAgICAgIDxwPgotCSAgICAgICAgVGhlIFZpcnR1YWwgUGF0aCBBUEkgcHJvdmlkZXMgYSBmYWNhZGUgdG8gdGhlIGZsZXhpYmxlIHByb2plY3QgbW9kZWwuIAotCSAgICAgICAgRWFjaCBJVmlydHVhbFJlc291cmNlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBmcm9tIHRoZSBydW50aW1lIGNvbXBvbmVudCAKLQkgICAgICAgIHVuZGVyIGEgdmlydHVhbCBydW50aW1lIHBhdGguIEVhY2ggSVZpcnR1YWxSZXNvdXJjZSBtYXkgcmVwcmVzZW50IG9uZSAKLQkgICAgICAgIG9yIG1vcmUgRWNsaXBzZSBQbGF0ZnJvbSByZXNvdXJjZXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBydW50aW1lIHBhdGguCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgIAlFYWNoIElWaXJ0dWFsUmVzb3VyY2UgaXMgY29udGFpbmVkIGJ5IGV4YWN0bHkgb25lIElWaXJ0dWFsQ29tcG9uZW50LiAKLSAgICAgICAgCUhvd2V2ZXIsIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlcyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0aGUgCi0gICAgICAgIAlJVmlydHVhbFJlc291cmNlIG1heSBiZSBjb250YWluZWQgYnkgbXVsdGlwbGUgSVZpcnR1YWxDb21wb25lbnRzLiAKLSAgICAgICAgCUlWaXJ0dWFsQ29tcG9uZW50cyBhcmUgY29udGFpbmVkIGJ5IElGbGV4aWJsZVByb2plY3RzLiBFYWNoCi0gICAgICAgIAlJRmxleGlibGVQcm9qZWN0IG1heSBjb250YWluIG9uZSBvciBtb3JlIElWaXJ0dWFsQ29tcG9uZW50cy4gCi0gICAgICAgIDwvcD4KLSAgICAgICAgPGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uL292ZXJ2aWV3L21hcHBpbmcuanBnIiAKLSAgICAgICAgCSBjYXB0aW9uPSJBIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBhIHBvc3NpYmxlIG1hcHBpbmcgYmV0d2VlbiBhIFZpcnR1YWwgc3RydWN0dXJlIGFuZCBhIFBsYXRmb3JtIFJlc291cmNlIHN0cnVjdHVyZS4iIAotICAgICAgICAJIHdpZHRoPSI2MDAiIGhlaWdodD0iNDY2IgotICAgICAgICAJIC8+Ci0gICAgICAgIDxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi9vdmVydmlldy92aXJ0dWFsX3BhdGhfYXBpLmpwZyIgY2FwdGlvbj0iVmlydHVhbCBQYXRoIE1vZGVsIiAvPgotICAgICAgICA8IS0tCi0gICAgICAgIDxjb2Rlc25pcHBldCBjYXB0aW9uPSJBbiBleGFtcGxlIHNuaXBwZXQuIj4KLS4uLiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOyAKLS4uLgotcHVibGljIHN0YXRpYyB2b2lkIG1ha2VGbGV4aWJsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCkgewotICAgIE1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShhVGFyZ2V0UHJvamVjdCk7Ci0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgLi4uIHdvcmsgd2l0aCBtb2R1bGVDb3JlSW5zdGFuY2UgYW5kIHVuZGVybHlpbmcgbW9kZWwgLi4uCi0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5zYXZlSWZOZWNlc3NhcnkoYVByb2dyZXNzTW9uaXRvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKG1vZHVsZUNvcmVJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfSAgICAgICAgCi0gICAgICAgIDwvY29kZXNuaXBwZXQ+Ci0gICAgICAgIDxjb2Rlc25pcHBldCBjYXB0aW9uPSJBbiBleGFtcGxlIHNuaXBwZXQuIj4KLS4uLiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOyAKLS4uLgotcHVibGljIHN0YXRpYyB2b2lkIG1ha2VGbGV4aWJsZShJUHJvamVjdCBhVGFyZ2V0UHJvamVjdCkgewotICAgIE1vZHVsZUNvcmUgbW9kdWxlQ29yZUluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBNb2R1bGVDb3JlTmF0dXJlLmFkZE1vZHVsZUNvcmVOYXR1cmVJZk5lY2Vzc2FyeShhVGFyZ2V0UHJvamVjdCk7Ci0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZSA9IE1vZHVsZUNvcmUuZ2V0TW9kdWxlQ29yZUZvcldyaXRlKGFUYXJnZXRQcm9qZWN0KTsKLSAgICAgICAgLi4uIHdvcmsgd2l0aCBtb2R1bGVDb3JlSW5zdGFuY2UgYW5kIHVuZGVybHlpbmcgbW9kZWwgLi4uCi0gICAgICAgIG1vZHVsZUNvcmVJbnN0YW5jZS5zYXZlSWZOZWNlc3NhcnkoYVByb2dyZXNzTW9uaXRvcik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgaWYgKG1vZHVsZUNvcmVJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb3JlSW5zdGFuY2UuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfSAgICAgICAgCi0gICAgICAgIDwvY29kZXNuaXBwZXQ+Ci0gICAgICAgIC0tPgotCQk8YSBocmVmPSIjdG9wIj50b3A8L2E+Ci0gICAgPC9ib2R5PgotPC9odG1sPiAgICAKLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQwYTg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlcj1FY2xpcHNlLm9yZwotCi1CdW5kbGUtTmFtZS4wID0gTW9kdWxlY29yZSBQbHVnLWluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyZmQ5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iY29tcG9uZW50Y29yZS54bWkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPCEtLSBNb2R1bGUgQ29yZSBQcm9qZWN0IE5hdHVyZSBDb250cmlidXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1vZHVsZUNvcmVOYXR1cmUiCi0gICAgICAgICBuYW1lPSJXZWIgUHJvcGVydGllcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4KLSAgICAgIDxydW50aW1lPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJvcmcuZWNsaXBzZS53c3QubW9kdWxlY29yZS5zdHJ1Y3R1cmFsTW9kZWwiCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVN0cnVjdHVyYWxNb2RlbEZhY3RvcnkiPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBhdXRvbG9hZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBVUkk9Ii5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudCIvPgotICAgICAgPC9lZGl0TW9kZWw+IAotICAgPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gCQkJPGZpbGUtYXNzb2NpYXRpb24KLQkJCQljb250ZW50LXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQkJZmlsZS1uYW1lcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQiLz4KLQkJCTxmaWxlLWFzc29jaWF0aW9uCi0JCQkJY29udGVudC10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJCWZpbGUtbmFtZXM9Ii5jb21wb25lbnQiLz4KLQkJCTxmaWxlLWFzc29jaWF0aW9uCi0JCQkJY29udGVudC10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJCWZpbGUtbmFtZXM9Ii53dHBtb2R1bGVzIi8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuaWdub3JlIj4KLQkJPGlnbm9yZQotICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICBwYXR0ZXJuPSIuZGVwbG95YWJsZXMiLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJDb21wb25lbnRQcm9qZWN0TWlncmF0b3IiIG5hbWU9IkNvbXBvbmVudFByb2plY3RNaWdyYXRvciIgc2NoZW1hPSJzY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QiLz4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhcnRpZmFjdGVkaXQiIG5hbWU9IkNvbXBvbmVudCBBcnRpZmFjdCBFZGl0IiBzY2hlbWE9InNjaGVtYS9hcnRpZmFjdGVkaXQuZXhzZCIvPgotICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbXBvbmVudGltcGwiIG5hbWU9ImNvbXBvbmVudGltcGwiIHNjaGVtYT0ic2NoZW1hL2NvbXBvbmVudGltcGwuZXhzZCIvPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlRmFjdG9yaWVzIiBuYW1lPSJSZXNvdXJjZSBGYWN0b3J5IEFzc29jaWF0aW9uIChJbnRlcm5hbCkiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QiLz4KLQkKLQk8IS0tIENvbnRyaWJ1dGUgYSBVUklSZXNvbHZlckV4dGVuc2lvbiBmb3IgZmxleGlibGUgcHJvamVjdHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icHJlbm9ybWFsaXphdGlvbiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZXNvbHZlciI+Ci0gICAgICAgICAgICA8cHJvamVjdE5hdHVyZSB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiIC8+Ci0JCQk8cHJvamVjdE5hdHVyZSB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndlYi5TdGF0aWNXZWJOYXR1cmUiLz4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxDb25maWdBZGFwdGVyJEZhY3RvcnkiIAotICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWciLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1vZHVsZUNvcmVWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSJNb2R1bGVDb3JlIFZhbGlkYXRvciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgIAk8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIj4KLSAgICAgICAgIDwvcHJvamVjdE5hdHVyZT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53dHBtb2R1bGVzIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmNvbXBvbmVudCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLQkJICAgPG1hcmtlcklkCi0gICAgICAgICAgICAgICAJICAgbWFya2VySWRWYWx1ZT0iTW9kdWxlQ29yZVZhbGlkYXRvck1hcmtlciI+Ci0gICAgICAgICA8L21hcmtlcklkPgotICAgICAgICAgPGhlbHBlciAgICAgIAotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVDb3JlVmFsaWRhdG9ySGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Nb2R1bGVDb3JlVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1vZHVsZUNvcmVWYWxpZGF0b3JNYXJrZXIiCi0gICAgICAgICBuYW1lPSJNb2R1bGVDb3JlIFZhbGlkYXRpb24gTWFya2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3duZXIiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ2YWxpZGF0aW9uU2V2ZXJpdHkiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJ0YXJnZXRPYmplY3QiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJncm91cE5hbWUiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJtZXNzYWdlSWQiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci08L2V4dGVuc2lvbj4gCi0KLSAgIDwhLS0gUmVnaXN0ZXIgdGhlIG5hdHVyZSBpZCB3aXRoIHRoZSBFTUZOYXR1cmUgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwubmF0dXJlX3JlZ2lzdHJhdGlvbiI+Ci0gICAgICA8bmF0dXJlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiPgotICAgICAgPC9uYXR1cmU+Ci0gICA8L2V4dGVuc2lvbj4gCi0gIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9Db21wb25lbnRQcm9qZWN0TWlncmF0b3IuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9Db21wb25lbnRQcm9qZWN0TWlncmF0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZWQxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiIGlkPSJDb21wb25lbnRQcm9qZWN0TWlncmF0b3IiIG5hbWU9IkNvbXBvbmVudCBQcm9qZWN0IE1pZ3JhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgYWxsb3dzIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZiBjb21wb25lbnRzIHRvIGNvbnRyaWJ1dGUgbWlncmF0b3JzIFRob3NlIHBsdWdpbnMgaGF2ZSBkZXBlbmRlbmNpZXMgb24gdGhlIG1vZHVsZWNvcmUgcGx1Z2luLCBidXQgbm90IHZpY2UgdmVyc2EuIEluIG9yZGVyIGZvciBjb2RlIGRlZmluZWQgd2l0aGluIHRoZSBtb2R1bGVjb3JlIHBsdWdpbiB0byBleGVjdXRlIHRoZXNlIGFjdGlvbnMsIHdlIG5lZWQgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1pZ3JhdG9yRXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWlncmF0b3JFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgZm9yIHRoZSBtaWdyYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2FydGlmYWN0ZWRpdC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZmNzRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9hcnRpZmFjdGVkaXQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9ImFydGlmYWN0ZWRpdCIgbmFtZT0iQ29tcG9uZW50IEFydGlmYWN0IEVkaXQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyBmb3IgSU5URVJOQUwgdXNlIG9ubHkhICBJdCBpcyB1c2VkIGZvciB0aGUgYmFzZSBhcnRpZmFjdCBlZGl0IHR5cGVzIG9ubHkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50IAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZSAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZSAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhcnRpZmFjdGVkaXQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSUQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgdGhpcyBhcnRpZmFjdEVkaXQgY29udHJpYnV0ZXMgdG8sIGZvciBleGFtcGxlLCB0aGUgZmFjZXQgaWQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHByb2plY3RzIHdoaWNoIHNob3VsZCB1c2UgdGhpcyBhcnRpZmFjdEVkaXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBhcnRpZmFjdCBlZGl0IGNsYXNzIGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudENvcmUueHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudENvcmUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4ODI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRDb3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9tb2R1bGVDb3JlIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbW9kdWxlQ29yZSI+DQotCTxlbGVtZW50IG5hbWU9InByb2plY3QtbW9kdWxlcyI+DQotCQk8Y29tcGxleFR5cGU+DQotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLQkJCQk8ZWxlbWVudCBuYW1lPSJ3Yi1tb2R1bGUiPg0KLQkJCQkJPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCTxlbGVtZW50IG5hbWU9Im1vZHVsZS10eXBlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCTxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQk8YXR0cmlidXRlIG5hbWU9Im1vZHVsZS10eXBlLWlkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCTwvYXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJ3Yi1yZXNvdXJjZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8YXR0cmlidXRlIG5hbWU9InNvdXJjZS1wYXRoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgCQk8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbnQtbW9kdWxlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iaGFuZGxlIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9hdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95LXBhdGgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRlbmN5LXR5cGUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQl0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8L2F0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJPC9lbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ktbmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj48L2F0dHJpYnV0ZT4NCi0JCQkJCTwvY29tcGxleFR5cGU+DQotCQkJCTwvZWxlbWVudD4NCi0JCQk8L3NlcXVlbmNlPg0KLQkJCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+DQotCQk8L2NvbXBsZXhUeXBlPg0KLQk8L2VsZW1lbnQ+DQotDQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudGltcGwuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL3NjaGVtYS9jb21wb25lbnRpbXBsLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzc1Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL2NvbXBvbmVudGltcGwuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9ImNvbXBvbmVudGltcGwiIG5hbWU9ImNvbXBvbmVudGltcGwiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29tcG9uZW50aW1wbCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvc2NoZW1hL3Jlc291cmNlRmFjdG9yaWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvcmVzb3VyY2VGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0M2JkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9zY2hlbWEvcmVzb3VyY2VGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIgaWQ9InJlc291cmNlRmFjdG9yaWVzIiBuYW1lPSJSZXNvdXJjZSBGYWN0b3J5IEFzc29jaWF0aW9uIChJbnRlcm5hbCkiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQW4gKmludGVybmFsKiBleHRlbnNpb24gcG9pbnQgdGhhdCBkZWNsYXJlcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgc2hvcnQtc2VnbWVudCBmaWxlbmFtZSBhbmQgYSBSZXNvdXJjZS5GYWN0b3J5LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvdXJjZUZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VGYWN0b3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBc3NvY2lhdGVzIGEgc2hvcnQgbmFtZSAoZS5nLiAmcXVvdDt3ZWIueG1sJnF1b3Q7KSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBSZXNvdXJjZS5GYWN0b3J5IHRvIGNyZWF0ZSB0aGUgUmVzb3VyY2UgdHlwZSB3aGVuIGxvYWRpbmcgZmlsZXMgb2YgdGhlIGRlY2xhcmVkIHNob3J0bmFtZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudFR5cGVCaW5kaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaG9ydFNlZ21lbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgdGhlIHNob3J0IHNlZ21lbnQgb2YgYSBmaWxlbmFtZSB0aGF0IHRoZSByZXNvdXJjZSBmYWN0b3J5IGFwcGxpZXMgdG8gKGUuZy4gJnF1b3Q7d2ViLnhtbCZxdW90OykuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiBtdWx0aXBsZSBmYWN0b3JpZXMgYXJlIGRlY2xhcmVkIGZvciB0aGUgc2FtZSBmaWxlTmFtZSAtIHRoZW4gdGhlICZxdW90O2RlZmF1bHQmcXVvdDsgaXMgdXNlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGVCaW5kaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJjb250ZW50VHlwZUlkIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEFkdmVydGlzZXMgdGhhdCB0aGUgY29udGFpbmluZyBlZGl0b3IgdW5kZXJzdGFuZHMgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBhbmQgaXMgc3VpdGFibGUgZm9yIGVkaXRpbmcgZmlsZXMgb2YgdGhhdCB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjb250ZW50IHR5cGUgaWRlbnRpZmllci4gVGhpcyBpcyBhbiBJRCBkZWZpbmVkIGJ5IHRoZSAmYXBvcztvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzJmFwb3M7IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODM4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjc5YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdWkuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU1N2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzAzODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSNNb24gSmFuIDMwIDIzOjQxOjU4IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhNmE1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBKYW4gMzAgMjM6MTE6NDkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdiMDRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm92aXNpb25hbC5lZGl0b3JzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuNC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDMuNC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjQuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL1JFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjOTNkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVVJIFV0aWxpdHkgY2xhc3NlcyBmb3IgYWN0aW9ucywgZHJhZyduJ2Ryb3AgYW5kIHdpemFyZHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2YTg2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1zZWFyY2gvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDljY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24iPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQkKLTwhLS0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2NvbW1vbi9vdmVydmlldy5odG1sIiAvPiAtLT4KLQotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdFNpbmdsZUZpbGVWaWV3IiAvPiAgLS0+ICA8IS0tID8sIGRvZXMgZWNsaXBzZSBwcm92aWRlIGJldHRlciBzdXBwb3J0PyAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlJlc291cmNlRmlsdGVyIiAvPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlNlbGVjdE11bHRpRmlsZVBhZ2UiIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iU2VsZWN0U2luZ2xlRmlsZVBhZ2UiIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iVGFibGVOYXZpZ2F0b3IiIC8+IC0tPiAgICAgICA8IS0tIE5vLCBzaG91bGQgYmUgaW4gZWNsaXBzZSBiYXNlIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iTmF2aWdhYmxlVGFibGVWaWV3ZXIiIC8+IC0tPiA8IS0tIE5vLCBzaG91bGQgYmUgaW4gZWNsaXBzZSBiYXNlIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmFjdGlvbmhhbmRsZXIuYWN0aW9uIj4gLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJDdXRBY3Rpb24iIC8+ICAtLT4gICAgPCEtLSBObyB0byB0aGVzZSBmb3VyLCAgc2hvdWxkIGJlIHJlbW92ZWQ/IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iUGFzdGVBY3Rpb24iIC8+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iQ29weUFjdGlvbiIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRWRpdEFjdGlvbiIgLz4gLS0+Ci08IS0tCTwvcGFja2FnZT4gIC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIj4gLS0+Ci08IS0tICAJPHR5cGUgbmFtZT0iVUlQbHVnaW4iIC8+ICAtLT4gICAgPCEtLSBObywgZGVsZXRlIHRoaXMgLS0+Ci08IS0tIAk8dHlwZSBuYW1lPSJPdmVybGF5SWNvbk1hbmFnZXIiIC8+ICAtLT4gPCEtLSAgTm8gLS0+Ci08IS0tICAJPHR5cGUgbmFtZT0iV2luZG93VXRpbGl0eSIgLz4gIC0tPiAgIDwhLS0gUmVtb3ZlIGNsYXNzLCBjbGVhbiB1cCB4c2QudWkgLS0+Ci08IS0tICAgIDx0eXBlIG5hbWU9IkltYWdlRmFjdG9yeSIgLz4gIC0tPiAgIDwhLS0gTm8gLS0+Ci08IS0tCTwvcGFja2FnZT4gLS0+Ci08IS0tCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkud2l6YXJkcyI+ICAtLT4KLTwhLS0gIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiIgLz4gIC0tPiAgPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAoRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgLS0+Ci08IS0tIAkJPHR5cGUgbmFtZT0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UiIC8+IC0tPiA8IS0tIHJlZmVyZW5jZWQgZXh0ZXJuYWxseSBvbmx5IHdpdGhpbiBwYWNrYWdlIChFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLCBhbmQgT3BlcmF0aW9uIC0tPgotPCEtLSAgCQk8dHlwZSBuYW1lPSJFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIiAvPiAgLS0+IDwhLS0gcmVmZXJlbmNlZCBieSBYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLCB3aGljaCBpcyBkZXByZWNhdGVkIGFuZCBnb2luZyB0byBiZSByZW1vdmVkIGluIE00ICAtLT4KLTwhLS0JPC9wYWNrYWdlPiAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kbmQiPiAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IlZpZXdlckRyb3BBZGFwdGVyIiAvPiAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJEcmFnQW5kRHJvcENvbW1hbmQiIC8+IC0tPiAgPCEtLSByZWZlcmVuY2VkIGV4dGVybmFsbHkgb25seSB3aXRoaW4gcGFja2FnZSAtLT4KLTwhLS0JCTx0eXBlIG5hbWU9IkRyYWdBbmREcm9wTWFuYWdlciIgLz4gLS0+ICA8IS0tICAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJPYmplY3RUcmFuc2ZlciIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCIgLz4gIC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iVmlld2VyRHJhZ0FkYXB0ZXIiIC8+IC0tPgotPCEtLQk8L3BhY2thZ2U+ICAtLT4KLTwhLS0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5yZXNvdXJjZSI+IC0tPgotPCEtLQkJPHR5cGUgbmFtZT0iUmVzb3VyY2VEZWxldGVMaXN0ZW5lciIgLz4gIC0tPiAgPCEtLSBubyByZWZlcmVuY2VzIC0tPgotPCEtLQk8L3BhY2thZ2U+IC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmRpYWxvZ3MiPiAgLS0+Ci08IS0tCQk8dHlwZSBuYW1lPSJTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIiAvPiAgLS0+ICAgIDwhLS0gTm8sIHNob3VsZCBsb29rIGludG8gYmFzZSBmb3Igc3VwcG9ydD8gLS0+Ci08IS0tCTwvcGFja2FnZT4gIC0tPgotPCEtLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmFjdGlvbmhhbmRsZXIiPgotCQk8dHlwZSBuYW1lPSJBY3Rpb25IYW5kbGVyTGlzdGVuZXIiIC8+Ci0JPC9wYWNrYWdlPgotLS0+Ci08IS0tIHByb3Zpc2lvbmFsIEFQSXMgLS0+Ci08IS0tCi0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciI+Ci0JCTx0eXBlIG5hbWU9IlVSSVJlc29sdmVyUGx1Z2luIiAgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVVJJUmVzb2x2ZXIiIGltcGxlbWVudD0iZmFsc2UiLz4KLQkJPHR5cGUgbmFtZT0iVVJJUmVzb2x2ZXJFeHRlbnNpb24iIGltcGxlbWVudD0idHJ1ZSIvPgotCTwvcGFja2FnZT4KLS0tPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2NvbGxhcHNlQWxsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9jb2xsYXBzZUFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGZmZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2NvbGxhcHNlQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9pY29ucy9leHBhbmRBbGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2V4cGFuZEFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTk0MzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL2ljb25zL2V4cGFuZEFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWI2YWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSEgUGx1Z2luIHByb3BlcnRpZXMKLXBsdWdpbk5hbWUgICAgICAgICAgICAgICA9IEVjbGlwc2UgQmFzZSBVSSBleHRlbnNpb25zCi1wbHVnaW5Qcm92aWRlciAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotCi0hIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3JrYmVuY2ggRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi1fVUlfUE9QVVBfRVhQQU5EX0FMTAkgPSBFeHBhbmQgQWxsCi1fVUlfUE9QVVBfQ09MTEFQU0VfQUxMCSA9IENvbGxhcHNlIEFsbAotCQotX1VJX0lNUE9SVF9CVVRUT04gICAgICAgICAgPSBJbXBvcnQgRmlsZXMuLi4KLV9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQID0gSW1wb3J0IGZpbGVzIGZyb20gZmlsZSBzeXN0ZW0KLQotCi0hIFNlbGVjdE11bHRpRmlsZVBhZ2UKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiB0aGUgZm9sbG93aW5nIHRocmVlIGxpbmVzIHJlZmVycyB0byBfVUlfTEFCRUxfU0VMRUNURURfRklMRVMgbGFiZWwgYWJvdmUKLV9VSV9BRERfQlVUVE9OX1RPT0xfVElQICAgID0gQWRkIGZpbGVzIHRvIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUCA9IFJlbW92ZSBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi1fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVAgPSAgUmVtb3ZlIGFsbCBmaWxlcyBmcm9tIFNlbGVjdGVkIEZpbGVzIGxpc3QuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgb2YgZm9sbG93aW5nIHRocmVlIGxpbmVzCi1fVUlfQUREX0JVVFRPTiAgICAgICAgICAgICA9ID4KLV9VSV9SRU1PVkVfQlVUVE9OICAgICAgICAgID0gPAotX1VJX1JFTU9WRV9BTExfQlVUVE9OICAgICAgPSA8PAotCi0hIFNlbGVjdEphdmFQcm9qZWN0VmlldwotX1VJX0xBQkVMX0NIT09TRV9GT0xERVIgPSBTZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlcjoKLQotISBTZWxlY3RKYXZhUHJvamVjdERpYWxvZwotX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT04gPSBDb250YWluZXIgU2VsZWN0aW9uCi0KLSEgVGV4dFZpZXdlck9wZXJhdGlvbkFjdGlvbgotX1VJX01FTlVfQ09QWSAgICAgICAgID0gJkNvcHkKLV9VSV9NRU5VX0NVVCAgICAgICAgICA9IEN1JnQKLV9VSV9NRU5VX0RFTEVURSAgICAgICA9IERlbGV0ZQotX1VJX01FTlVfUEFTVEUgICAgICAgID0gJlBhc3RlCi1fVUlfTUVOVV9QUkVGSVggICAgICAgPSBQcmVmaXgKLV9VSV9NRU5VX1JFRE8gICAgICAgICA9IFJlZG8KLV9VSV9NRU5VX1NFTEVDVF9BTEwgICA9IFNlbGVjdCBBbGwKLV9VSV9NRU5VX1NISUZUX0xFRlQgICA9IFNoaWZ0IExlZnQKLV9VSV9NRU5VX1NISUZUX1JJR0hUICA9IFNoaWZ0IFJpZ2h0Ci1fVUlfTUVOVV9TVFJJUF9QUkVGSVggPSBTdHJpcCBQcmVmaXgKLV9VSV9NRU5VX1VORE8gICAgICAgICA9IFVuZG8KLQotISBTb3VyY2VWaWV3ZXJHb3RvTGluZUFjdGlvbgotX1VJX01FTlVfR09UT19MSU5FICAgICAgICAgICA9IEdvIFRvIExpbmUuLi4KLV9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFICAgPSBHbyBUbyBMaW5lCi1fVUlfR09UT19MSU5FX0RJQUxPR19URVhUICAgID0gRW50ZXIgTGluZSBOdW1iZXIKLQotX1VJX0ZJTEVfQ0hBTkdFRF9USVRMRSA9IEZpbGUgQ2hhbmdlZAotX1VJX0ZJTEVfREVMRVRFRF9TQVZFX0NIQU5HRVMgPSBUaGUgZmlsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotX1VJX0ZJTEVfREVMRVRFRF9FRElUT1JfQ0xPU0VEID0gVGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4gVGhpcyBlZGl0b3Igd2lsbCBiZSBjbG9zZWQuCi1fVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUyA9IFRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBsb2FkIHRoZSBjaGFuZ2VzPwotX1VJX1NBVkVfQlVUVE9OID0gU2F2ZQotX1VJX0NMT1NFX0JVVFRPTiA9IENsb3NlCi0KLQotISBYU0wgUHJlZmVyZXJlbmNlCi1fVUlfWFNMVF9TRUxFQ1QgICAgID0gU2VsZWN0IHdoaWNoIGVsZW1lbnQgdG8gdXNlIGZvciB5b3VyIHN0eWxlc2hlZXQKLV9VSV9YU0xUX1NUWUxFU0hFRVQgPSAmVXNlIDx4c2w6c3R5bGVzaGVldD4KLV9VSV9YU0xUX1RSQU5TRk9STSAgPSBVJnNlIDx4c2w6dHJhbnNmb3JtPgotCi0hIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLV9VSV9YU0xfREVCVUdfU0VMRUNUX0xBVU5DSEVSID0gU2V0IHRoZSBkZWZhdWx0IFhTTCBsYXVuY2hlciBmb3IgdGhlIFhTTCBEZWJ1Z2dpbmcgYW5kIFRyYW5zZm9ybWF0aW9uIHRvb2wKLV9VSV9YU0xfREVCVUdfTE9DQUwgICAgICAgICAgID0gJlhTTCBhcHBsaWNhdGlvbgotX1VJX1hTTF9ERUJVR19SRU1PVEUgICAgICAgICAgPSBYUyZMIHJlbW90ZSBhcHBsaWNhdGlvbgotX1VJX1hTTF9USUxFX0VESVRPUiAgICAgICAgICAgPSAmU2hvdyBhbGwgZGVidWdnaW5nIGZpbGVzIGluIGEgdGlsZSBlZGl0b3IKLV9VSV9YU0xfREVCVUdfQU5EX1RSQU5TRk9STSAgID0gJlJ1biB0cmFuc2Zvcm1hdGlvbiBhbmQgb3BlbiBhIGRlYnVnZ2luZyBzZXNzaW9uCi1fVUlfWFNMX0NPTlRFWFRfVVJJICAgICAgICAgICA9IENvbnRleHQgUGF0aCAKLV9VSV9YU0xfQ09OVEVYVCAgICAgICAgICAgICAgID0gU3BlY2lmeSBhICZjb250ZXh0IHBhdGggZm9yIHJlc29sdmluZyBVUklzIGluIHhzbDppbXBvcnQsIHhzbDppbmNsdWRlIG9yIGRvY3VtZW50KCkKLQotCi1fVUlfT1ZFUlJJREVfRklMRSAgICA9IE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcwotX1VJX0pBVkFfRVhJU1RfRklMRTEgPSBUaGUgZm9sbG93aW5nIEphdmEgY2xhc3NlcyBhbHJlYWR5IGV4aXN0LgotX1VJX0pBVkFfRVhJU1RfRklMRTIgPSBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci0gICAgICAKLSEgc29tZSBvcHRpb25zIHN0cmluZ3MgY29tbW9uIHRvIHNldmVyYWwgcGx1Z2lucwotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEUgPSBFcnJvciBDcmVhdGluZyBGaWxlCi1fVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9TSE9SVF9ERVNDID0gRXJyb3IgY3JlYXRpbmcgZmlsZSAiezB9IgotX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfTE9OR19ERVNDID0gQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSB0aGUgZmlsZSAiezB9Ii4KLV9VSV9QQVJFTlRfRk9MREVSX0lTX1JFQURfT05MWSA9IFRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHJlYWQgb25seS4KLV9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVCA9IFVua25vd24gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5ICJ7MH0iIGlzIHdyaXRlYWJsZS4KLV9VSV9VTktOT1dOX0VSUk9SID0gVW5rbm93biBlcnJvci4gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgInswfSIgaXMgd3JpdGVhYmxlLgotCi0hIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi1fVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSA9IFNlbGVjdCBmaWxlIGxvY2F0aW9uCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICA9IFdvcmtiZW5jaCBwcm9qZWN0cwotX1VJX1JBRElPX1VSTCAgICAgICAgICAgICAgPSBIVFRQCi0KLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCSAgID0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCSAgID0gUXVhbGlmaWVyOgotCi0hLSBjb21wb25lbnQgc2VsZWN0aW9uIGRpYWxvZ3MgCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLV9VSV9MQUJFTF9XT1JLSU5HX1NFVFMgICAgICAgICAgICAgICAgID0gV29ya2luZyBTZXRzCi0KLV9VSV9MQUJFTF9OZXc9TmV3Li4uCi1fVUlfTEFCRUxfREVDTEFSQVRJT05fTE9DQVRJT049RGVjbGFyYXRpb24gTG9jYXRpb246Ci1fVUlfTEFCRUxfQ0hPT1NFPUNob29zZS4uLgotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgSGVyZSBpcyB0aGUgbGlzdCBvZiBFcnJvciBzdHJpbmcgdGhhdCBoYXZlIG1lc3NhZ2UgSURzIC0gbWFrZSBzdXJlIHRoZXkgYXJlIHVuaXF1ZQotISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRSA9IFRoZSBzcGVjaWZpZWQgY29udGFpbmVyIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgaXRzIHBhdGggbXVzdCBzdGFydCBhdCB0aGUgd29ya3NwYWNlIHJvb3QuCi0KLV9FUlJPUl9MT0NBTF9MT0NBVElPTiAgICAgPSBUaGUgbG9jYWwgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkLgotX0VSUk9SX05PVF9KQVZBX1BST0pFQ1QgICA9IFRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBub3QgYSBKYXZhIHByb2plY3QuCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgZXJyb3IgbWVzc2FnZSB0ZXh0IGlzIGZvbGxvd2VkIGJ5IGEgbWVzc2FnZSBmcm9tIGFub3RoZXIgcGx1Z2luCi1fRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0UgPSBJV0FYMTIwMUUgSW52YWxpZCBwYWNrYWdlIG5hbWUgZXJyb3I6Ci0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aAotX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgICAgICAgICAgICA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLV9FUlJPUl9DT05UQUlORVJfTk9UX0pBVkFfQlVJTERQQVRIID0gVGhlIGNvbnRhaW5lciBpcyBub3QgYSBKYXZhIHNvdXJjZSBmb2xkZXIgZm9yIHRoaXMgcHJvamVjdAotX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUiA9IFRoZSBwcm9qZWN0IGlzIG5vdCBvbiB0aGUgYnVpbGQgcGF0aC4gIFNlbGVjdCBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIHByb2plY3QuCi0KLV9VSV9FUlJPUiAgICAgICAgICAgICA9IEVycm9yCi0KLSFOT1RFIFRPIFRSQU5TTEFUT1I6IHRoaXMgd2FybmluZyBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLV9XQVJOX0lOVkFMSURfSkFWQV9QQUNLQUdFID0gSW52YWxpZCBwYWNrYWdlIG5hbWUgd2FybmluZzoKLQotX0VSUk9SX1JPT1RfRUxFTUVOVCA9IFRoZSBYTUwgc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gYW55IGdsb2JhbCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcm9vdCBlbGVtZW50LgotX0VSUk9SX1NBVklOR19GSUxFID0gRXJyb3Igc2F2aW5nIGZpbGUgInswfSIKLQotISBGaWxlIFZhbGlkYXRvcgotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfVElUTEUgPSBGYWlsZWQgdG8gY2hlY2sgb3V0IG5lY2Vzc2FyeSBmaWxlcwotX1VJX0VSUk9SX1ZBTElEQVRFX0ZBSUxfTUVTU0FHRSA9IEdlbmVyYXRpb24gZmFpbGVkLiBOZWNlc3NhcnkgZmlsZXMgY291bGQgbm90IGJlIGNoZWNrZWQgb3V0LiAKLQotISBQcm9wZXJ0eURpcnR5Q2hhbmdlTGlzdGVuZXIgYW5kIFByb3BlcnR5UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotX1VJX0VSUk9SX1ZBTElEQVRFX0VESVRfRkFJTF9PTkVfRklMRSA9IEVycm9yCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQudGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci5tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3ZlcndyaXRlcXVlcnkudGl0bGU9T3ZlcndyaXRlCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5Lm1lc3NhZ2U9RG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHswfT8KLQotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M9Q3JlYXRpbmcgZXhhbXBsZSBwcm9qZWN0cy4uLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5vcF9kZXNjX3Byb2o9Q29uZmlndXJpbmcgcHJvamVjdC4uLgotCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi1TYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzPVNhdmUgQWxsIE1vZGlmaWVkIFJlc291cmNlcwotU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZT1BbGwgbW9kaWZpZWQgcmVzb3VyY2VzIG11c3QgYmUgc2F2ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwYjYzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiIG5hbWU9IkV4YW1wbGUgUHJvamVjdCBDcmVhdGlvbiBXaXphcmQiIHNjaGVtYT0ic2NoZW1hL2V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZXhzZCIvPgotICA8ZXh0ZW5zaW9uCi0JcG9pbnQ9Im9yZy5lY2xpcHNlLnNlYXJjaC5zZWFyY2hSZXN1bHRWaWV3UGFnZXMiPgotCTx2aWV3UGFnZQotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoUmVzdWx0UGFnZSIKLQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdCIKLQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaFJlc3VsdFBhZ2UiPgotCTwvdmlld1BhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotIAotICA8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9InRlc3QiIAotICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9InRlc3RpdCIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgIGxhYmVsPSJURVNUIFNFQVJDSCBESUFMT0ciIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuVGVzdCI+IAotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgICAgICAgCi0gICAgPC9leHRlbnNpb24+IAotICAgLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zY2hlbWEvZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGMzMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NjaGVtYS9leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIiBpZD0iRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIgbmFtZT0iRXhhbXBsZSBQcm9qZWN0IENyZWF0aW9uIFdpemFyZCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gZXh0ZW5kIE5ldyBwcm9qZWN0IHdpdGhhcmQgd2l0aCB0aGUNCi1wYWdlIHNldCB1cCBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNyZWF0ZWQgcHJvamVjdCBhcyB3ZWxsIGFzIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgb24gdGhlIHByb2plY3QgY3JlYXRpb24uDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZCI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3RzZXR1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBleHRlbnNpb24gaXMgaW50ZW5kZWQgZm9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYW5uZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggdG8gdGhlIGltYWdlIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYSBiYW5uZXIgb24gdGhlIHdpemFyZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3RzZXR1cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhZGRpdGlvbmFsIHByb2plY3Qgc2V0dXAuDQotVGhlcmUgd2lsbCBiZSBhcyBtYW55IHBhZ2VzIGNyZWF0ZWQgZm9yIHRoZSB3aXphcmQgYXMgdGhlcmUgYXJlIHByb2plY3RzZXR1cCBlbGVtZW50cy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbXBvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVmZXJlbmNlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWdldGl0bGUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGl0bGUgb2YgdGhlIHdpemFyZCZhcG9zO3MgcGFnZS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBJbml0aWFsIHByb2plY3QgbmFtZSB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgb24gdGhlIHdpemFyZCBwYWdlLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBMYWJlbCBmb3IgdGhlIHByb2plY3QgbmFtZSBmaWVsZCBvbiB0aGUgd2l6YXJkIHBhZ2UuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBhZ2VkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgd2l6YXJkIHBhZ2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3BlbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBQbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gd2l6YXJkIGZpbmlzaGVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW1wb3J0Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gaW1wb3J0IGludG8gdGhlIHByb2plY3Qgd2hlbiBpdCZhcG9zO3MgY3JlYXRlZC4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUHJvamVjdCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hlcmUgcHJvamVjdCBmaWxlcyB3aWxsIGJlIGltcG9ydGVkIHRvLCBpZiBub3Qgc3BlY2lmaWVkLCBpdCZhcG9zO3MgdGhlIHByb2plc3QgaXRzZWxmLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgUGx1Z2luIHJlbGF0aXZlIHBhdGggb2YgdGhlIGltcG9ydCAuemlwIGZpbGUgd2l0aCB0aGUgZmlsZXMgdG8gYmUgaW1wb3J0ZWQgaW50byB0aGUgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im5hdHVyZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRWxlbWVudCB0aGF0IHNwZWNpZmllZCBFY2xpcHNlIG5hdHVyZSB0aGF0IGlzIGFwcGxpY2FibGUgdG8gdGhlIHByb2plY3QuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIG5hdHVyZSB0aGF0IHdpbGwgYmUgb3BlbmVkIHdoZW4gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VzIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBFbGVtZW50IHRoYXQgc3BlY2lmaWVzIHJlZmVyZW5jZSBmb3IgdGhlIHByb2plY3QgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCZxdW90Ow0KLSAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZEV4dGVuc2lvbiZxdW90OyZndDsgDQotICAgICAgJmx0O3dpemFyZA0KLSAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC51aS5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkJnF1b3Q7DQotICAgICAgICAgICBiYW5uZXI9JnF1b3Q7aWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmJnF1b3Q7Jmd0Ow0KLSAgICAgICAgICZsdDtwcm9qZWN0c2V0dXANCi0gICAgICAgICAgICAgICBwYWdldGl0bGU9JnF1b3Q7JVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZXRpdGxlJnF1b3Q7DQotICAgICAgICAgICAgICAgbmFtZT0mcXVvdDslWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSZxdW90Ow0KLSAgICAgICAgICAgICAgIGxhYmVsPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsJnF1b3Q7DQotICAgICAgICAgICAgICAgcGFnZWRlc2NyaXB0aW9uPSZxdW90OyVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbiZxdW90Ow0KLSAgICAgICAgICAgICAgIG9wZW49JnF1b3Q7cmVhZG1lLmh0bWwmcXVvdDsmZ3Q7DQotICAgICAgICAgICAgJmx0O2ltcG9ydA0KLSAgICAgICAgICAgICAgICAgIGRlc3Q9JnF1b3Q7JnF1b3Q7DQotICAgICAgICAgICAgICAgICAgc3JjPSZxdW90O2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCZxdW90OyZndDsNCi0gICAgICAgICAgICAmbHQ7L2ltcG9ydCZndDsNCi0gICAgICAgICZsdDsvcHJvamVjdHNldHVwJmd0Ow0KLSAgICAgJmx0Oy93aXphcmQmZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9BYnN0cmFjdFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmZjMmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvQWJzdHJhY3RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5TZWFyY2hNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVF1ZXJ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBmUGF0dGVybjsKLQlwcm90ZWN0ZWQgU2VhcmNoU2NvcGUgZlNjb3BlOwotCXByb3RlY3RlZCBTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTY29wZURlc2NyaXB0aW9uOwotCi0JcHVibGljIEFic3RyYWN0U2VhcmNoUXVlcnkoU3RyaW5nIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbikgewotCQlzdXBlcigpOwotCQlmUGF0dGVybj0gcGF0dGVybjsKLQkJZlNjb3BlPSBzY29wZTsKLQkJZlNjb3BlRGVzY3JpcHRpb249IHNjb3BlRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9sYWJlbDsgCi0JfQotCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlpZiAoZlJlc3VsdCA9PSBudWxsKSB7Ci0JCQlmUmVzdWx0PSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMpOwotCQkJbmV3IFNlYXJjaFJlc3VsdFVwZGF0ZXIoZlJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIGZSZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0TGFiZWwoaW50IG5NYXRjaGVzKSB7Ci0JCWlmIChuTWF0Y2hlcyA9PSAxKSB7Ci0JCQlpZiAoZlBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJT2JqZWN0W10gYXJncz0geyBmUGF0dGVybiwgZlNjb3BlRGVzY3JpcHRpb24gfTsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZm9ybWF0KFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9zaW5ndWxhckxhYmVsLCBhcmdzKTsgCi0JCQl9Ci0JCQlPYmplY3RbXSBhcmdzPSB7ICIiLCBmU2NvcGVEZXNjcmlwdGlvbiB9OwotCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfc2luZ3VsYXJMYWJlbF9maWxlTmFtZVNlYXJjaCwgYXJncyk7IAotCQl9Ci0JCWlmIChmUGF0dGVybi5sZW5ndGgoKSA+IDApIHsKLQkJCU9iamVjdFtdIGFyZ3M9IHsgZlBhdHRlcm4sIG5ldyBJbnRlZ2VyKG5NYXRjaGVzKSwgZlNjb3BlRGVzY3JpcHRpb24gfTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE1lc3NhZ2VzLmZvcm1hdChTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUXVlcnlfcGx1cmFsUGF0dGVybiwgYXJncyk7IAotCQl9Ci0JCU9iamVjdFtdIGFyZ3M9IHsgIiIsIG5ldyBJbnRlZ2VyKG5NYXRjaGVzKSwgZlNjb3BlRGVzY3JpcHRpb24gfTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZXMuZm9ybWF0KFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hRdWVyeV9wbHVyYWxQYXR0ZXJuX2ZpbGVOYW1lU2VhcmNoLCBhcmdzKTsgCi0JCi0JCi0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFNlYXJjaFJlc3VsdCB0ZXh0UmVzdWx0PSAoU2VhcmNoUmVzdWx0KSBnZXRTZWFyY2hSZXN1bHQoKTsKLQkJdGV4dFJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yPSBuZXcgU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IodGV4dFJlc3VsdCk7Ci0JCVN0cmluZyBzZWFyY2hTdHJpbmc9IGZQYXR0ZXJuOwotCQlpZiAoc2VhcmNoU3RyaW5nLnRyaW0oKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoJyonKSkpIHsKLQkJCXNlYXJjaFN0cmluZz0gbmV3IFN0cmluZygpOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlPSBTZWFyY2hNZXNzYWdlcy5UZXh0U2VhcmNoRW5naW5lX3N0YXR1c01lc3NhZ2U7IAotCQlNdWx0aVN0YXR1cyBzdGF0dXM9IG5ldyBNdWx0aVN0YXR1cyhOZXdTZWFyY2hVSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpOwotCQkKLQkJU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLQkKLQkJUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSA9IFF1YWxpZmllZE5hbWUudmFsdWVPZihzZWFyY2hTdHJpbmcpOwotCQkKLQkJdHJ5IHsKLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IGNyZWF0ZVNlYXJjaFBhdHRlcm4odHlwZU5hbWUpOwotICAgICAgICAgICAgc2VhcmNoRW5naW5lLnNlYXJjaChwYXR0ZXJuLCBjb2xsZWN0b3IsIGZTY29wZSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCQotCQlyZXR1cm4gc3RhdHVzOwotCi0JfQotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVNlYXJjaFBhdHRlcm4oUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSk7Ci0JCi0JcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFVwZGF0ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVF1ZXJ5TGlzdGVuZXIgewotCQlTZWFyY2hSZXN1bHQgZlJlc3VsdDsKLQotCQlwdWJsaWMgU2VhcmNoUmVzdWx0VXBkYXRlcihTZWFyY2hSZXN1bHQgcmVzdWx0KSB7Ci0JCQlmUmVzdWx0PSByZXN1bHQ7Ci0JCQlOZXdTZWFyY2hVSS5hZGRRdWVyeUxpc3RlbmVyKHRoaXMpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpCi0JCQkJaGFuZGxlRGVsdGEoZGVsdGEpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGVsdGEoSVJlc291cmNlRGVsdGEgZCkgewotCQkJdHJ5IHsKLQkJCQlkLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXM9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJCQkJTWF0Y2hbXSBtYXRjaGVzPSBmUmVzdWx0LmdldE1hdGNoZXMocmVzKTsKLQkJCQkJCQkJCWZSZXN1bHQucmVtb3ZlTWF0Y2hlcyhtYXRjaGVzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQkJCQkvLyBoYW5kbGUgY2hhbmdlZCByZXNvdXJjZQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVlcnlBZGRlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHF1ZXJ5UmVtb3ZlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCWlmIChmUmVzdWx0LmVxdWFscyhxdWVyeS5nZXRTZWFyY2hSZXN1bHQoKSkpIHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQlOZXdTZWFyY2hVSS5yZW1vdmVRdWVyeUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBxdWVyeVN0YXJ0aW5nKElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQkJLy8gZG9uJ3QgY2FyZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcXVlcnlGaW5pc2hlZChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJCS8vIGRvbid0IGNhcmUKLQkJfQotICAgIH0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9JU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9JU2VhcmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzE0MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvSVNlYXJjaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hDb25zdGFudHMgewotCQotCS8qKgotCSAqIFRoZSBzZWFyY2ggcmVzdWx0IGlzIGEgZGVjbGFyYXRpb24uCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IERFQ0xBUkFUSU9OUz0gMDsKLQotCi0JLyoqCi0JICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSByZWZlcmVuY2UuCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqIFJlZmVyZW5jZXMgY2FuIGNvbnRhaW4gaW1wbGVtZW50ZXJzIHNpbmNlIHRoZXkgYXJlIG1vcmUgZ2VuZXJpYyBraW5kCi0JICogb2YgbWF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBSRUZFUkVOQ0VTPSAxOwotCi0JLyoqCi0JICogVGhlIHNlYXJjaCByZXN1bHQgaXMgYSBkZWNsYXJhdGlvbiwgb3IgYSByZWZlcmVuY2UuCi0JICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbnkgb2YgdGhlIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50cwotCSAqIHNvIGFzIHRvIGJldHRlciBuYXJyb3cgZG93biB0aGUgc2VhcmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEFMTF9PQ0NVUlJFTkNFUz0gMjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDc5YzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uc2VhcmNoLnRlc3QudWkuU2VhcmNoTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU2VhcmNoTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaExhYmVsUHJvdmlkZXJfZXhhY3Rfc2luZ3VsYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoTGFiZWxQcm92aWRlcl9leGFjdF9ub0NvdW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaExhYmVsUHJvdmlkZXJfZXhhY3RfYW5kX3BvdGVudGlhbF9wbHVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoTGFiZWxQcm92aWRlcl9wb3RlbnRpYWxfc2luZ3VsYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoTGFiZWxQcm92aWRlcl9wb3RlbnRpYWxfbm9Db3VudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hMYWJlbFByb3ZpZGVyX3BvdGVudGlhbF9wbHVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoTGFiZWxQcm92aWRlcl9leGFjdF9wbHVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBfc2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdyb3VwX2RlY2xhcmF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdyb3VwX3JlYWRSZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdyb3VwX3dyaXRlUmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9pbXBsZW1lbnRvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBfb2NjdXJyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBfb2NjdXJyZW5jZXNfcXVpY2tNZW51X25vRW50cmllc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRXJyb3Jfc2VhcmNoX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9FcnJvcl9zZWFyY2hfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRXJyb3Jfc2VhcmNoX25vdHN1Y2Nlc3NmdWxfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRXJyb3JfamF2YUVsZW1lbnRBY2Nlc3NfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0Vycm9yX2phdmFFbGVtZW50QWNjZXNzX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0Vycm9yX3NlYXJjaF9ub3RzdWNjZXNzZnVsX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9FcnJvcl9vcGVuRWRpdG9yX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9FcnJvcl9vcGVuRWRpdG9yX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0Vycm9yX2NvZGVSZXNvbHZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEVsZW1lbnRTZWxlY3Rpb25EaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRWxlbWVudFNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2Vfc2VhcmNoRm9yX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2Vfc2VhcmNoRm9yX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9zZWFyY2hGb3JfbWV0aG9kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2Vfc2VhcmNoRm9yX2ZpZWxkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2Vfc2VhcmNoRm9yX3BhY2thZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9zZWFyY2hGb3JfY29uc3RydWN0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9saW1pdFRvX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2VfbGltaXRUb19kZWNsYXJhdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9saW1pdFRvX2ltcGxlbWVudG9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYWdlX2xpbWl0VG9fcmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYWdlX2xpbWl0VG9fYWxsT2NjdXJyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9saW1pdFRvX3JlYWRSZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2VfbGltaXRUb193cml0ZVJlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFnZV9leHByZXNzaW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhZ2VfZXhwcmVzc2lvbl9jYXNlU2Vuc2l0aXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFV0aWxfd29ya2luZ1NldENvbmNhdGVuYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kSGllcmFyY2h5RGVjbGFyYXRpb25zQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kSGllcmFyY2h5RGVjbGFyYXRpb25zQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRJbXBsZW1lbnRvcnNBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRJbXBsZW1lbnRvcnNBY3Rpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZEltcGxlbWVudG9yc0luUHJvamVjdEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZEltcGxlbWVudG9yc0luUHJvamVjdEFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kSW1wbGVtZW50b3JzSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kSW1wbGVtZW50b3JzSW5Xb3JraW5nU2V0QWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWZlcmVuY2VzQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVmZXJlbmNlc0FjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVmZXJlbmNlc0FjdGlvbl9CaW5QcmltQ29uc3RXYXJuRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVmZXJlbmNlc0FjdGlvbl9CaW5QcmltQ29uc3RXYXJuRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZEhpZXJhcmNoeVJlZmVyZW5jZXNBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRIaWVyYXJjaHlSZWZlcmVuY2VzQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWFkUmVmZXJlbmNlc0FjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWFkUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWFkUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRSZWFkUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kUmVhZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzQWN0aW9uX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRXcml0ZVJlZmVyZW5jZXNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRXcml0ZVJlZmVyZW5jZXNJblByb2plY3RBY3Rpb25fdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFdyaXRlUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZFdyaXRlUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmRXcml0ZVJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kT2NjdXJyZW5jZXNJbkZpbGVfc2hvcnRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZE9jY3VycmVuY2VzSW5GaWxlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kT2NjdXJyZW5jZXNJbkZpbGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNFbmdpbmVfbm9Tb3VyY2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNFbmdpbmVfY2Fubm90UGFyc2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc0ZpbmRlcl9ub19lbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzRmluZGVyX25vX2JpbmRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNGaW5kZXJfc2VhcmNoZm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3Npbmd1bGFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3BsdXJhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGNlcHRpb25PY2N1cnJlbmNlc0ZpbmRlcl9ub19leGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhjZXB0aW9uT2NjdXJyZW5jZXNGaW5kZXJfc2VhcmNoZm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4Y2VwdGlvbk9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3Npbmd1bGFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4Y2VwdGlvbk9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3BsdXJhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBsZW1lbnRPY2N1cnJlbmNlc0ZpbmRlcl9pbnZhbGlkVGFyZ2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcGxlbWVudE9jY3VycmVuY2VzRmluZGVyX3NlYXJjaGZvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBsZW1lbnRPY2N1cnJlbmNlc0ZpbmRlcl9sYWJlbF9zaW5ndWxhcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBsZW1lbnRPY2N1cnJlbmNlc0ZpbmRlcl9sYWJlbF9wbHVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya3NwYWNlU2NvcGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2luZ1NldFNjb3BlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdGlvblNjb3BlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY2xvc2luZ1Byb2plY3RzU2NvcGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jbG9zaW5nUHJvamVjdFNjb3BlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RTY29wZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIaWVyYXJjaHlTY29wZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hQYXJ0aWNpcGFudF9lcnJvcl9ub0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhcnRpY2lwYW50X2Vycm9yX25vTmF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaFBhcnRpY2lwYW50X2Vycm9yX25vQ2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoUGFydGljaXBhbnRfZXJyb3JfY2xhc3NDYXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRTZWFyY2hMYWJlbFByb3ZpZGVyX21hdGNoQ291bnRGb3JtYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJzRGlhbG9nX2ZpbHRlcnNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyc0RpYWxvZ19kZXNjcmlwdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJzRGlhbG9nX2xpbWl0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlcnNEaWFsb2dfbGltaXRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyc0RpYWxvZ0FjdGlvbl9sYWJlbDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNlYXJjaE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2ZlYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVNlYXJjaExhYmVsUHJvdmlkZXJfZXhhY3Rfc2luZ3VsYXI9ezB9ICgxIG1hdGNoKQotU2VhcmNoTGFiZWxQcm92aWRlcl9leGFjdF9ub0NvdW50PXswfQotU2VhcmNoTGFiZWxQcm92aWRlcl9leGFjdF9hbmRfcG90ZW50aWFsX3BsdXJhbD17MH0gKHsxfSBtYXRjaGVzOiB7Mn0gZXhhY3QsIHszfSBwb3RlbnRpYWwpCi1TZWFyY2hMYWJlbFByb3ZpZGVyX3BvdGVudGlhbF9zaW5ndWxhcj17MH0gKHBvdGVudGlhbCBtYXRjaCkKLVNlYXJjaExhYmVsUHJvdmlkZXJfcG90ZW50aWFsX25vQ291bnQ9ezB9IChwb3RlbnRpYWwgbWF0Y2gpCi1TZWFyY2hMYWJlbFByb3ZpZGVyX3BvdGVudGlhbF9wbHVyYWw9ezB9ICh7MX0gcG90ZW50aWFsIG1hdGNoZXMpCi1TZWFyY2hMYWJlbFByb3ZpZGVyX2V4YWN0X3BsdXJhbD17MH0gKHsxfSBtYXRjaGVzKQotCi1ncm91cF9zZWFyY2g9UyZlYXJjaAotZ3JvdXBfZGVjbGFyYXRpb25zPSBEZWMmbGFyYXRpb25zCi1ncm91cF9yZWZlcmVuY2VzPSBSZSZmZXJlbmNlcwotZ3JvdXBfcmVhZFJlZmVyZW5jZXM9ICZSZWFkIEFjY2VzcwotZ3JvdXBfd3JpdGVSZWZlcmVuY2VzPSAmV3JpdGUgQWNjZXNzCi1ncm91cF9pbXBsZW1lbnRvcnM9ICZJbXBsZW1lbnRvcnMKLWdyb3VwX29jY3VycmVuY2VzPSBPY2N1cnJlJm5jZXMgaW4gRmlsZQotZ3JvdXBfb2NjdXJyZW5jZXNfcXVpY2tNZW51X25vRW50cmllc0F2YWlsYWJsZT0gPG5vIGVudHJpZXMgYXZhaWxhYmxlPgotCi1TZWFyY2hfRXJyb3Jfc2VhcmNoX3RpdGxlPVNlYXJjaCBFcnJvcgotU2VhcmNoX0Vycm9yX3NlYXJjaF9tZXNzYWdlPVRoZSBzZWFyY2ggb3BlcmF0aW9uIGhhcyByZXBvcnRlZCBwcm9ibGVtcwotU2VhcmNoX0Vycm9yX3NlYXJjaF9ub3RzdWNjZXNzZnVsX21lc3NhZ2U9VGhlIHNlYXJjaCBvcGVyYXRpb24gaGFzIHJlcG9ydGVkIHByb2JsZW1zCi1TZWFyY2hfRXJyb3JfamF2YUVsZW1lbnRBY2Nlc3NfdGl0bGU9U2VhcmNoIEVycm9yCi1TZWFyY2hfRXJyb3JfamF2YUVsZW1lbnRBY2Nlc3NfbWVzc2FnZT1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhY2Nlc3NpbmcgYSBKYXZhIGVsZW1lbnQKLQotU2VhcmNoX0Vycm9yX3NlYXJjaF9ub3RzdWNjZXNzZnVsX3RpdGxlPVNlYXJjaAotCi1TZWFyY2hfRXJyb3Jfb3BlbkVkaXRvcl90aXRsZT1TZWFyY2ggRXJyb3IKLVNlYXJjaF9FcnJvcl9vcGVuRWRpdG9yX21lc3NhZ2U9Q291bGQgbm90IG9wZW4gdGhlIGVkaXRvcgotCi1TZWFyY2hfRXJyb3JfY29kZVJlc29sdmU9IENvZGUgcmVzb2x2ZSBlcnJvcgotCi1TZWFyY2hFbGVtZW50U2VsZWN0aW9uRGlhbG9nX3RpdGxlPVNlYXJjaAotU2VhcmNoRWxlbWVudFNlbGVjdGlvbkRpYWxvZ19tZXNzYWdlPVNlbGVjdCB0aGUgZWxlbWVudCB0byBzZWFyY2ggZm9yLgotCi1TZWFyY2hQYWdlX3NlYXJjaEZvcl9sYWJlbD0gU2VhcmNoIEZvcgotU2VhcmNoUGFnZV9zZWFyY2hGb3JfdHlwZT0gJlR5cGUKLVNlYXJjaFBhZ2Vfc2VhcmNoRm9yX21ldGhvZD0gJk1ldGhvZAotU2VhcmNoUGFnZV9zZWFyY2hGb3JfZmllbGQ9ICZGaWVsZAotU2VhcmNoUGFnZV9zZWFyY2hGb3JfcGFja2FnZT0gJlBhY2thZ2UKLVNlYXJjaFBhZ2Vfc2VhcmNoRm9yX2NvbnN0cnVjdG9yPSBDbyZuc3RydWN0b3IKLQotU2VhcmNoUGFnZV9saW1pdFRvX2xhYmVsPSBMaW1pdCBUbwotU2VhcmNoUGFnZV9saW1pdFRvX2RlY2xhcmF0aW9ucz0gRGVjJmxhcmF0aW9ucwotU2VhcmNoUGFnZV9saW1pdFRvX2ltcGxlbWVudG9ycz0gJkltcGxlbWVudG9ycwotU2VhcmNoUGFnZV9saW1pdFRvX3JlZmVyZW5jZXM9ICZSZWZlcmVuY2VzCi1TZWFyY2hQYWdlX2xpbWl0VG9fYWxsT2NjdXJyZW5jZXM9IEFsbCAmT2NjdXJyZW5jZXMKLVNlYXJjaFBhZ2VfbGltaXRUb19yZWFkUmVmZXJlbmNlcz0gUmVhZCBBJmNjZXNzCi1TZWFyY2hQYWdlX2xpbWl0VG9fd3JpdGVSZWZlcmVuY2VzPSBXcml0JmUgQWNjZXNzCi0KLVNlYXJjaFBhZ2VfZXhwcmVzc2lvbl9sYWJlbD0gU2UmYXJjaCBzdHJpbmcgKCogPSBhbnkgc3RyaW5nLCA/ID0gYW55IGNoYXJhY3Rlcik6Ci1TZWFyY2hQYWdlX2V4cHJlc3Npb25fY2FzZVNlbnNpdGl2ZT0gQ2FzZSBzZW5zJml0aXZlCi0KLVNlYXJjaFBhZ2Vfc2VhcmNoSlJFX2xhYmVsPVNlYXJjaCB0aGUgSlJFIHMmeXN0ZW0gbGlicmFyaWVzCi0KLSMgQ29uY2F0ZW5hdGUgdHdvIHdvcmtpbmcgc2V0IG5hbWVzIGUuZy4gIlNvdXJjZSwgTGliIgotU2VhcmNoVXRpbF93b3JraW5nU2V0Q29uY2F0ZW5hdGlvbj0gezB9LCB7MX0KLQotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl9sYWJlbD0gJldvcmtzcGFjZQotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbkFjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIERlY2xhcmF0aW9ucyBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiB0aGUgV29ya3NwYWNlCi0KLVNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Qcm9qZWN0QWN0aW9uX2xhYmVsPSAmUHJvamVjdAotU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBEZWNsYXJhdGlvbnMgb2YgdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gUmVzb3VyY2VzIGluIHRoZSBFbmNsb3NpbmcgUHJvamVjdCBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudAotCi1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl9sYWJlbD0gV29ya2luZyAmU2V0Li4uCi1TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIERlY2xhcmF0aW9ucyBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiBhIFdvcmtpbmcgU2V0Ci0KLVNlYXJjaF9GaW5kSGllcmFyY2h5RGVjbGFyYXRpb25zQWN0aW9uX2xhYmVsPSAmSGllcmFyY2h5Ci1TZWFyY2hfRmluZEhpZXJhcmNoeURlY2xhcmF0aW9uc0FjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIERlY2xhcmF0aW9ucyBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiBpdHMgSGllcmFyY2h5Ci0KLVNlYXJjaF9GaW5kSW1wbGVtZW50b3JzQWN0aW9uX2xhYmVsPSAmV29ya3NwYWNlCi1TZWFyY2hfRmluZEltcGxlbWVudG9yc0FjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIEltcGxlbWVudG9ycyBvZiB0aGUgU2VsZWN0ZWQgSW50ZXJmYWNlCi0KLVNlYXJjaF9GaW5kSW1wbGVtZW50b3JzSW5Qcm9qZWN0QWN0aW9uX2xhYmVsPSAmUHJvamVjdAotU2VhcmNoX0ZpbmRJbXBsZW1lbnRvcnNJblByb2plY3RBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBJbXBsZW1lbnRvcnMgb2YgdGhlIFNlbGVjdGVkIEludGVyZmFjZSBpbiBSZXNvdXJjZXMgaW4gdGhlIEVuY2xvc2luZyBQcm9qZWN0IG9mIHRoZSBTZWxlY3RlZCBFbGVtZW50Ci0KLVNlYXJjaF9GaW5kSW1wbGVtZW50b3JzSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsPSBXb3JraW5nICZTZXQuLi4KLVNlYXJjaF9GaW5kSW1wbGVtZW50b3JzSW5Xb3JraW5nU2V0QWN0aW9uX3Rvb2x0aXA9IFNlYXJjaCBmb3IgSW1wbGVtZW50b3JzIG9mIHRoZSBTZWxlY3RlZCBJbnRlcmZhY2UgaW4gYSBXb3JraW5nIFNldAotCi1TZWFyY2hfRmluZFJlZmVyZW5jZXNBY3Rpb25fbGFiZWw9ICZXb3Jrc3BhY2UKLVNlYXJjaF9GaW5kUmVmZXJlbmNlc0FjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIFJlZmVyZW5jZXMgdG8gdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gdGhlIFdvcmtzcGFjZQotCi1TZWFyY2hfRmluZFJlZmVyZW5jZXNBY3Rpb25fQmluUHJpbUNvbnN0V2FybkRpYWxvZ190aXRsZT0gU2VhcmNoIGZvciBSZWZlcmVuY2VzIHRvIGEgQmluYXJ5IENvbnN0YW50Ci1TZWFyY2hfRmluZFJlZmVyZW5jZXNBY3Rpb25fQmluUHJpbUNvbnN0V2FybkRpYWxvZ19tZXNzYWdlPSBNYXRjaGVzIHRvIHRoaXMgY29uc3RhbnQgd2lsbCBvbmx5IGJlIGRpc2NvdmVyZWQgaW4gc291cmNlIGZpbGVzIGFuZCBiaW5hcnkgZmlsZXMgd2hlcmUgdGhlIGNvbnN0YW50IHZhbHVlIGlzIG5vdCBpbmxpbmVkLgotCi1TZWFyY2hfRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb25fbGFiZWw9ICZQcm9qZWN0Ci1TZWFyY2hfRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBSZWZlcmVuY2VzIHRvIHRoZSBTZWxlY3RlZCBFbGVtZW50IGluIFJlc291cmNlcyBpbiB0aGUgRW5jbG9zaW5nIFByb2plY3Qgb2YgdGhlIFNlbGVjdGVkIEVsZW1lbnQKLQotU2VhcmNoX0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsPSBXb3JraW5nICZTZXQuLi4KLVNlYXJjaF9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIFJlZmVyZW5jZXMgdG8gdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gYSBXb3JraW5nIFNldAotCi1TZWFyY2hfRmluZEhpZXJhcmNoeVJlZmVyZW5jZXNBY3Rpb25fbGFiZWw9ICZIaWVyYXJjaHkKLVNlYXJjaF9GaW5kSGllcmFyY2h5UmVmZXJlbmNlc0FjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIFJlZmVyZW5jZXMgb2YgdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gaXRzIEhpZXJhcmNoeQotCi1TZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzQWN0aW9uX2xhYmVsPSAmV29ya3NwYWNlCi1TZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzQWN0aW9uX3Rvb2x0aXA9IFNlYXJjaCBmb3IgUmVhZCBSZWZlcmVuY2VzIHRvIHRoZSBTZWxlY3RlZCBFbGVtZW50IGluIHRoZSBXb3Jrc3BhY2UKLQotU2VhcmNoX0ZpbmRSZWFkUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbl9sYWJlbD0gJlByb2plY3QKLVNlYXJjaF9GaW5kUmVhZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBSZWFkIFJlZmVyZW5jZXMgdG8gdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gUmVzb3VyY2VzIGluIHRoZSBFbmNsb3NpbmcgUHJvamVjdCBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudAotCi1TZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsPSBXb3JraW5nICZTZXQuLi4KLVNlYXJjaF9GaW5kUmVhZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBSZWFkIFJlZmVyZW5jZXMgdG8gdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gYSBXb3JraW5nIFNldAotCi1TZWFyY2hfRmluZFJlYWRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb25fbGFiZWw9ICZIaWVyYXJjaHkKLVNlYXJjaF9GaW5kUmVhZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIFJlYWQgUmVmZXJlbmNlcyBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiBpdHMgSGllcmFyY2h5Ci0KLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzQWN0aW9uX2xhYmVsPSAmV29ya3NwYWNlCi1TZWFyY2hfRmluZFdyaXRlUmVmZXJlbmNlc0FjdGlvbl90b29sdGlwPSBTZWFyY2ggZm9yIFdyaXRlIFJlZmVyZW5jZXMgdG8gdGhlIFNlbGVjdGVkIEVsZW1lbnQgaW4gdGhlIFdvcmtzcGFjZQotCi1TZWFyY2hfRmluZFdyaXRlUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbl9sYWJlbD0gJlByb2plY3QKLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uX3Rvb2x0aXA9IFNlYXJjaCBmb3IgV3JpdGUgUmVmZXJlbmNlcyB0byB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiBSZXNvdXJjZXMgaW4gdGhlIEVuY2xvc2luZyBQcm9qZWN0IG9mIHRoZSBTZWxlY3RlZCBFbGVtZW50Ci0KLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsPSBXb3JraW5nICZTZXQuLi4KLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uX3Rvb2x0aXA9IFNlYXJjaCBmb3IgV3JpdGUgUmVmZXJlbmNlcyB0byB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiBhIFdvcmtpbmcgU2V0Ci0KLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb25fbGFiZWw9ICZIaWVyYXJjaHkKLVNlYXJjaF9GaW5kV3JpdGVSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb25fdG9vbHRpcD0gU2VhcmNoIGZvciBXcml0ZSBSZWZlcmVuY2VzIG9mIHRoZSBTZWxlY3RlZCBFbGVtZW50IGluIGl0cyBIaWVyYXJjaHkKLQotU2VhcmNoX0ZpbmRPY2N1cnJlbmNlc0luRmlsZV9zaG9ydExhYmVsPSAmSWRlbnRpZmllcgotU2VhcmNoX0ZpbmRPY2N1cnJlbmNlc0luRmlsZV9sYWJlbD0gSSZkZW50aWZpZXJzIGluIEZpbGUKLVNlYXJjaF9GaW5kT2NjdXJyZW5jZXNJbkZpbGVfdG9vbHRpcD0gRmluZCBPY2N1cnJlbmNlcyBvZiB0aGUgU2VsZWN0ZWQgRWxlbWVudCBpbiB0aGUgRWRpdG9yCi0KLUZpbmRPY2N1cnJlbmNlc0VuZ2luZV9ub1NvdXJjZV90ZXh0PSBObyBzb3VyY2UgYXZhaWxhYmxlLiBUbyBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIHlvdSBuZWVkIHRvIGF0dGFjaCBzb3VyY2UuCi1GaW5kT2NjdXJyZW5jZXNFbmdpbmVfY2Fubm90UGFyc2VfdGV4dD0gQ2Fubm90IGFuYWx5emUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgb3IgY2xhc3MgZmlsZS4KLQotT2NjdXJyZW5jZXNGaW5kZXJfbm9fZWxlbWVudD0gQ2Fubm90IHNlYXJjaCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgSmF2YSBlbGVtZW50IG5hbWUuCi1PY2N1cnJlbmNlc0ZpbmRlcl9ub19iaW5kaW5nPSBTZWxlY3RlZCBKYXZhIGVsZW1lbnQgaXMgdW5rbm93bi4KLU9jY3VycmVuY2VzRmluZGVyX3NlYXJjaGZvcj1TZWFyY2ggZm9yIE9jY3VycmVuY2VzIGluIEZpbGUKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdGhlIHNlY29uZCBvbmUgYnkgdGhlIGZpbGUgbmFtZQotT2NjdXJyZW5jZXNGaW5kZXJfbGFiZWxfc2luZ3VsYXI9Jyd7MH0nJyAtIDEgb2NjdXJyZW5jZSBpbiAnJ3sxfScnCi0jIFRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBlbGVtZW50IG5hbWUsIHRoZSBzZWNvbmQgYnkgdGhlIGNvdW50IGFuZCB0aGUgbGFzdCBieSB0aGUgZmlsZSBuYW1lCi1PY2N1cnJlbmNlc0ZpbmRlcl9sYWJlbF9wbHVyYWw9Jyd7MH0nJyAtIHsxfSBvY2N1cnJlbmNlcyBpbiAnJ3syfScnCi0KLUV4Y2VwdGlvbk9jY3VycmVuY2VzRmluZGVyX25vX2V4Y2VwdGlvbj0gQ2Fubm90IHNlYXJjaCBmb3IgY3VycmVudCBzZWxlY3Rpb24uIFBsZWFzZSBzZWxlY3QgYW4gZXhjZXB0aW9uLgotRXhjZXB0aW9uT2NjdXJyZW5jZXNGaW5kZXJfc2VhcmNoZm9yPSBTZWFyY2ggZm9yIEV4Y2VwdGlvbiBPY2N1cnJlbmNlcwotCi0jIFRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBlbGVtZW50IG5hbWUgYW5kIHRoZSBzZWNvbmQgb25lIGJ5IHRoZSBmaWxlIG5hbWUKLUV4Y2VwdGlvbk9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3Npbmd1bGFyPScnezB9JycgLSAxIGV4Y2VwdGlvbiBvY2N1cnJlbmNlIGluICcnezF9JycKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGVsZW1lbnQgbmFtZSwgdGhlIHNlY29uZCBieSB0aGUgY291bnQgYW5kIHRoZSBsYXN0IGJ5IHRoZSBmaWxlIG5hbWUKLUV4Y2VwdGlvbk9jY3VycmVuY2VzRmluZGVyX2xhYmVsX3BsdXJhbD0nJ3swfScnIC0gezF9IGV4Y2VwdGlvbiBvY2N1cnJlbmNlcyBpbiAnJ3syfScnCi0KLUltcGxlbWVudE9jY3VycmVuY2VzRmluZGVyX2ludmFsaWRUYXJnZXQ9IENhbm5vdCBzZWFyY2ggZm9yIGN1cnJlbnQgc2VsZWN0aW9uLiBQbGVhc2Ugc2VsZWN0IGEgdHlwZSBiZWhpbmQgJ2ltcGxlbWVudHMnIG9yICdleHRlbmRzJy4KLUltcGxlbWVudE9jY3VycmVuY2VzRmluZGVyX3NlYXJjaGZvcj0gU2VhcmNoIGZvciBJbXBsZW1lbnQgT2NjdXJyZW5jZXMKLQotIyBUaGUgZmlyc3QgYXJndW1lbnQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZWxlbWVudCBuYW1lIGFuZCB0aGUgc2Vjb25kIG9uZSBieSB0aGUgZmlsZSBuYW1lCi1JbXBsZW1lbnRPY2N1cnJlbmNlc0ZpbmRlcl9sYWJlbF9zaW5ndWxhcj0nJ3swfScnIC0gMSBpbXBsZW1lbnQgb2NjdXJyZW5jZSBpbiAnJ3sxfScnCi0jIFRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBlbGVtZW50IG5hbWUsIHRoZSBzZWNvbmQgYnkgdGhlIGNvdW50IGFuZCB0aGUgbGFzdCBieSB0aGUgZmlsZSBuYW1lCi1JbXBsZW1lbnRPY2N1cnJlbmNlc0ZpbmRlcl9sYWJlbF9wbHVyYWw9Jyd7MH0nJyAtIHsxfSBpbXBsZW1lbnQgb2NjdXJyZW5jZXMgaW4gJyd7Mn0nJwotCi0KLSMgVGhlIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHBhdHRlcm4gYW5kIHRoZSBzZWNvbmQgYnkgdGhlIHNjb3BlCi1KYXZhU2VhcmNoT3BlcmF0aW9uX3Npbmd1bGFyRGVjbGFyYXRpb25zUG9zdGZpeD0nJ3swfScnIC0gMSBkZWNsYXJhdGlvbiBpbiB7MX0KLUphdmFTZWFyY2hPcGVyYXRpb25fc2luZ3VsYXJSZWZlcmVuY2VzUG9zdGZpeD0nJ3swfScnIC0gMSByZWZlcmVuY2UgaW4gezF9Ci1KYXZhU2VhcmNoT3BlcmF0aW9uX3Npbmd1bGFyUmVhZFJlZmVyZW5jZXNQb3N0Zml4PScnezB9JycgLSAxIHJlYWQgcmVmZXJlbmNlIGluIHsxfQotSmF2YVNlYXJjaE9wZXJhdGlvbl9zaW5ndWxhcldyaXRlUmVmZXJlbmNlc1Bvc3RmaXg9Jyd7MH0nJyAtIDEgd3JpdGUgcmVmZXJlbmNlIGluIHsxfQotSmF2YVNlYXJjaE9wZXJhdGlvbl9zaW5ndWxhckltcGxlbWVudG9yc1Bvc3RmaXg9Jyd7MH0nJyAtIDEgaW1wbGVtZW50b3IgaW4gezF9Ci1KYXZhU2VhcmNoT3BlcmF0aW9uX3Npbmd1bGFyT2NjdXJyZW5jZXNQb3N0Zml4PScnezB9JycgLSAxIG9jY3VycmVuY2UgaW4gezF9Ci0KLUphdmFTZWFyY2hPcGVyYXRpb25fcGx1cmFsRGVjbGFyYXRpb25zUG9zdGZpeD0nJ3swfScnIC0gezF9IGRlY2xhcmF0aW9ucyBpbiB7Mn0KLUphdmFTZWFyY2hPcGVyYXRpb25fcGx1cmFsUmVmZXJlbmNlc1Bvc3RmaXg9Jyd7MH0nJyAtIHsxfSByZWZlcmVuY2VzIGluIHsyfQotSmF2YVNlYXJjaE9wZXJhdGlvbl9wbHVyYWxSZWFkUmVmZXJlbmNlc1Bvc3RmaXg9Jyd7MH0nJyAtIHsxfSByZWFkIHJlZmVyZW5jZXMgaW4gezJ9Ci1KYXZhU2VhcmNoT3BlcmF0aW9uX3BsdXJhbFdyaXRlUmVmZXJlbmNlc1Bvc3RmaXg9Jyd7MH0nJyAtIHsxfSB3cml0ZSByZWZlcmVuY2VzIGluIHsyfQotSmF2YVNlYXJjaE9wZXJhdGlvbl9wbHVyYWxJbXBsZW1lbnRvcnNQb3N0Zml4PScnezB9JycgLSB7MX0gaW1wbGVtZW50b3JzIGluIHsyfQotSmF2YVNlYXJjaE9wZXJhdGlvbl9wbHVyYWxPY2N1cnJlbmNlc1Bvc3RmaXg9Jyd7MH0nJyAtIHsxfSBvY2N1cnJlbmNlcyBpbiB7Mn0KLUphdmFFbGVtZW50QWN0aW9uX3R5cGVTZWxlY3Rpb25EaWFsb2dfdGl0bGU9U2VhcmNoCi1KYXZhRWxlbWVudEFjdGlvbl90eXBlU2VsZWN0aW9uRGlhbG9nX21lc3NhZ2U9JlNlbGVjdCB0aGUgdHlwZSB0byBzZWFyY2g6Ci1KYXZhRWxlbWVudEFjdGlvbl9lcnJvcl9vcGVuX21lc3NhZ2U9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgdGhlIHR5cGUuCi0KLUphdmFFbGVtZW50QWN0aW9uX29wZXJhdGlvblVuYXZhaWxhYmxlX3RpdGxlPSBPcGVyYXRpb24gVW5hdmFpbGFibGUKLUphdmFFbGVtZW50QWN0aW9uX29wZXJhdGlvblVuYXZhaWxhYmxlX2dlbmVyaWM9IFRoZSBvcGVyYXRpb24gaXMgdW5hdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgSmF2YSBlbGVtZW50IG5hbWUuCi1KYXZhRWxlbWVudEFjdGlvbl9vcGVyYXRpb25VbmF2YWlsYWJsZV9maWVsZD0gVGhlIG9wZXJhdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uIFBsZWFzZSBzZWxlY3QgdGhlIG5hbWUgb2YgYSBmaWVsZCBvciBsb2NhbCB2YXJpYWJsZS4KLUphdmFFbGVtZW50QWN0aW9uX29wZXJhdGlvblVuYXZhaWxhYmxlX2ludGVyZmFjZT0gVGhlIG9wZXJhdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uIFBsZWFzZSBzZWxlY3QgdGhlIG5hbWUgb2YgYW4gaW50ZXJmYWNlLgotCi1Xb3Jrc3BhY2VTY29wZT0gd29ya3NwYWNlCi1Xb3JraW5nU2V0U2NvcGU9IHdvcmtpbmcgc2V0ICcnezB9JycKLVNlbGVjdGlvblNjb3BlPSBzZWxlY3Rpb24KLUVuY2xvc2luZ1Byb2plY3RzU2NvcGU9IHByb2plY3RzIHswfSwgLi4uCi1FbmNsb3NpbmdQcm9qZWN0U2NvcGU9IHByb2plY3QgezB9Ci1Qcm9qZWN0U2NvcGU9IHByb2plY3QgezB9Ci1IaWVyYXJjaHlTY29wZT0gaGllcmFyY2h5IG9mICcnezB9JycKLQotSmF2YVNlYXJjaFJlc3VsdFBhZ2Vfc29ydEJ5TmFtZT1OYW1lCi1KYXZhU2VhcmNoUmVzdWx0UGFnZV9zb3J0QnlQYXRoPVBhdGgKLUphdmFTZWFyY2hSZXN1bHRQYWdlX29wZW5fZWRpdG9yX2Vycm9yX3RpdGxlPU9wZW4gRWxlbWVudAotSmF2YVNlYXJjaFJlc3VsdFBhZ2Vfb3Blbl9lZGl0b3JfZXJyb3JfbWVzc2FnZT1PcGVuaW5nIGVsZW1lbnQgZmFpbGVkLgotSmF2YVNlYXJjaFJlc3VsdFBhZ2Vfc29ydEJ5UGFyZW50TmFtZT1QYXJlbnQgTmFtZQotSmF2YVNlYXJjaFJlc3VsdFBhZ2VfZmlsdGVyZWRfbWVzc2FnZT17MH0gKEZpbHRlcmVkKQotSmF2YVNlYXJjaFJlc3VsdFBhZ2Vfc29ydEJ5bGFiZWw9U29ydCBCeQotSmF2YVNlYXJjaFJlc3VsdFBhZ2VfZXJyb3JfbWFya2VyPUNvdWxkIG5vdCBjcmVhdGUgbWFya2VyCi0KLUphdmFTZWFyY2hSZXN1bHRQYWdlX2dyb3VwYnlfcHJvamVjdD1Qcm9qZWN0Ci1KYXZhU2VhcmNoUmVzdWx0UGFnZV9ncm91cGJ5X3Byb2plY3RfdG9vbHRpcD1Hcm91cCBieSBQcm9qZWN0Ci1KYXZhU2VhcmNoUmVzdWx0UGFnZV9ncm91cGJ5X3BhY2thZ2U9UGFja2FnZQotSmF2YVNlYXJjaFJlc3VsdFBhZ2VfZ3JvdXBieV9wYWNrYWdlX3Rvb2x0aXA9R3JvdXAgYnkgUGFja2FnZQotSmF2YVNlYXJjaFJlc3VsdFBhZ2VfZmlsdGVyZWRXaXRoQ291bnRfbWVzc2FnZT17MH0gKHsxfSBtYXRjaGVzIGZpbHRlcmVkIGZyb20gdmlldykKLUphdmFTZWFyY2hSZXN1bHRQYWdlX2dyb3VwYnlfZmlsZT1GaWxlCi1KYXZhU2VhcmNoUmVzdWx0UGFnZV9ncm91cGJ5X2ZpbGVfdG9vbHRpcD1Hcm91cCBieSBGaWxlCi1KYXZhU2VhcmNoUmVzdWx0UGFnZV9ncm91cGJ5X3R5cGU9VHlwZQotSmF2YVNlYXJjaFJlc3VsdFBhZ2VfZ3JvdXBieV90eXBlX3Rvb2x0aXA9R3JvdXAgYnkgVHlwZQotCi1KYXZhU2VhcmNoUXVlcnlfdGFza19sYWJlbD1TZWFyY2hpbmcKLUphdmFTZWFyY2hRdWVyeV9sYWJlbD1KYXZhIFNlYXJjaAotSmF2YVNlYXJjaFF1ZXJ5X2Vycm9yX3Vuc3VwcG9ydGVkX3BhdHRlcm49VW5zdXBwb3J0ZWQgc2VhcmNoIHBhdHRlcm46ICJ7MH0iCi1KYXZhU2VhcmNoUXVlcnlfc3RhdHVzX29rX21lc3NhZ2U9Rm91bmQgezB9IG1hdGNoZXMuCi0KLUphdmFTZWFyY2hRdWVyeV9lcnJvcl9wYXJ0aWNpcGFudF9lc3RpbWF0ZT1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBlc3RpbWF0aW5nIHByb2dyZXNzIGRhdGEKLUphdmFTZWFyY2hRdWVyeV9lcnJvcl9wYXJ0aWNpcGFudF9zZWFyY2g9QW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnRpY2lwYW50IHNlYXJjaAotCi1TZWFyY2hQYXJ0aWNpcGFudF9lcnJvcl9ub0lEPU1pc3NpbmcgaWQgYXR0cmlidXRlIG9uIHNlYXJjaCBwYXJ0aWNpcGFudCBleHRlbnNpb24gezB9Ci1TZWFyY2hQYXJ0aWNpcGFudF9lcnJvcl9ub05hdHVyZT1NaXNzaW5nIG5hdHVyZSBhdHRyaWJ1dGUgb24gc2VhcmNoIHBhcnRpY2lwYW50IHswfQotU2VhcmNoUGFydGljaXBhbnRfZXJyb3Jfbm9DbGFzcz1NaXNzaW5nIGNsYXNzIGF0dHJpYnV0ZSBvbiBzZWFyY2ggcGFydGljaXBhbnQgezB9Ci1TZWFyY2hQYXJ0aWNpcGFudF9lcnJvcl9jbGFzc0Nhc3Q9U2VhcmNoIHBhcnRpY2lwYW50IGRvZXNuJ3QgaW1wbGVtZW50IElRdWVyeVBhcnRpY2lwYW50Ci0KLQotTWF0Y2hGaWx0ZXJfSW1wb3J0RmlsdGVyX25hbWU9SW1wb3J0cwotTWF0Y2hGaWx0ZXJfSW1wb3J0RmlsdGVyX2FjdGlvbkxhYmVsPUZpbHRlciAmSW1wb3J0cwotTWF0Y2hGaWx0ZXJfSW1wb3J0RmlsdGVyX2Rlc2NyaXB0aW9uPUZpbHRlcnMgbWF0Y2hlcyB0aGF0IGFyZSBpbiBpbXBvcnQgc3RhdGVtZW50cwotCi0KLU1hdGNoRmlsdGVyX1dyaXRlRmlsdGVyX25hbWU9V3JpdGVzCi1NYXRjaEZpbHRlcl9Xcml0ZUZpbHRlcl9hY3Rpb25MYWJlbD1GaWx0ZXIgJldyaXRlcwotTWF0Y2hGaWx0ZXJfV3JpdGVGaWx0ZXJfZGVzY3JpcHRpb249RmlsdGVycyBtYXRjaGVzIHRoYXQgYXJlIHdyaXRlIGFjY2Vzc2VzCi0KLU1hdGNoRmlsdGVyX1JlYWRGaWx0ZXJfbmFtZT1SZWFkcwotTWF0Y2hGaWx0ZXJfUmVhZEZpbHRlcl9hY3Rpb25MYWJlbD1GaWx0ZXIgJlJlYWRzCi1NYXRjaEZpbHRlcl9SZWFkRmlsdGVyX2Rlc2NyaXB0aW9uPUZpbHRlcnMgbWF0Y2hlcyB0aGF0IGFyZSBub3Qgd3JpdGUgYWNjZXNzZXMKLQotTWF0Y2hGaWx0ZXJfSmF2YWRvY0ZpbHRlcl9uYW1lPUphdmFkb2MKLU1hdGNoRmlsdGVyX0phdmFkb2NGaWx0ZXJfYWN0aW9uTGFiZWw9RmlsdGVyICZKYXZhZG9jCi1NYXRjaEZpbHRlcl9KYXZhZG9jRmlsdGVyX2Rlc2NyaXB0aW9uPUZpbHRlcnMgbWF0Y2hlcyB0aGF0IGFyZSBpbnNpZGUgSmF2YWRvYyBjb21tZW50cwotCi1NYXRjaEZpbHRlcl9FcmFzdXJlRmlsdGVyX25hbWU9SW5jb21wYXRpYmxlIHR5cGUgYXJndW1lbnRzCi1NYXRjaEZpbHRlcl9FcmFzdXJlRmlsdGVyX2FjdGlvbkxhYmVsPUZpbHRlciBJbiZjb21wYXRpYmxlCi1NYXRjaEZpbHRlcl9FcmFzdXJlRmlsdGVyX2Rlc2NyaXB0aW9uPUZpbHRlcnMgcGFyYW1ldGVyaXplZCB0eXBlIG1hdGNoZXMgdGhhdCBhcmUgbm90IGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSBzZWFyY2ggcGF0dGVybgotCi1NYXRjaEZpbHRlcl9JbmV4YWN0RmlsdGVyX25hbWU9SW5leGFjdCB0eXBlIGFyZ3VtZW50cwotTWF0Y2hGaWx0ZXJfSW5leGFjdEZpbHRlcl9hY3Rpb25MYWJlbD1GaWx0ZXIgSW5lJnhhY3QKLU1hdGNoRmlsdGVyX0luZXhhY3RGaWx0ZXJfZGVzY3JpcHRpb249RmlsdGVycyBwYXJhbWV0ZXJpemVkIHR5cGUgbWF0Y2hlcyB3aGVyZSB0aGUgdHlwZSBhcmd1bWVudHMgZG9uJ3QgZXhhY3RseSBtYXRjaCB0aGUgc2VhcmNoIHBhdHRlcm4ncyB0eXBlIGFyZ3VtZW50cwotCi1NZXRob2RFeGl0c0ZpbmRlcl9ub19yZXR1cm5fdHlwZV9zZWxlY3RlZD1ObyByZXR1cm4gdHlwZSBzZWxlY3RlZAotCi1UZXh0U2VhcmNoTGFiZWxQcm92aWRlcl9tYXRjaENvdW50Rm9ybWF0PXswfSAoezF9IG1hdGNoZXMpCi0KLUZpbHRlcnNEaWFsb2dfdGl0bGU9SmF2YSBTZWFyY2ggRmlsdGVycwotRmlsdGVyc0RpYWxvZ19maWx0ZXJzX2xhYmVsPVNlbGVjdCB0aGUgJm1hdGNoZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0czoKLUZpbHRlcnNEaWFsb2dfZGVzY3JpcHRpb25fbGFiZWw9RmlsdGVyIERlc2NyaXB0aW9uOgotRmlsdGVyc0RpYWxvZ19saW1pdF9sYWJlbD0mTGltaXQgdG9wIGxldmVsIGVsZW1lbnRzIGluIEphdmEgc2VhcmNoIHZpZXcgdG86Ci1GaWx0ZXJzRGlhbG9nX2xpbWl0X2Vycm9yPUVsZW1lbnQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcgotRmlsdGVyc0RpYWxvZ0FjdGlvbl9sYWJlbD1GaSZsdGVycy4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZDIzNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUXVlcnlSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLWNsYXNzIFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQlwcml2YXRlIFNlYXJjaFJlc3VsdCBmU2VhcmNoUmVzdWx0OwotCi0JCi0JcHJvdGVjdGVkIFNlYXJjaFF1ZXJ5UmVzdWx0Q29sbGVjdG9yKFNlYXJjaFJlc3VsdCByZXN1bHQpewotCQlzdXBlcigpOwotCQlmU2VhcmNoUmVzdWx0PSByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWF0Y2ggYU1hdGNoID0gbmV3IE1hdGNoKG1hdGNoLmdldEZpbGUoKSwgbWF0Y2guZ2V0T2Zmc2V0KCksIG1hdGNoLmdldExlbmd0aCgpKTsKLQkJZlNlYXJjaFJlc3VsdC5hZGRNYXRjaChhTWF0Y2gpOwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2ZmI5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkuU2VhcmNoUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hBZGFwdGVyLCBJRmlsZU1hdGNoQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBNYXRjaFtdIEVNUFRZX0FSUj0gbmV3IE1hdGNoWzBdOwotCQotCXByaXZhdGUgQWJzdHJhY3RTZWFyY2hRdWVyeSBmUXVlcnk7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0KEFic3RyYWN0U2VhcmNoUXVlcnkgam9iKSB7Ci0JCWZRdWVyeT0gam9iOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFNlYXJjaFBsdWdpbkltYWdlcy5ERVNDX09CSl9UU0VBUkNIX0RQRE47Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBmUXVlcnkuZ2V0UmVzdWx0TGFiZWwoZ2V0TWF0Y2hDb3VudCgpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRNYXRjaGVzKGZpbGUpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gKElGaWxlKWVsZW1lbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hvd25JbkVkaXRvcihNYXRjaCBtYXRjaCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JJbnB1dCBlaT0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlaSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmk9IChJRmlsZUVkaXRvcklucHV0KSBlaTsKLQkJCXJldHVybiBtYXRjaC5nZXRFbGVtZW50KCkuZXF1YWxzKGZpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvcklucHV0IGVpPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGVpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmaT0gKElGaWxlRWRpdG9ySW5wdXQpIGVpOwotCQkJcmV0dXJuIGdldE1hdGNoZXMoZmkuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBmUXVlcnk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZU1hdGNoQWRhcHRlciBnZXRGaWxlTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHVibGljIElFZGl0b3JNYXRjaEFkYXB0ZXIgZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThkMDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLlNlYXJjaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS5TZWFyY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLnRleHQuRmlsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLnRleHQuSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLmludGVybmFsLnVpLnRleHQuUmVzb3VyY2VUcmFuc2ZlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS50ZXh0LlNvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklDb250ZXh0TWVudUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdFZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbkZpbGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuV2l0aE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0UGFnZSBleHRlbmRzIEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWNvcmF0b3JJZ25vcmluZ1ZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXByaXZhdGUgZmluYWwgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQkJcHVibGljIERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKG51bGwpOyAvLyBsYXp5IGluaXRpYWxpemF0aW9uCi0JCQlmTGFiZWxQcm92aWRlcj0gbGFiZWxQcm92aWRlcjsKLQkJfQotCQkKLQkgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JICAgICAgICBTdHJpbmcgbmFtZTE9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZTEpOwotCSAgICAgICAgU3RyaW5nIG5hbWUyPSBmTGFiZWxQcm92aWRlci5nZXRUZXh0KGUyKTsKLQkgICAgICAgIGlmIChuYW1lMSA9PSBudWxsKQotCSAgICAgICAgICAgIG5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCSAgICAgICAgaWYgKG5hbWUyID09IG51bGwpCi0JICAgICAgICAgICAgbmFtZTIgPSAiIjsvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gZ2V0Q29sbGF0b3IoKS5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JICAgIH0KLQkgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlciNnZXRDb2xsYXRvcigpCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgQ29sbGF0b3IgZ2V0Q29sbGF0b3IoKSB7Ci0JCQlpZiAoY29sbGF0b3IgPT0gbnVsbCkgewotCQkJCWNvbGxhdG9yPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNvbGxhdG9yOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU09SVElORz0gIm9yZy5lY2xpcHNlLnNlYXJjaC5yZXN1bHRwYWdlLnNvcnRpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGlvbkdyb3VwIGZBY3Rpb25Hcm91cDsKLQlwcml2YXRlIElGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRTb3J0T3JkZXI7Ci0JcHJpdmF0ZSBTb3J0QWN0aW9uIGZTb3J0QnlOYW1lQWN0aW9uOwotCXByaXZhdGUgU29ydEFjdGlvbiBmU29ydEJ5UGF0aEFjdGlvbjsKLQkKLQkvLyBuZXZlciB1c2VkCi0JLy9wcml2YXRlIEVkaXRvck9wZW5lciBmRWRpdG9yT3BlbmVyPSBuZXcgRWRpdG9yT3BlbmVyKCk7Ci0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0hPV19JTl9UQVJHRVRTPSBuZXcgU3RyaW5nW10geyBJUGFnZUxheW91dC5JRF9SRVNfTkFWIH07Ci0JcHJpdmF0ZSAgc3RhdGljIGZpbmFsIElTaG93SW5UYXJnZXRMaXN0IFNIT1dfSU5fVEFSR0VUX0xJU1Q9IG5ldyBJU2hvd0luVGFyZ2V0TGlzdCgpIHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBTSE9XX0lOX1RBUkdFVFM7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBmUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJLy8gVE9ETwotCQkvL2ZTb3J0QnlOYW1lQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X25hbWVfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfTEFCRUxfUEFUSCk7IAotCQkvL2ZTb3J0QnlQYXRoQWN0aW9uPSBuZXcgU29ydEFjdGlvbihTZWFyY2hNZXNzYWdlcy5GaWxlU2VhcmNoUGFnZV9zb3J0X3BhdGhfbGFiZWwsIHRoaXMsIEZpbGVMYWJlbFByb3ZpZGVyLlNIT1dfUEFUSF9MQUJFTCk7IAotICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLyoKLQkJZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoU2VhcmNoUHJlZmVyZW5jZVBhZ2UuTElNSVRfVEFCTEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpIHx8IFNlYXJjaFByZWZlcmVuY2VQYWdlLkxJTUlUX1RBQkxFX1RPLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkKLQkJCQkJaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCQkJCWdldFZpZXdQYXJ0KCkudXBkYXRlTGFiZWwoKTsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkqLwotfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRHJhZ0FkYXB0ZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzPSBuZXcgVHJhbnNmZXJbXSB7IFJlc291cmNlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQlpbnQgb3BzPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSzsKLQkJCi0JCURlbGVnYXRpbmdEcmFnQWRhcHRlciBhZGFwdGVyPSBuZXcgRGVsZWdhdGluZ0RyYWdBZGFwdGVyKCk7Ci0JCWFkYXB0ZXIuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBSZXNvdXJjZVRyYW5zZmVyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0JCQotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQob3BzLCB0cmFuc2ZlcnMsIGFkYXB0ZXIpOwotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUYWJsZVZpZXdlcihUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCUZpbGVMYWJlbFByb3ZpZGVyIGlubmVyTGFiZWxQcm92aWRlcj0gbmV3IEZpbGVMYWJlbFByb3ZpZGVyKHRoaXMsIGZDdXJyZW50U29ydE9yZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKGlubmVyTGFiZWxQcm92aWRlciwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcih0aGlzKSk7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IERlY29yYXRvcklnbm9yaW5nVmlld2VyU29ydGVyKGlubmVyTGFiZWxQcm92aWRlcikpOwotCQlmQ29udGVudFByb3ZpZGVyPSAoSUZpbGVTZWFyY2hDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJYWRkRHJhZ0FkYXB0ZXJzKHZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJRmlsZUxhYmVsUHJvdmlkZXIgaW5uZXJMYWJlbFByb3ZpZGVyPSBuZXcgRmlsZUxhYmVsUHJvdmlkZXIodGhpcywgRmlsZUxhYmVsUHJvdmlkZXIuU0hPV19MQUJFTCk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihpbm5lckxhYmVsUHJvdmlkZXIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgRGVjb3JhdG9ySWdub3JpbmdWaWV3ZXJTb3J0ZXIoaW5uZXJMYWJlbFByb3ZpZGVyKSk7Ci0JCWZDb250ZW50UHJvdmlkZXI9IChJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlhZGREcmFnQWRhcHRlcnModmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gYWN0aXZhdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGU9IChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlJV29ya2JlbmNoUGFnZSB3YlBhZ2U9IFVJUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yPSBJREUub3BlbkVkaXRvcih3YlBhZ2UsIChJRmlsZSkgbWF0Y2guZ2V0RWxlbWVudCgpLCBhY3RpdmF0ZSk7Ci0JCWlmIChvZmZzZXQgIT0gMCAmJiBsZW5ndGggIT0gMCkgewotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvcj0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2Zmc2V0LCBsZW5ndGgpOwotCQkJfSBlbHNlIGlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCXNob3dXaXRoTWFya2VyKGVkaXRvciwgZmlsZSwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93V2l0aE1hcmtlcihJRWRpdG9yUGFydCBlZGl0b3IsIElGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXIgbWFya2VyPSBudWxsOwotCQl0cnkgewotCQkJbWFya2VyPSBmaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcz0gbmV3IEhhc2hNYXAoNCk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKG9mZnNldCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfZXJyb3JfbWFya2VyLCBlKTsgCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobWFya2VyICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1ncikgewotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWdyKTsKLQkJYWRkU29ydEFjdGlvbnMobWdyKTsKLQkJZkFjdGlvbkdyb3VwLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJZkFjdGlvbkdyb3VwLmZpbGxDb250ZXh0TWVudShtZ3IpOwotLy8JCUZpbGVTZWFyY2hRdWVyeSBxdWVyeT0gKEZpbGVTZWFyY2hRdWVyeSkgZ2V0SW5wdXQoKS5nZXRRdWVyeSgpOwotCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRTb3J0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCWlmIChnZXRMYXlvdXQoKSAhPSBGTEFHX0xBWU9VVF9GTEFUKQotCQkJcmV0dXJuOwotCQlNZW51TWFuYWdlciBzb3J0TWVudT0gbmV3IE1lbnVNYW5hZ2VyKFNlYXJjaE1lc3NhZ2VzLkZpbGVTZWFyY2hQYWdlX3NvcnRfYnlfbGFiZWwpOyAKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlOYW1lQWN0aW9uKTsKLQkJc29ydE1lbnUuYWRkKGZTb3J0QnlQYXRoQWN0aW9uKTsKLQkJCi0JCWZTb3J0QnlOYW1lQWN0aW9uLnNldENoZWNrZWQoZkN1cnJlbnRTb3J0T3JkZXIgPT0gZlNvcnRCeU5hbWVBY3Rpb24uZ2V0U29ydE9yZGVyKCkpOwotCQlmU29ydEJ5UGF0aEFjdGlvbi5zZXRDaGVja2VkKGZDdXJyZW50U29ydE9yZGVyID09IGZTb3J0QnlQYXRoQWN0aW9uLmdldFNvcnRPcmRlcigpKTsKLQkJCi0JCW1nci5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVAsIHNvcnRNZW51KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGFydChJU2VhcmNoUmVzdWx0Vmlld1BhcnQgcGFydCkgewotCQlzdXBlci5zZXRWaWV3UGFydChwYXJ0KTsKLQkJZkFjdGlvbkdyb3VwPSBuZXcgTmV3VGV4dFNlYXJjaEFjdGlvbkdyb3VwKHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmQWN0aW9uR3JvdXAuZGlzcG9zZSgpOwotCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWZDb250ZW50UHJvdmlkZXIuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJZkNvbnRlbnRQcm92aWRlci5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvcnRPcmRlcihpbnQgc29ydE9yZGVyKSB7Ci0JCWZDdXJyZW50U29ydE9yZGVyPSBzb3J0T3JkZXI7Ci0JCURlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGxwV3JhcHBlcj0gKERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKSBnZXRWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCSgoRmlsZUxhYmVsUHJvdmlkZXIpIGxwV3JhcHBlci5nZXRMYWJlbFByb3ZpZGVyKCkpLnNldE9yZGVyKHNvcnRPcmRlcik7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJZ2V0U2V0dGluZ3MoKS5wdXQoS0VZX1NPUlRJTkcsIGZDdXJyZW50U29ydE9yZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJc3VwZXIucmVzdG9yZVN0YXRlKG1lbWVudG8pOwotCQl0cnkgewotCQkJZkN1cnJlbnRTb3J0T3JkZXI9IGdldFNldHRpbmdzKCkuZ2V0SW50KEtFWV9TT1JUSU5HKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vZkN1cnJlbnRTb3J0T3JkZXI9IGZTb3J0QnlOYW1lQWN0aW9uLmdldFNvcnRPcmRlcigpOwotCQl9Ci0JCWlmIChtZW1lbnRvICE9IG51bGwpIHsKLQkJCUludGVnZXIgdmFsdWU9IG1lbWVudG8uZ2V0SW50ZWdlcihLRVlfU09SVElORyk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlmQ3VycmVudFNvcnRPcmRlcj0gdmFsdWUuaW50VmFsdWUoKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlci5zYXZlU3RhdGUobWVtZW50byk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihLRVlfU09SVElORywgZkN1cnJlbnRTb3J0T3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gU0hPV19JTl9UQVJHRVRfTElTVDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nIGxhYmVsPSBzdXBlci5nZXRMYWJlbCgpOwotCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcj0gZ2V0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotCQkJVGFibGVWaWV3ZXIgdHY9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCi0JCQlBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0PSBnZXRJbnB1dCgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW50IGl0ZW1Db3VudD0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdHYuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKGdldElucHV0KCkpLmxlbmd0aDsKLQkJCQlpbnQgZmlsZUNvdW50PSBnZXRJbnB1dCgpLmdldEVsZW1lbnRzKCkubGVuZ3RoOwotCQkJCWlmIChpdGVtQ291bnQgPCBmaWxlQ291bnQpIHsKLQkJCQkJU3RyaW5nIGZvcm1hdD0gU2VhcmNoTWVzc2FnZXMuRmlsZVNlYXJjaFBhZ2VfbGltaXRlZF9mb3JtYXQ7IAotCQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZm9ybWF0LCBuZXcgT2JqZWN0W117bGFiZWwsIG5ldyBJbnRlZ2VyKGl0ZW1Db3VudCksIG5ldyBJbnRlZ2VyKGZpbGVDb3VudCl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQljbGFzcyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZlNlbGVjdGlvblByb3ZpZGVyOwkJCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0JCXByaXZhdGUgT3BlbkZpbGVBY3Rpb24gZk9wZW5BY3Rpb247Ci0JCXByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gZk9wZW5Qcm9wZXJ0aWVzRGlhbG9nOwotCi0JCXB1YmxpYyBOZXdUZXh0U2VhcmNoQWN0aW9uR3JvdXAoSVZpZXdQYXJ0IHBhcnQpIHsKLQkJCUFzc2VydC5pc05vdE51bGwocGFydCk7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZT0gcGFydC5nZXRTaXRlKCk7Ci0JCQlmU2VsZWN0aW9uUHJvdmlkZXI9IHNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWZQYWdlPSBzaXRlLmdldFBhZ2UoKTsKLQkJCWZPcGVuUHJvcGVydGllc0RpYWxvZz0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKHNpdGUsIGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JCQlmT3BlbkFjdGlvbj0gbmV3IE9wZW5GaWxlQWN0aW9uKGZQYWdlKTsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJCWVsc2UKLQkJCQlmT3BlblByb3BlcnRpZXNEaWFsb2cuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gdmlldyBtdXN0IGV4aXN0IGlmIHdlIGNyZWF0ZSBhIGNvbnRleHQgbWVudSBmb3IgaXQuCi0JCQkKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uPSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlhZGRPcGVuV2l0aE1lbnUobWVudSwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCWlmIChmT3BlblByb3BlcnRpZXNEaWFsb2cgIT0gbnVsbCAmJiBmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNFbmFibGVkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiZmT3BlblByb3BlcnRpZXNEaWFsb2cuaXNBcHBsaWNhYmxlRm9yU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSkKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwotCQkJfQotCQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBtZW51LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuOwotCQkKLQkJCU9iamVjdCBvPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkJaWYgKCEobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpKQotCQkJCXJldHVybjsgCi0JCQotCQkJZk9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBmT3BlbkFjdGlvbik7Ci0JCQotCQkJLy8gQ3JlYXRlIG1lbnUKLQkJCUlNZW51TWFuYWdlciBzdWJtZW51PSBuZXcgTWVudU1hbmFnZXIoU2VhcmNoTWVzc2FnZXMuT3BlbldpdGhNZW51X2xhYmVsKTsgCi0JCQlzdWJtZW51LmFkZChuZXcgT3BlbldpdGhNZW51KGZQYWdlLCAoSUFkYXB0YWJsZSlvKSk7Ci0JCQotCQkJLy8gQWRkIHRoZSBzdWJtZW51LgotCQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBzdWJtZW51KTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXIpIHsKLQkJCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcik7Ci0JCQlzZXRHbG9iYWxBY3Rpb25IYW5kbGVycyhhY3Rpb25CYXIpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0R2xvYmFsQWN0aW9uSGFuZGxlcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBmT3BlblByb3BlcnRpZXNEaWFsb2cpOwkJCi0JCX0KLQl9CQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlODc2ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwudWkudGV4dC5JRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlI9IG5ldyBPYmplY3RbMF07Ci0JCi0JcHJpdmF0ZSBTZWFyY2hSZXN1bHRQYWdlIGZQYWdlOwotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIoU2VhcmNoUmVzdWx0UGFnZSBwYWdlKSB7Ci0JCWZQYWdlPSBwYWdlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzPSAoKFNlYXJjaFJlc3VsdClpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0gICAJICAgICAgICAvLyBjcyA6IEkndmUgY29tbWVudCB0aGlzIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCQkvLyBFdmVuIG1vcmUgaW1wb3J0YW50bHkgd2UgbmVlZCB0byBkaXNjdXNzIHdpdGggdGhlIGJhc2UgZ3V5cyB0byBnZXQgQVBJIGxpbmVkIHVwIGZvciB0aGlzIChzZWUgYnVnIDE2MzE3NykuCi0JCQkvKgotCQkJaW50IHRhYmxlTGltaXQ9IFNlYXJjaFByZWZlcmVuY2VQYWdlLmdldFRhYmxlTGltaXQoKTsKLQkJCWlmIChTZWFyY2hQcmVmZXJlbmNlUGFnZS5pc1RhYmxlTGltaXRlZCgpICYmIGVsZW1lbnRzLmxlbmd0aCA+IHRhYmxlTGltaXQpIHsKLQkJCQlPYmplY3RbXSBzaG93bkVsZW1lbnRzPSBuZXcgT2JqZWN0W3RhYmxlTGltaXRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZWxlbWVudHMsIDAsIHNob3duRWxlbWVudHMsIDAsIHRhYmxlTGltaXQpOwotCQkJCXJldHVybiBzaG93bkVsZW1lbnRzOwotCQkJfSovCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0FSUjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgewotCQkJZlJlc3VsdD0gKFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlUYWJsZVZpZXdlciB2aWV3ZXI9IGdldFZpZXdlcigpOwotCSAgICAvLyBjcyA6IEkndmUgY29tbWVudCAndGFibGVMaW1pdGVkJyByZWxhdGVkIGNvZGUgb3V0IGZvciBub3cuICBXZSBuZWVkIHRvIHJldmlldyB0aGUgY2hhbmdlcyB0byB0aGUgYmFzZSBjbGFzcyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCi0JCS8vIEV2ZW4gbW9yZSBpbXBvcnRhbnRseSB3ZSBuZWVkIHRvIGRpc2N1c3Mgd2l0aCB0aGUgYmFzZSBndXlzIHRvIGdldCBBUEkgbGluZWQgdXAgZm9yIHRoaXMgKHNlZSBidWcgMTYzMTc3KS4KLQkJLy9ib29sZWFuIHRhYmxlTGltaXRlZD0gU2VhcmNoUHJlZmVyZW5jZVBhZ2UuaXNUYWJsZUxpbWl0ZWQoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkgewotCQkJCWlmICh2aWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdmlld2VyLnVwZGF0ZSh1cGRhdGVkRWxlbWVudHNbaV0sIG51bGwpOwotCQkJCWVsc2UgewotCQkJCQkvL2lmICghdGFibGVMaW1pdGVkIHx8IHZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIDwgU2VhcmNoUHJlZmVyZW5jZVBhZ2UuZ2V0VGFibGVMaW1pdCgpKQotCQkJCQkJdmlld2VyLmFkZCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gKFRhYmxlVmlld2VyKSBmUGFnZS5nZXRWaWV3ZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2EyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC5pbnRlcm5hbC51aS50ZXh0LklGaWxlU2VhcmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdDsKLQotCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRmlsZVNlYXJjaENvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUj0gbmV3IE9iamVjdFswXTsKLQotCXByaXZhdGUgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGZSZXN1bHQ7Ci0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBNYXAgZkNoaWxkcmVuTWFwOwotCQotCVNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotCQlmVHJlZVZpZXdlcj0gdmlld2VyOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSB7Ci0JCQlpbml0aWFsaXplKChTZWFyY2hSZXN1bHQpIG5ld0lucHV0KTsKLQkJfQotCX0KLQkKLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQpIHsKLQkJZlJlc3VsdD0gcmVzdWx0OwotCQlmQ2hpbGRyZW5NYXA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHM9IHJlc3VsdC5nZXRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5zZXJ0KGVsZW1lbnRzW2ldLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudD0gZ2V0UGFyZW50KGNoaWxkKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5zZXJ0Q2hpbGQocGFyZW50LCBjaGlsZCkpIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIuYWRkKHBhcmVudCwgY2hpbGQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikKLQkJCQkJZlRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoaWxkPSBwYXJlbnQ7Ci0JCQlwYXJlbnQ9IGdldFBhcmVudChjaGlsZCk7Ci0JCX0KLQkJaWYgKGluc2VydENoaWxkKGZSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJZlRyZWVWaWV3ZXIuYWRkKGZSZXN1bHQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgYWxyZWFkeSB3YXMgYSBjaGlsZCBvZiBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnllPC9jb2RlPiBpZiB0aGUgY2hpbGQgd2FzIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQgY2hpbGRyZW49IChTZXQpIGZDaGlsZHJlbk1hcC5nZXQocGFyZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuPSBuZXcgSGFzaFNldCgpOwotCQkJZkNoaWxkcmVuTWFwLnB1dChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQkvLyBwcmVjb25kaXRpb24gaGVyZTogIGZSZXN1bHQuZ2V0TWF0Y2hDb3VudChjaGlsZCkgPD0gMAotCQotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKQotCQkJCWZUcmVlVmlld2VyLnJlZnJlc2goZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZlJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQlmQ2hpbGRyZW5NYXAucmVtb3ZlKGVsZW1lbnQpOwotCQkJCU9iamVjdCBwYXJlbnQ9IGdldFBhcmVudChlbGVtZW50KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQkJCXJlbW92ZShwYXJlbnQsIHJlZnJlc2hWaWV3ZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlbW92ZUZyb21TaWJsaW5ncyhlbGVtZW50LCBmUmVzdWx0KTsKLQkJCQkJaWYgKHJlZnJlc2hWaWV3ZXIpCi0JCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQlmVHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGcm9tU2libGluZ3MoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwYXJlbnQpIHsKLQkJU2V0IHNpYmxpbmdzPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5ncy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJU2V0IGNoaWxkcmVuPSAoU2V0KSBmQ2hpbGRyZW5NYXAuZ2V0KHBhcmVudEVsZW1lbnQpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWV9BUlI7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSB1cGRhdGVkRWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZSZXN1bHQuZ2V0TWF0Y2hDb3VudCh1cGRhdGVkRWxlbWVudHNbaV0pID4gMCkKLQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCWVsc2UKLQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKGZSZXN1bHQpOwotCQlmVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgZWxlbWVudDsKLQkJCXJldHVybiByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUxNThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlOwotCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0gICAgcHJpdmF0ZSBMaXN0IGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQ7Ci0gICAgcHJpdmF0ZSBMaXN0IG1hc3RlckNvbXBvbmVudExpc3Q7Ci0gICAgCi0gICAgLy8gd2lkZ2V0cwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgdG9wQ29tcG9zaXRlOwotICAgIHByb3RlY3RlZCBDb21wb3NpdGUgYm90dG9tQ29tcG9zaXRlOyAKLSAgICBwcml2YXRlIFRleHQgdGV4dEZpbHRlcjsKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgY29tcG9uZW50VGFibGVWaWV3ZXI7Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTG9jYXRpb25MYWJlbCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLSAgICBwcm90ZWN0ZWQgVmlld0Zvcm0gZmlsZUxvY2F0aW9uVmlldzsgICAgCi0gICAgcHJvdGVjdGVkIENMYWJlbCBsb2NhdGlvbkxhYmVsOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgaXRlbSBwcmV2aW91c2x5IHNlbGVjdGVkIGluIHRoZSB0YWJsZQotCXByaXZhdGUgVGFibGVJdGVtIHByZXZJdGVtOwotCXByaXZhdGUgU3RyaW5nIHByZXZJdGVtVGV4dDsKLQotCXByb3RlY3RlZCBPYmplY3QgY29tcG9uZW50U2VsZWN0aW9uOwotICAgIHByb3RlY3RlZCBPYmplY3QgcXVhbGlmaWVyVGV4dFNlbGVjdGlvbjsKLSAgICAKLQlwcm90ZWN0ZWQgVG9vbEJhciBmaWx0ZXJUb29sQmFyOwotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBIYXNoTWFwIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sID0gbmV3IEhhc2hNYXAoKTsgIAotICAgIHByaXZhdGUgQnV0dG9uIG5ld0J1dHRvbjsKLSAKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgICAgICB0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG1hc3RlckNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uaW5pdCh0aGlzKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotICAgICAgICBzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRUZXh0RmlsdGVyRm9jdXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VGV4dEZpbHRlckZvY3VzKCkgewotICAgICAgICB0ZXh0RmlsdGVyLnNldEZvY3VzKCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KGRpYWxvZ1RpdGxlKTsKLQotICAgICAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZERhdGEgZ0RhdGEgPSAoR3JpZERhdGEpIG1haW5Db21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotICAgICAgICBnRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgICAgICBnRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0gICAgICAgIAotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVdpZGdldEFib3ZlUXVhbGlmaWVyQm94KG1haW5Db21wb3NpdGUpOyAgICAgICAgCi0gICAgICAgIC8vIFN1YmNsYXNzZXMgbWF5IHVzZSB0aGlzIENvbXBvc2l0ZSB0byBhZGQgZGVzaXJlZCB3aWRnZXRzCi0gICAgICAgIC8vdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIC8vdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgICAvL3RvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBpbnRyb2R1Y2UgYSBtZXRob2QgaGVyZSB0byBjb250YWluIHRoaXMKLSAgICAgICAgLy8gc28gd2UgY2FuIGFkZCBkaWZmZXJlbnQgcGFyZW50IG90aGVyIHRoYW4gJ3RvcENvbXBvc2l0ZScKLSAgICAgICAgQ29tcG9zaXRlIGZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dEZpbHRlckxhYmVsQW5kVGV4dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgbGF5b3V0RmlsdGVyTGFiZWxBbmRUZXh0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGZpbHRlckxhYmVsQW5kVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgZmlsdGVyTGFiZWxBbmRUZXh0LnNldExheW91dChsYXlvdXRGaWx0ZXJMYWJlbEFuZFRleHQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBUZXh0IHRleHRGaWx0ZXIKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbHRlckxhYmVsID0gbmV3IExhYmVsKGZpbHRlckxhYmVsQW5kVGV4dCwgU1dULk5PTkUpOwotICAgICAgICBmaWx0ZXJMYWJlbC5zZXRUZXh0KGNvbmZpZ3VyYXRpb24uZ2V0RmlsdGVyTGFiZWxUZXh0KCkpOy8vICsgIig/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOiIpOwotICAgICAgICBHcmlkRGF0YSBmaWx0ZXJMYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZmlsdGVyTGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZmlsdGVyTGFiZWwuc2V0TGF5b3V0RGF0YShmaWx0ZXJMYWJlbERhdGEpOwotCi0gICAgICAgIHRleHRGaWx0ZXIgPSBuZXcgVGV4dChmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgdGV4dEZpbHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgICAgICAgIAotICAgICAgICB0ZXh0RmlsdGVyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUZXh0RmlsdGVyTW9kaWZ5QWRhcHRlcigpKTsKLSAgICAgICAgR3JpZERhdGEgdGV4dEZpbHRlckRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgdGV4dEZpbHRlckRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICAgIHRleHRGaWx0ZXJEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICB0ZXh0RmlsdGVyLnNldExheW91dERhdGEodGV4dEZpbHRlckRhdGEpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgSU5ld0NvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0TmV3Q29tcG9uZW50SGFuZGxlcigpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihmaWx0ZXJMYWJlbEFuZFRleHQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgbmV3QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05ldyk7ICAKLSAgICAgICAgICAgbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZXIub3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgQ29tcG9uZW50IFRhYmxlVmlld2VyCi0gICAgICAgIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uY3JlYXRlV2lkZ2V0QWJvdmVRdWFsaWZpZXJCb3gobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgUXVhbGlmaWVyIExpc3Qgd2lkZ2V0Ci0gICAgICAgIExhYmVsIHF1YWxpZmllckxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfUVVBTElGSUVSKTsKLQkJcXVhbGlmaWVyTGFiZWwuc2V0VGV4dChmaWxlTG9jYXRpb25MYWJlbCk7Ci0KLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldyA9IG5ldyBWaWV3Rm9ybShtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSAyMjsKLSAgICAgICAgZmlsZUxvY2F0aW9uVmlldy5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICAKLSAgICAJbG9jYXRpb25MYWJlbCA9IG5ldyBDTGFiZWwoZmlsZUxvY2F0aW9uVmlldywgU1dULkZMQVQpOwotICAgICAgICBmaWxlTG9jYXRpb25WaWV3LnNldENvbnRlbnQobG9jYXRpb25MYWJlbCk7Ci0gICAgCWxvY2F0aW9uTGFiZWwuc2V0Rm9udChmaWxlTG9jYXRpb25WaWV3LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbi5jcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBib3R0b21Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdGhlIENvbXBvbmVudCBUYWJsZVZpZXdlciB2aWEgdGhlIHByb3ZpZGVyCi0gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBzZXQvZ2V0IHRoZSBDb250ZW50UHJvdmlkZXI/Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29uZmlndXJhdGlvbi5nZXREZXNjcmlwdGlvblByb3ZpZGVyKCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudFRhYmxlVmlld2VySW5wdXQpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRvIHNvbWUgd29yayB0byBtYWtlIHRoZSBkZWZhdWx0IHNlYXJjaCBzY29wZQotICAgICAgICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotICAgICAgICAvLyBhcmd1bWVudCBpbiB0byBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3QgYnV0IHdlIHNob3VsZCBwcm92aWRlCi0gICAgICAgIC8vIGdldHRlcnMvc2V0dGVycyB0byBhbGxvdyB0aGUgZGVmYXVsdCB0byBiZSBjb250cm9sbGVkCi0gICAgICAgIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChudWxsKTsKLSAgICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKCIiKTsKLQotICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBDcmVhdGVzIHRoZSBDb21wb25lbnQgVGFibGVWaWV3ZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBvbmVudFRhYmxlVmlld2VyKENvbXBvc2l0ZSBiYXNlKSB7Ci0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyID0gY3JlYXRlRmlsdGVyTWVudUFuZFRhYmxlVmlld2VyKGJhc2UpOyAgICAKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAJLy8gQ2hhbmdpbmcgdGhlIHRleHQgZm9yIHRoZSBjb21wb25lbnQgc2VsZWN0ZWQgYW5kIGRpc3BsYXkgaXRzIHNvdXJjZQotICAgICAgICAJLy8gZmlsZSBpbiB0aGUgYm94IHVuZGVyIHRoZSB0YWJsZSB2aWV3ZXIKLSAgICAgICAgICAKLSAgICAgICAgCUlDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKTsgICAgICAgIAkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQkJcnVuKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIC8vIGJ1ZyAxNDQ1NDggLSB1bm5lY2Vzc2FyeQotICAgICAgICAvLyBydW4oKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJ1bigpIHsKLQkJCQkvLyByZXN0b3JlcyB0aGUgdGV4dCBvZiBwcmV2aW91cyBpdGVtCi0JCQkJaWYgKHByZXZJdGVtICE9IG51bGwgJiYgIXByZXZJdGVtLmlzRGlzcG9zZWQoKSl7Ci0JCQkJCXByZXZJdGVtLnNldFRleHQocHJldkl0ZW1UZXh0KTsKLQkJCQl9Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBjb21wb25lbnQgPSBpdGVtc1swXS5nZXREYXRhKCk7Ci0KLQkJCQlwcmV2SXRlbSA9IGl0ZW1zWzBdOwotCQkJCXByZXZJdGVtVGV4dCA9IGl0ZW1zWzBdLmdldFRleHQoKTsKLQotCQkJCS8vIGFkZCBjbGFyaWZpY2F0aW9uIGZvciB0aGUgZmlyc3Qgc2VsZWN0ZWQgaXRlbQotCQkJCWl0ZW1zWzBdLnNldFRleHQoICBkZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50KSArICIgLSAiICsgCi0gICAgCQkJCQlkZXNjcmlwdGlvblByb3ZpZGVyLmdldFF1YWxpZmllcihjb21wb25lbnQpKTsKLQotCQkJCXVwZGF0ZUxvY2F0aW9uVmlldyhjb21wb25lbnQsIGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotCQkJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGNvbXBvbmVudFRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJb2tQcmVzc2VkKCk7Ci0JCQl9Ci0gICAgICAgIAkKLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBjcmVhdGVGaWx0ZXJNZW51QW5kVGFibGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXApIHsKLSAgICAJQ29tcG9zaXRlIGxhYmVsQW5kRmlsdGVyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0gICAgCWxhYmVsQW5kRmlsdGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsgbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLSAgICAJbGFiZWxBbmRGaWx0ZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCQotICAgICAgICBMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsQW5kRmlsdGVyLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIHRhYmxlTGFiZWwuc2V0VGV4dChjb25maWd1cmF0aW9uLmdldExpc3RMYWJlbFRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBmaWx0ZXJUb29sQmFyID0gbmV3IFRvb2xCYXIobGFiZWxBbmRGaWx0ZXIsU1dULkZMQVQpOwotICAgICAgICBjb25maWd1cmF0aW9uLmNyZWF0ZVRvb2xCYXJJdGVtcyhmaWx0ZXJUb29sQmFyKTsKLQotICAgICAgICBUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuZXcgVGFibGUobGFiZWxBbmRGaWx0ZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKSk7Ci0gICAgICAgIENvbnRyb2wgVGFibGVXaWRnZXQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIFRhYmxlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICAgIHJldHVybiB0YWJsZVZpZXdlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvY2F0aW9uVmlldyhPYmplY3QgY29tcG9uZW50LCBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCkgewotICAgIAlJRmlsZSBmaWxlID0gbHAuZ2V0RmlsZShjb21wb25lbnQpOwotICAgIAkKLSAgICAJaWYgKCBmaWxlID09IG51bGwgKXsKLSAgICAJCWxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgCQlsb2NhdGlvbkxhYmVsLnNldEltYWdlKG51bGwpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCVN0cmluZyBmaWxlUGF0aCA9ICIiOwotICAgIAlmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAvL2xvY2F0aW9uVmlldy5yZWRyYXcoKTsKLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0VGV4dChmaWxlUGF0aCk7Ci0gICAgICAgIGxvY2F0aW9uTGFiZWwuc2V0SW1hZ2UobHAuZ2V0RmlsZUljb24oY29tcG9uZW50KSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2VkIGZpbHRlciB0ZXh0IGZvciB0aGUgVGV4dCBmaWVsZC4gIEluc2VydHMgYSAiLiIKLSAgICAgKiBiZWZvcmUgZWFjaCBzdXBwb3J0ZWQgbWV0YS1jaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzRmlsdGVyU3RyaW5nKHRleHRGaWx0ZXIuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHN1cHBvcnRlZCBtZXRhY2hhcmFjdGVycyBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIHN0cmluZywgd2UgbmVlZCB0bwotICAgICAqIGluc2VydCBhICIuIiBiZWZvcmUgZWFjaCBtZXRhY2hhcmFjdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NGaWx0ZXJTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKSB7Ci0gICAgICAgIGlmICghKGlucHV0U3RyaW5nLmVxdWFscygiIikpKSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmluZyA9IGluc2VydFN0cmluZygiKiIsICIuIiwgaW5wdXRTdHJpbmcpOwotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnNlcnRTdHJpbmcoIj8iLCAiLiIsIGlucHV0U3RyaW5nKTsKLSAgICAgICAgICAgIGlucHV0U3RyaW5nID0gaW5wdXRTdHJpbmcgKyAiLioiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5wdXRTdHJpbmcgPSAiLioiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBpbnNlcnQgYSAiLiIgYmVmb3JlIGVhY2ggbWV0YWNoYXJhY3RlciBpbiB0aGUKLSAgICAgKiBzZWFyY2gvZmlsdGVyIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBpbnNlcnRTdHJpbmcoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG5ld1N0cmluZywgU3RyaW5nIHN0cmluZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcpOwotCi0gICAgICAgIGludCBpbmRleCA9IHN0cmluZ0J1ZmZlci5pbmRleE9mKHRhcmdldCk7Ci0gICAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgc3RyaW5nQnVmZmVyID0gc3RyaW5nQnVmZmVyLmluc2VydChpbmRleCwgbmV3U3RyaW5nKTsKLSAgICAgICAgICAgIGluZGV4ID0gc3RyaW5nQnVmZmVyLmluZGV4T2YodGFyZ2V0LCBpbmRleCArIG5ld1N0cmluZy5sZW5ndGgoKSArIHRhcmdldC5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotCi0KLSAgICAvKgotICAgICAqIExpc3RlbnMgdG8gY2hhbmdlcyBtYWRlIGluIHRoZSB0ZXh0IGZpbHRlciB3aWRnZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFRleHRGaWx0ZXJNb2RpZnlBZGFwdGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgIGlmIChlLndpZGdldCA9PSB0ZXh0RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbGF5ZWRFdmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudC5DQU5DRUwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbGF5ZWRFdmVudCA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS50aW1lckV4ZWMoNDAwLCBkZWxheWVkRXZlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UT0RPLi4uIGRvIHdlIHJlYWxseSBuZWVkIG9uZSBpbnN0YW5jZT8KLSAgICBwcml2YXRlIERlbGF5ZWRFdmVudCBkZWxheWVkRXZlbnQ7Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgY29tcG9uZW50IFRhYmxlVmlld2VyIHdoZW4gdGhlIHRleHQgZmlsdGVyIGlzIG1vZGlmaWVkLgotICAgICAqIFVzZSBhIERlbGF5ZWRFdmVudCBzbyB3ZSBkb24ndCB1cGRhdGUgb24gZXZlcnkga2V5c3Ryb2tlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBDQU5DRUwgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAoIUNBTkNFTCkgewotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IGZpcnN0IG1hdGNoCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSBpdGVtID0gY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpWzBdOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbXNbXSA9IG5ldyBUYWJsZUl0ZW1bMV07Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zWzBdID0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcXVhbGlmaWVyTGlzdAotICAgICAgICAgICAgICAgIC8vSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tcG9uZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAuLi4gbWFuYWdlIHF1YWxpZmllcnMKLSAgICAgICAgICAgICAgICAvL0xpc3QgcXVhbGlmaWVycyA9IHNlYXJjaExpc3RQcm92aWRlci5nZXRRdWFsaWZpZXJzKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlUXVhbGlmaWVyTGlzdChxdWFsaWZpZXJzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cGRhdGVDYW5GaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIENvbXBvbmVudExpc3QgaW1wbGVtZW50cyBJQ29tcG9uZW50TGlzdCB7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yIG9iamVjdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRDaGFuZ2VDb3VudGVyID0gMDsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGxhc3RVcGRhdGVUaW1lID0gMDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotICAgICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZChvKTsKLSAgICAgICAgICAgIGN1cnJlbnRDaGFuZ2VDb3VudGVyKys7Ci0gICAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0VmVjdG9yLmFkZEFsbChjb2xsZWN0aW9uKTsKLSAgICAgICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciArPSBjb2xsZWN0aW9uLnNpemUoKTsKLSAgICAgICAgICBkb1ZpZXdlclVwZGF0ZSgpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRvVmlld2VyVXBkYXRlKCkgewotICAgICAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2Ugc2hvdWxkIGFsc28gYWRkIGEgdGltZXIgY29uZGl0aW9uPz8KLSAgICAgICAgICAvLyAgaWYgKGN1cnJlbnRDaGFuZ2VDb3VudGVyID49IDEwKSB7Ci0gICAgICAgICAgLy8gICAgICBjdXJyZW50Q2hhbmdlQ291bnRlciA9IDA7Ci0gICAgICAgICAgLy8gICAgICBmaXJlVXBkYXRlTGlzdCh0aGlzKTsKLSAgICAgICAgICAvLyAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIGNzOiB5ZXAgSSB0aGluayB3ZSByZWFsbHkgZG8gbmVlZCB0byB1c2UgYSB0aW1lIGJhc2VkIGFwcHJvYWNoCi0gICAgICAgICAgLy8gICAgICAgICAgCi0gICAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VXBkYXRlVGltZSA+IDMwMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgbGFzdFVwZGF0ZVRpbWUgPSB0aW1lOwotICAgICAgICAgICAgIGZpcmVVcGRhdGVMaXN0KENvbXBvbmVudExpc3QudGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3Iuc3ViTGlzdChzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RWZWN0b3IuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8vIHRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGZyb20gYSBub24tdWkgdGhyZWFkIHNvIG5lZWRzIHRvIGNhbGwKLSAgICAvLyBhc3luY0V4ZWMgdG8gZW5zdXJlIHRoZSBVSSB1cGRhdGVzIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVXBkYXRlTGlzdChmaW5hbCBDb21wb25lbnRMaXN0IGxpc3QpIHsgICAgCi0gICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBvYmplY3RzCi0gICAgICAgICAgICAgICAgaW50IGdyb3dpbmdMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGludCBjdXJyZW50U2l6ZSA9IG1hc3RlckNvbXBvbmVudExpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChncm93aW5nTGlzdFNpemUgPiBjdXJyZW50U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmFkZEFsbChsaXN0LnN1Ykxpc3QoY3VycmVudFNpemUsIGdyb3dpbmdMaXN0U2l6ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUZvckZpbHRlckNoYW5nZSgpCi0gICAgewotICAgICAgcG9wdWxhdGVNYXN0ZXJDb21wb25lbnRMaXN0KG51bGwpOwotICAgICAgcmVmcmVzaFRhYmxlVmlld2VyKGdldFByb2Nlc3NlZEZpbHRlclN0cmluZygpKTsKLSAgICB9ICAKLSAgICAKLSAgICAvKgotICAgICAqIFBvcHVsYXRlIHRoZSBDb21wb25lbnQgVHJlZVZpZXdlciB3aXRoIGl0ZW1zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdChmaW5hbCBTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkgewotICAgICAgICBtYXN0ZXJDb21wb25lbnRMaXN0LmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QgPSBuZXcgQ29tcG9uZW50TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETyAoY3MpIGl0IGRvZXNuJ3Qgc2VlbSB0byBtYWtlIHNlbm5zZSB0byBkbyBhbnkgb2YgdGhlIHdvcmsgb24gdGhlIFVJIHRocmVhZAotICAgICAgICAvLyBJJ3ZlIGNoYW5nZSB0aGUgYmVoYXZpb3VyIGhlcmUgdG8gZG8gYWxsIG9mIHRoZSB3b3JrIGluIHRoZSBiYWNrZ3JvdW5kCi0gICAgICAgIC8vCi0gICAgICAgIC8vc2VhcmNoTGlzdFByb3ZpZGVyLl9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhjb21wb25lbnRMaXN0LCAwKTsgICAgICAgIAotICAgICAgICBKb2Igam9iID0gbmV3IEpvYigicmVhZCBjb21wb25lbnRzIikgewotICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIC8vIHRoaXMgc3R1ZmYgZ2V0cyBleGVjdXRlZCBvbiBhIG5vbi1VSSB0aHJlYWQKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgbG9uZyB0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlYXJjaExpc3RQcm92aWRlcigpLnBvcHVsYXRlQ29tcG9uZW50TGlzdChjb21wb25lbnRMaXN0LCBzZWFyY2hTY29wZSwgbnVsbCk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gRG8gYSBmaW5hbCB1cGRhdGUgb2Ygb3VyIElucHV0IGZvciB0aGUgY29tcG9uZW50IHRyZWUgdmlld2VyLgotICAgICAgICAgICAgICBmaXJlVXBkYXRlTGlzdChjb21wb25lbnRMaXN0KTsKLSAgICAgICAgICAgICAgbG9uZyB0aW1lMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWU9IiArICh0aW1lMiAtIHRpbWUxKSArICIgaXRlbXM9ICIgKyBtYXN0ZXJDb21wb25lbnRMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hUYWJsZVZpZXdlcihTdHJpbmcgZmlsdGVyVGV4dCkgewotICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmNsZWFyKCk7Ci0gICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldERlc2NyaXB0aW9uUHJvdmlkZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIFBhdHRlcm4gcmVnZXggPSBQYXR0ZXJuLmNvbXBpbGUoZmlsdGVyVGV4dCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFzdGVyQ29tcG9uZW50TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBpdGVtU3RyaW5nID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGl0ZW0pOyAgICAgICAgICAgCi0gICAgICAgICAgICBNYXRjaGVyIG0gPSByZWdleC5tYXRjaGVyKGl0ZW1TdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICBpZiAoaXRlbVN0cmluZy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoZmlsdGVyVGV4dCkgfHwgbS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29tcG9uZW50VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBkZWNvcmF0ZVRhYmxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvb2tpbmcgYXQgZWFjaCBpdGVtIGluIHRoZSBUYWJsZS4gSWYgdGhlcmUgYXJlIG90aGVyIGl0ZW1zIHdpdGggc2FtZSBuYW1lCi0gICAgICogLCB0aGVuIGFkZCBleHRyYSBpbmZvIChuYW1lc3BhY2UsIGZpbGUpIGludG8gdGhlIHRoZSB0ZXh0IGxhYmVsIG9mIGFsbCB0aGVzZQotICAgICAqIGR1cGxpY2F0ZWQgaXRlbXMuCi0gICAgICogLSBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZXZlcnl0aW1lIHRoZSBUYWJsZSB2aWV3ZXIgaXMgcmVmcmVzaGVkLi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVRhYmxlKCl7Ci0gICAgCVRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmNsZWFyKCk7Ci0gICAgCQotICAgIAlJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBscCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotCi0gICAgCS8vIGluaXQgdGhlIG5hbWUtZHVwbGljYXRlcyBjb3VudGVyCi0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50VGFibGVWaWV3ZXJJbnB1dC5zaXplKCk7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBjb21wb25lbnRUYWJsZVZpZXdlcklucHV0LmdldChpKTsKLSAgICAJCVN0cmluZyBuYW1lID0gbHAuZ2V0TmFtZShjdXJyZW50SXRlbSk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChuYW1lKTsKLQkJCWlmICggY291bnQgPT0gbnVsbCl7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KG5hbWUsIG5ldyBJbnRlZ2VyKDEpKTsKLSAgICAJCX0KLSAgICAJCWVsc2V7Ci0gICAgCQkJVGFibGVEZWNvcmF0b3JUcmFja2luZ1Rvb2wucHV0KAotICAgIAkJCQkJbmFtZSwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSArIDEpKTsKLSAgICAJCX0KLSAgICAJfQotCi0gICAgCS8vIE1vZGlmeS9kZWNvcmF0ZSB0aG9zZSBpdGVtcyBpbiB0aGUgVGFibGUgdGhhdCBoYXZlIGR1cGxpY2F0ZWQgbmFtZQotICAgIAlUYWJsZUl0ZW1bXSBpdGVtcyA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAJZm9yIChpbnQgaSA9MCA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyl7Ci0gICAgCQlPYmplY3QgY3VycmVudEl0ZW0gPSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0gICAgCQlJbnRlZ2VyIGNvdW50ID0gKEludGVnZXIpIFRhYmxlRGVjb3JhdG9yVHJhY2tpbmdUb29sLmdldChscC5nZXROYW1lKGN1cnJlbnRJdGVtKSk7Ci0gICAgCQlpZiAoIGNvdW50ICE9IG51bGwgJiYgY291bnQuaW50VmFsdWUoKSA+IDEpewkKLSAgICAJCQlpdGVtc1tpXS5zZXRUZXh0KGxwLmdldE5hbWUoY3VycmVudEl0ZW0pICsgIiAtICIgKyAKLSAgICAJCQkJCWxwLmdldFF1YWxpZmllcihjdXJyZW50SXRlbSkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotCi0gICAgCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgQ29tcG9uZW50VHJlZVZpZXdlciwgZW5hYmxlIE9LCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FuRmluaXNoKCkgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21wb25lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgY29tcG9uZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoY29tcG9uZW50U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oKTsKLSAgICAgICAgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgICAgICByZXN1bHQuc2V0TmFtZShjb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmdldE5hbWUoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWFsaWZpZXIoY29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5nZXRRdWFsaWZpZXIoY29tcG9uZW50U2VsZWN0aW9uKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRGaWxlKGNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RmlsZShjb21wb25lbnRTZWxlY3Rpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb21wb25lbnRTZWxlY3Rpb24pOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzExMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbgotewotICBwcml2YXRlIFN0cmluZyBmaWx0ZXJMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByaXZhdGUgU3RyaW5nIGxpc3RMYWJlbFRleHQgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UUzsKLSAgcHJpdmF0ZSBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlcjsgCi0gIHByaXZhdGUgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlcjsKLSAgcHJpdmF0ZSBJTmV3Q29tcG9uZW50SGFuZGxlciBuZXdDb21wb25lbnRIYW5kbGVyOwotICBwcml2YXRlIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nOwotCi0gIHB1YmxpYyB2b2lkIGluaXQoQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVdpZGdldEF0VG9wKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgICAgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRBYm92ZVF1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVXaWRnZXRCZWxvd1F1YWxpZmllckJveChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVUb29sQmFySXRlbXMoVG9vbEJhciB0b29sQmFyKQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblByb3ZpZGVyKElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uUHJvdmlkZXIgPSBkZXNjcmlwdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIgZ2V0U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBzZWFyY2hMaXN0UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWFyY2hMaXN0UHJvdmlkZXIoSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlYXJjaExpc3RQcm92aWRlciA9IHNlYXJjaExpc3RQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGdldERpYWxvZygpCi0gIHsKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHVibGljIElOZXdDb21wb25lbnRIYW5kbGVyIGdldE5ld0NvbXBvbmVudEhhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ld0NvbXBvbmVudEhhbmRsZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROZXdDb21wb25lbnRIYW5kbGVyKElOZXdDb21wb25lbnRIYW5kbGVyIG5ld0NvbXBvbmVudEhhbmRsZXIpCi0gIHsKLSAgICB0aGlzLm5ld0NvbXBvbmVudEhhbmRsZXIgPSBuZXdDb21wb25lbnRIYW5kbGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckxhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldExpc3RMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGxpc3RMYWJlbFRleHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJMYWJlbFRleHQoU3RyaW5nIGZpbHRlckxhYmVsVGV4dCkKLSAgewotICAgIHRoaXMuZmlsdGVyTGFiZWxUZXh0ID0gZmlsdGVyTGFiZWxUZXh0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGlzdExhYmVsVGV4dChTdHJpbmcgbGlzdExhYmVsVGV4dCkKLSAgewotICAgIHRoaXMubGlzdExhYmVsVGV4dCA9IGxpc3RMYWJlbFRleHQ7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9Db21wb25lbnRTcGVjaWZpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYWJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0NvbXBvbmVudFNwZWNpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vLyBUT0RPLi4gdXNlIFF1YWxpZmllZE5hbWUgY29uc2lzdGVudGx5IGZvciBuYW1lIGFuZCBtZXRhTmFtZQotLy8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRTcGVjaWZpY2F0aW9uCi17Ci0gIFN0cmluZyBxdWFsaWZpZXI7Ci0gIFN0cmluZyBuYW1lOwotICBJRmlsZSBmaWxlOwotICBPYmplY3Qgb2JqZWN0OwotICBib29sZWFuIGlzTmV3OwotICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lOwotICAKLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24oKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgcXVhbGlmaWVyLCBTdHJpbmcgbmFtZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpCi0gIHsKLSAgICByZXR1cm4gcXVhbGlmaWVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpCi0gIHsKLSAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOZXcoKQotICB7Ci0gICAgcmV0dXJuIGlzTmV3OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmV3KGJvb2xlYW4gaXNOZXcpCi0gIHsKLSAgICB0aGlzLmlzTmV3ID0gaXNOZXc7Ci0gIH0KLQotICBwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRNZXRhTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbWV0YU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRhTmFtZShRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdGhpcy5tZXRhTmFtZSA9IG1ldGFOYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODlmZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLSAgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBTdHJpbmcgZ2V0UXVhbGlmaWVyKE9iamVjdCBjb21wb25lbnQpOwotCi0gIFN0cmluZyBnZXROYW1lKE9iamVjdCBjb21wb25lbnQpOwotCi0gIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCk7Ci0gIAotICBJbWFnZSBnZXRGaWxlSWNvbihPYmplY3QgY29tcG9uZW50KTsKLQotICBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lDb21wb25lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTI0OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wb25lbnRMaXN0IHsKLSAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgbyk7Ci0gICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTc5YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcgotewotICB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL0lOZXdDb21wb25lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTA5M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9JTmV3Q29tcG9uZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdDb21wb25lbnRIYW5kbGVyCi17Ci0gIHZvaWQgb3Blbk5ld0NvbXBvbmVudERpYWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9zZWFyY2gvZGlhbG9ncy9TY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmN2Q4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Njb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Qcm9qZWN0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtpbmdTZXRTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtzcGFjZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZwotewotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX05BTUVfRklFTERfVElUTEUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUU7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTElTVF9USVRMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NQVRDSElOR19DT01QT05FTlRTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9TUEVDSUZJRURfRklMRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZJRURfRklMRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QgPSBNZXNzYWdlcy5fVUlfTEFCRUxfRU5DTE9TSU5HX1BST0pFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1dPUktTUEFDRSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfV09SS0lOR19TRVRTID0gTWVzc2FnZXMuX1VJX0xBQkVMX1dPUktJTkdfU0VUUzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWFyY2hTY29wZSA9IFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0U7Ci0gIHByb3RlY3RlZCBCdXR0b24gY2hvb3NlQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uWzRdOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlckxhYmVsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RUaXRsZTsKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgc2VsZWN0V29ya2luZ1NldHNHcm91cDsKLSAgcHJvdGVjdGVkIFRleHQgd29ya2luZ1NldHNUZXh0OwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdmFsdWVGb3JXb3JraW5nU2V0c1RleHQ7Ci0gIAotICAvLyB3b3JraW5nIHNldHMgY3VycmVudGx5IGNob3NlbiBieSB0aGUgdXNlcgotICBwcml2YXRlIHN0YXRpYyBJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzOwotCi0gIHB1YmxpYyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUsIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLSAgICBzdXBlcihzaGVsbCwgZGlhbG9nVGl0bGUsIGNvbmZpZ3VyYXRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJMYWJlbChTdHJpbmcgZmlsdGVyTGFiZWwpCi0gIHsKLSAgICB0aGlzLmZpbHRlckxhYmVsID0gZmlsdGVyTGFiZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExpc3RUaXRsZShTdHJpbmcgbGlzdFRpdGxlKQotICB7Ci0gICAgdGhpcy5saXN0VGl0bGUgPSBsaXN0VGl0bGU7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vc3VwZXIuc2V0RmlsdGVyTGFiZWwoZmlsdGVyTGFiZWwgIT0gbnVsbCA/IGZpbHRlckxhYmVsIDogREVGQVVMVF9OQU1FX0ZJRUxEX1RJVExFKTsKLSAgICAvL3NldExpc3RMYWJlbFRleHQobGlzdFRpdGxlICE9IG51bGwgPyBsaXN0VGl0bGUgOiBERUZBVUxUX0xJU1RfVElUTEUpOwotICAgIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAvLyBXZSB1c2UgdGhlIENvbXBvc2l0ZSB0b3BDb21wb3NpdGUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgd2lkZ2V0cwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGJvdHRvbUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChib3R0b21Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgLy8gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgLy8gZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMjsKLSAgICBncm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0VBUkNIX1NDT1BFKTsKLSAgICBTY29wZUNoYW5nZUxpc3RlbmVyIHNjb3BlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgU2NvcGVDaGFuZ2VMaXN0ZW5lcigpOwotICAgIHJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblswXS5zZXRUZXh0KFNDT1BFX1dPUktTUEFDRSk7Ci0gICAgcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotICAgIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoU0NPUEVfRU5DTE9TSU5HX1BST0pFQ1QpOwotICAgIHJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblsyXS5zZXRUZXh0KFNDT1BFX0NVUlJFTlRfUkVTT1VSQ0UpOwotICAgIHJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLSAgICByYWRpb0J1dHRvblszXS5zZXRUZXh0KFNDT1BFX1dPUktJTkdfU0VUUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmFkaW9CdXR0b25baV0uZ2V0VGV4dCgpLmVxdWFscyhjdXJyZW50U2VhcmNoU2NvcGUpKQotICAgICAgewotICAgICAgICByYWRpb0J1dHRvbltpXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB9Ci0gICAgICByYWRpb0J1dHRvbltpXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzY29wZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cCA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBzZWxlY3RXb3JraW5nU2V0c0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotICAgIEdyaWRMYXlvdXQgd29ya2luZ1NldEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIHdvcmtpbmdTZXRHcm91cExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgd29ya2luZ1NldEdyb3VwTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc2VsZWN0V29ya2luZ1NldHNHcm91cC5zZXRMYXlvdXQod29ya2luZ1NldEdyb3VwTGF5b3V0KTsKLSAgICAKLSAgICB3b3JraW5nU2V0c1RleHQgPSBuZXcgVGV4dChzZWxlY3RXb3JraW5nU2V0c0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd29ya2luZ1NldHNUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGlmICh2YWx1ZUZvcldvcmtpbmdTZXRzVGV4dCAhPSBudWxsICkKLSAgICAJd29ya2luZ1NldHNUZXh0LnNldFRleHQodmFsdWVGb3JXb3JraW5nU2V0c1RleHQpOwotICAgIAotICAgIGNob29zZUJ1dHRvbiA9IG5ldyBCdXR0b24oc2VsZWN0V29ya2luZ1NldHNHcm91cCwgU1dULk5PTkUpOwotICAgIGNob29zZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DSE9PU0UpOwotICAgIGNob29zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHRydWUpOwotCQkJaWYgKCBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyl7Ci0JCQkJd29ya2luZ1NldHMgPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgPSAiIjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkJdmFsdWVGb3JXb3JraW5nU2V0c1RleHQgKz0gd29ya2luZ1NldHNbaV0uZ2V0TGFiZWwoKTsKLQkJCQkJLy8gaWYgbm90IHRoZSBsYXN0IGl0ZW0sIHdlIGFkZCBhIGNvbW1hCi0JCQkJCWlmICggaSAhPSB3b3JraW5nU2V0cy5sZW5ndGggLSAxKSAKLQkJCQkJCXZhbHVlRm9yV29ya2luZ1NldHNUZXh0ICs9ICIsICI7Ci0JCQkJfQotCQkJCXdvcmtpbmdTZXRzVGV4dC5zZXRUZXh0KHZhbHVlRm9yV29ya2luZ1NldHNUZXh0KTsKLQkJCX0KLQkJCS8vIFNldCB3b3JraW5nIHNldHMgcmFkaW8gYnV0dG9uIGVuYWJsZWQsIGRpc2FibGUgb3RoZXIgYnV0dG9ucwotCQkJcmFkaW9CdXR0b25bMl0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXJhZGlvQnV0dG9uWzFdLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlyYWRpb0J1dHRvblswXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJcmFkaW9CdXR0b25bM10uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCQlzY29wZUNoYW5nZUhhbmRsZXIocmFkaW9CdXR0b25bM10pOwotCQl9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcGFyZW50OwotICB9IC8qCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgc2VhcmNoIHNjb3BlLgotICAgICAqLwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoU2NvcGUoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWFyY2hTY29wZTsKLSAgfQotCi1wcml2YXRlIHZvaWQgc2NvcGVDaGFuZ2VIYW5kbGVyKEJ1dHRvbiBiKSB7CSAgCi0JICBpZiAoKGIuZ2V0U3R5bGUoKSAmIFNXVC5SQURJTykgIT0gMCkKLQkgIHsKLQkJICBjdXJyZW50U2VhcmNoU2NvcGUgPSBiLmdldFRleHQoKTsKLQkJICAKLQkJICAvLyBUT0RPIChjcykgbmVlZCB0byBkbyBzb21lIHdvcmsgdG8gbWFrZSB0aGUgZGVmYXVsdCBzZWFyY2ggc2NvcGUKLQkJICAvLyBtb3JlIHdlbGwgZGVmaW5lZCwgY3VycmVudGx5IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBwYXNzIGEgbnVsbAotCQkgIC8vIGFyZ3VtZW50IGluIHRvIHBvcHVsYXRlTWFzdGVyQ29tcG9uZW50TGlzdCBidXQgd2Ugc2hvdWxkIHByb3ZpZGUKLQkJICAvLyBnZXR0ZXJzL3NldHRlcnMgdG8gYWxsb3cgdGhlIGRlZmF1bHQgdG8gYmUgY29udHJvbGxlZCAgICAgICAgICAKLQkJICBTZWFyY2hTY29wZSBzY29wZSA9IG51bGw7Ci0JCSAgaWYgKGN1cnJlbnRTZWFyY2hTY29wZSA9PSBTQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCAmJgotCQkJCSAgY3VycmVudFJlc291cmNlICE9IG51bGwpIHsgCi0JCQkgIHNjb3BlID0gbmV3IFByb2plY3RTZWFyY2hTY29wZShjdXJyZW50UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCSAgfSAKLQkJICBlbHNlIGlmIChjdXJyZW50U2VhcmNoU2NvcGUgPT0gU0NPUEVfV09SS1NQQUNFKXsKLQkJCSAgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoY3VycmVudFNlYXJjaFNjb3BlID09IFNDT1BFX1dPUktJTkdfU0VUUyl7Ci0JCQkgIAotCQkJICAvLyBDb25zdHJ1Y3RzIHRoZSB3b3JraW5nIHNldHMgc2NvcGUgZnJvbSB0aGUgd29ya2luZyBzZXRzIHRoZSB1c2VyCi0JCQkgIC8vIHNlbGVjdGVkCi0JCQkgIFdvcmtpbmdTZXRTZWFyY2hTY29wZSB3b3JraW5nU2V0c1Njb3BlID0gbmV3IFdvcmtpbmdTZXRTZWFyY2hTY29wZSgpOwotCQkJICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtpbmdTZXRzLmxlbmd0aDsgaSsrKXsKLQkJCQkgIHdvcmtpbmdTZXRzU2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKHdvcmtpbmdTZXRzW2ldLmdldEVsZW1lbnRzKCkpOwotCQkJICB9CQkJICAKLQkJCSAgc2NvcGUgPSB3b3JraW5nU2V0c1Njb3BlOwotCQkgIH0KLQkJICAKLQkJICBwb3B1bGF0ZU1hc3RlckNvbXBvbmVudExpc3Qoc2NvcGUpOwotCQkgIHJlZnJlc2hUYWJsZVZpZXdlcihnZXRQcm9jZXNzZWRGaWx0ZXJTdHJpbmcoKSk7Ci0JCSAgLy8gU2VsZWN0IHRoZSBmaXJzdCBtYXRjaGluZyBjb21wb25lbnQuIFRob3VnaCB3ZSBzaG91bGQgYmUKLQkJICAvLyBzbWFydGVyIGhlcmUKLQkJICAvLyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXJlIHdhcyBhIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHNjb3BlCi0JCSAgLy8gc3dpdGNoIChhbmQgaWYKLQkJICAvLyB0aGUgY29tcG9uZW50IGlzIHN0aWxsIGF2YWlsYWJsZS4KLQkJICBUYWJsZSB0YWJsZSA9IGNvbXBvbmVudFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOwotCQkgIGlmIChpdGVtcy5sZW5ndGggPiAwKQotCQkgIHsKLQkJCSAgVGFibGVJdGVtIHNlbGVjdFtdID0gbmV3IFRhYmxlSXRlbVsxXTsKLQkJCSAgc2VsZWN0WzBdID0gaXRlbXNbMF07Ci0JCQkgIHRhYmxlLnNldFNlbGVjdGlvbihzZWxlY3QpOwotCQkgIH0KLQkJICB1cGRhdGVDYW5GaW5pc2goKTsKLQkgIH0KLSAgfQotCi1wcml2YXRlIGNsYXNzIFNjb3BlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCBpbnN0YW5jZW9mIEJ1dHRvbikgICAgICAgCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgQnV0dG9uIGIgPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgaWYgKGIuZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIHNjb3BlQ2hhbmdlSGFuZGxlcihiKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRDdXJyZW50UmVzb3VyY2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRSZXNvdXJjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRSZXNvdXJjZShJUmVzb3VyY2UgY3VycmVudFJlc291cmNlKQotICB7Ci0gICAgdGhpcy5jdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UmVzb3VyY2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3NlYXJjaC9kaWFsb2dzL1Rlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4M2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvc2VhcmNoL2RpYWxvZ3MvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLQotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZQotewotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoIkxpc3Q6Iik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dCgiRmlsdGVyOiIpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihuZXcgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoImZvbyIpKTsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsICJ0ZXN0IiwgY29uZmlndXJhdGlvbik7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICBkaWFsb2cub3BlbigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLSAgY2xhc3MgQmFzZUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLSAgewotICAgIFN0cmluZyBwcmVmaXg7Ci0KLSAgICBCYXNlQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcihTdHJpbmcgcHJlZml4KQotICAgIHsKLSAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBjb21wb25lbnQ7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBnZXROYW1lKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFN0cmluZykgY29tcG9uZW50KS5zdGFydHNXaXRoKHByZWZpeCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0JcHVibGljIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotICB9Ci0gIAotICBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyKCkKLSAgewotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGVsbG8hIik7Ci0gICAgICBsaXN0LmFkZCgiZm9vOiIgKyAiSGV5ISIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIkhvdy1hcmUteW91PyIpOwotICAgICAgbGlzdC5hZGQoImZvbzoiICsgIldoYXQtaXMtdGhhdC1zbWVsbD8iKTsKLSAgICB9Ci0gIH07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTEzYmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCQotLy8JIFNlbGVjdFNpbmdsZUZpbGVQYWdlIGFuZCBTZWxlY3RNdWx0aUZpbGVQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NPVVJDRV9GSUxFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VMRUNURURfRklMRVM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUE9QVVBfRVhQQU5EX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUE9QVVBfQ09MTEFQU0VfQUxMOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTVBPUlRfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQOwotCQotLy8JIFNlbGVjdE11bHRpRmlsZVBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREX0JVVFRPTl9UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0JVVFRPTl9UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVNT1ZFX0FMTF9CVVRUT047Ci0KLS8vCSBTZWxlY3RKYXZhUHJvamVjdFZpZXcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ0hPT1NFX0ZPTERFUjsKLQotLy8JIFNlbGVjdEphdmFQcm9qZWN0RGlhbG9nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0ZPTERFUl9TRUxFQ1RJT047Ci0KLS8vCSBUZXh0Vmlld2VyT3BlcmF0aW9uQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ09QWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BBU1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRURPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1NFTEVDVF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfU0hJRlRfTEVGVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TSElGVF9SSUdIVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9TVFJJUF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfVU5ETzsKLQotLy8JIFNvdXJjZVZpZXdlckdvdG9MaW5lQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfR09UT19MSU5FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HT1RPX0xJTkVfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HT1RPX0xJTkVfRElBTE9HX1RFWFQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9DSEFOR0VEX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0RFTEVURURfU0FWRV9DSEFOR0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GSUxFX0RFTEVURURfRURJVE9SX0NMT1NFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRV9DSEFOR0VEX0xPQURfQ0hBTkdFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0FWRV9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NMT1NFX0JVVFRPTjsKLQotCi0vLwkgWFNMIFByZWZlcmVyZW5jZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1NFTEVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMVF9TVFlMRVNIRUVUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xUX1RSQU5TRk9STTsKLQotLy8JIFhTTCBEZWJ1ZyBQcmVmZXJlcmVuY2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX1NFTEVDVF9MQVVOQ0hFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWFNMX0RFQlVHX0xPQ0FMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfREVCVUdfUkVNT1RFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfVElMRV9FRElUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9ERUJVR19BTkRfVFJBTlNGT1JNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9YU0xfQ09OVEVYVF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1hTTF9DT05URVhUOwotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT1ZFUlJJREVfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSkFWQV9FWElTVF9GSUxFMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSkFWQV9FWElTVF9GSUxFMjsKLQkgICAgICAKLS8vCSBzb21lIG9wdGlvbnMgc3RyaW5ncyBjb21tb24gdG8gc2V2ZXJhbCBwbHVnaW5zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0NSRUFUSU5HX0ZJTEVfU0hPUlRfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfQ1JFQVRJTkdfRklMRV9MT05HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BBUkVOVF9GT0xERVJfSVNfUkVBRF9PTkxZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VTktOT1dOX0VSUk9SX1dJVEhfSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVU5LTk9XTl9FUlJPUjsKLQotLy8JIHVzYWdlIC0gdGhpcyBsYWJlbCBpcyBmb2xsb3dlZCBieSB0d28gcmFkaW8gYnV0dG9uIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGxvY2F0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1VSTDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01QT05FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9RVUFMSUZJRVI7Ci0KLS8vCS0gY29tcG9uZW50IHNlbGVjdGlvbiBkaWFsb2dzIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01QT05FTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUFUQ0hJTkdfQ09NUE9ORU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGSUVEX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOQ0xPU0lOR19QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NVUlJFTlRfUkVTT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFQVJDSF9TQ09QRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFSUk9XX1NFQVJDSF9TQ09QRV9SRVNPVVJDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9XT1JLSU5HX1NFVFM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERUNMQVJBVElPTl9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ0hPT1NFOwotCi0KLQotCi0KLQotCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkhCi0JISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0JISAgUmFuZ2UgZm9yIGIyYmd1aSBtZXNzYWdlSURzOiBJV0FYMTIwMSAtIElXQVgxNDAwCi0JIQotCSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1RIRV9DT05UQUlORVJfTkFNRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9MT0NBTF9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTk9UX0pBVkFfUFJPSkVDVDsKLQotLy8JIE5PVEUgVE8gVFJBTlNMQVRPUjogdGhpcyBlcnJvciBtZXNzYWdlIHRleHQgaXMgZm9sbG93ZWQgYnkgYSBtZXNzYWdlIGZyb20gYW5vdGhlciBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5WQUxJRF9KQVZBX1BBQ0tBR0U7Ci0KLS8vCSBOT1RFIFRPIFRSQU5TTEFUT1I6IChfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTiArIHN0cmluZyArIF9VSV9MQUJFTF9PUiArIHN0cmluZykgb3IgKF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0NPTlRBSU5FUl9OT1RfSkFWQV9CVUlMRFBBVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1VTRV9QUk9KRUNUX0pBVkFfU09VUkNFX0ZPTERFUjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9ST09UX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1NBVklOR19GSUxFOwotCi0vLwkgRmlsZSBWYWxpZGF0b3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRkFJTF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRkFJTF9NRVNTQUdFOwotCi0vLwkgUHJvcGVydHlEaXJ0eUNoYW5nZUxpc3RlbmVyIGFuZCBQcm9wZXJ0eVJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfRURJVF9GQUlMX09ORV9GSUxFOwotCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnRpdGxlOwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vcF9lcnJvci50aXRsZTsKLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQub3BfZXJyb3IubWVzc2FnZTsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLm92ZXJ3cml0ZXF1ZXJ5LnRpdGxlOwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5vdmVyd3JpdGVxdWVyeS5tZXNzYWdlOwotLy8KLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2M7Ci0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLm9wX2Rlc2NfcHJvajsKLS8vCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5lcnJvci5hbHJlYWR5ZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZmMyNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBhUmVzb3VyY2VCdW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYVJlc291cmNlQnVuZGxlICE9IG51bGwpID8gYVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KQotICAgIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOyAgICAgCi0gICAgfQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIG9uZSBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxIH0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIHR3byBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikKLQl7Ci0JICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IHMxLCBzMiB9KTsKLQl9ICAgICAKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKHBsdWdpbi5nZXRCdW5kbGUoKSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlsb2coeCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmw9IG5ldyBVUkwoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotCQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpCi0gICAgewotICAgICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgICAgCi0gICAgICBpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLSAgICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBnZXRQbHVnaW5JZCgpLCBJU3RhdHVzLkVSUk9SLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBpZiAod2luZG93ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NhdmVEaXJ0eUZpbGVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTgwZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2F2ZURpcnR5RmlsZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQSBnZW5lcmljIHNhdmUgZmlsZXMgZGlhbG9nLiBUaGUgYnVsayBvZiB0aGUgY29kZSBmb3IgdGhpcyBkaWFsb2cgd2FzIHRha2VuCi0gKiBmcm9tIHRoZSBKRFQgcmVmYWN0b3Jpbmcgc3VwcG9ydCBpbgotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU2F2ZUhlbHBlci4gVGhpcyBjbGFzcyBpcwotICogYSBnb29kIGNhbmRpZGF0ZSBmb3IgcmV1c2UgYW1vdW5nIGNvbXBvbmVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlRGlydHlGaWxlc0RpYWxvZyBleHRlbmRzIExpc3REaWFsb2cKLXsKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVEaXJ0eUZpbGVzKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAvLyBUT0RPIChjcykgYWRkIHN1cHBvcnQgZm9yIHNhdmUgYXV0b21hdGljYWxseQotICAgIFNoZWxsIHNoZWxsID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotICAgIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gZ2V0RGlydHlFZGl0b3JzKCk7Ci0gICAgaWYgKGRpcnR5RWRpdG9ycy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBTYXZlRGlydHlGaWxlc0RpYWxvZyBzYXZlRGlydHlGaWxlc0RpYWxvZyA9IG5ldyBTYXZlRGlydHlGaWxlc0RpYWxvZyhzaGVsbCk7Ci0gICAgICBzYXZlRGlydHlGaWxlc0RpYWxvZy5zZXRJbnB1dChBcnJheXMuYXNMaXN0KGRpcnR5RWRpdG9ycykpOwotICAgICAgLy8gU2F2ZSBhbGwgb3BlbiBlZGl0b3JzLgotICAgICAgaWYgKHNhdmVEaXJ0eUZpbGVzRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7ICAgICAgICAKLSAgICAgICAgaW50IG51bURpcnR5RWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlydHlFZGl0b3JzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycygpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcGFnZXMubGVuZ3RoOyB4KyspCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotICAgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0gICAgICAgICAgcmVzdWx0LmFkZChlcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChJRWRpdG9yUGFydFtdKSByZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIFNhdmVEaXJ0eUZpbGVzRGlhbG9nKFNoZWxsIHBhcmVudCkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0VGl0bGUoTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcyk7Ci0gICAgc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOwotICAgIHNldExhYmVsUHJvdmlkZXIoY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpKTsKLSAgICBzZXRNZXNzYWdlKE1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmUpOwotICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikKLSAgewotICAgIENvbXBvc2l0ZSByZXN1bHQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0gICAgLy8gVE9ETy4uLiBwcm92aWRlIHByZWZlcmVuY2UgdGhhdCBzdXBwb3J0cyAnYWx3YXlzIHNhdmUnCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIAotICBwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKLSAgLyoqIAotICAgKiBBIHNwZWNpYWxpemVkIGNvbnRlbnQgcHJvdmlkZXIgdG8gc2hvdyBhIGxpc3Qgb2YgZWRpdG9yIHBhcnRzLgotICAgKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5MaXN0Q29udGVudFByb3ZpZGVyCi0gICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBhIGdlbmVyaWMgc29sdXRpb24gaXMgbWFkZSBhdmFpbGFibGUuCi0gICAqLyAgIAotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIExpc3QgZkNvbnRlbnRzOwotCi0gICAgcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KQotICAgIHsKLSAgICAgIGlmIChmQ29udGVudHMgIT0gbnVsbCAmJiBmQ29udGVudHMgPT0gaW5wdXQpCi0gICAgICAgIHJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpCi0gICAgICAgIGZDb250ZW50cyA9IChMaXN0KSBuZXdJbnB1dDsKLSAgICAgIGVsc2UKLSAgICAgICAgZkNvbnRlbnRzID0gbnVsbDsKLSAgICAgIC8vIHdlIHVzZSBhIGZpeGVkIHNldC4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiBmQ29udGVudHMgIT0gbnVsbCAmJiAhZkNvbnRlbnRzLmNvbnRhaW5zKG8pOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODFjZWJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3OwotCi0KLQotcHVibGljIGNsYXNzIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cKLXsgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFNlbGVjdFNpbmdsZUZpbGVWaWV3IHNlbGVjdFNpbmdsZUZpbGVWaWV3OyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIEltYWdlIGltYWdlOwotIAotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7ICAgCi0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICB9Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpCi0gICAgewotCSAgcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKQotCSAgewotCQlTZWxlY3RTaW5nbGVGaWxlRGlhbG9nLnRoaXMuY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOwotCSAgfQotICAgIH07ICAKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAKLSAgICAvL1RPRE8uLiBlbmFibGUgY29udGV4dCBoZWxwCi0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwgQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9TSU5HTEVfRklMRV9ESUFMT0cpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC53aWR0aEhpbnQgPSAzNTA7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDM1MDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7ICAgCi0gICAgICAgICAgICAKLSAgICBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoaXNDb21wbGV0ZSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfSAgCi0gICAgICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZSgpCi0gIHsKLSAgICBzdXBlci5jcmVhdGUoKTsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKHRydWUpOwotICAgIGltYWdlID0gV29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfRExHQkFOX1NBVkVBU19ETEcpLmNyZWF0ZUltYWdlKCk7Ci0gICAgc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb21ibyhDb21wb3NpdGUgY29tcG9zaXRlKQotICB7Ci0gIH0gCi0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7ICAKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7IAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMsIElGaWxlIFtdIGV4Y2x1ZGVkRmlsZXMpCi0gIHsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMsIGV4Y2x1ZGVkRmlsZXMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbWFnZS5kaXNwb3NlKCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5jbG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjMxZTZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgaW1wbGVtZW50cyBEcmFnQW5kRHJvcENvbW1hbmQKLXsKLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG93bmVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgZHJhZyBhbmQgZHJvcC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgdGFyZ2V0OwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgZHJhZyBhbmQgZHJvcC4KLSAgICovCi0gIHByb3RlY3RlZCBmbG9hdCBsb2NhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbG93ZXIgcmFuZ2Ugb2YgbG9jYXRpb25zIGluIHdoaWNoIHRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIHJlbWFpbnMgdW5jaGFuZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IGxvd2VyTG9jYXRpb25Cb3VuZDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgdXBwZXIgcmFuZ2Ugb2YgbG9jYXRpb25zIGluIHdoaWNoIHRoZSBlZmZlY3Qgb2YgdGhpcyBjb21tYW5kIHJlbWFpbnMgdW5jaGFuZ2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIGZsb2F0IHVwcGVyTG9jYXRpb25Cb3VuZDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcGVybWl0dGVkIG9wZXJhdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbnM7Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE9wZXJhdGlvbn0uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgZmVlZGJhY2sgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0RmVlZGJhY2t9LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBmZWVkYmFjazsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgY29sbGVjdGlvbiBvZiBkcmFnZ2VkIHNvdXJjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzb3VyY2VzOwotCi0gIHB1YmxpYyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKQotICB7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5zb3VyY2VzID0gbmV3IEFycmF5TGlzdChzb3VyY2VzKTsKLSAgICBpZiAoIWNhbkV4ZWN1dGUoKSkgCi0gICAgewotICAgICAgdGhpcy5vcGVyYXRpb24gPSBETkQuRFJPUF9OT05FOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGlzQWZ0ZXIoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXR1cm4gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0gICAgfQotICB9ICAgIAotCi0gIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uID4gMC41OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZShPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykKLSAgewotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIHRoaXMuc291cmNlcyA9IG5ldyBBcnJheUxpc3Qoc291cmNlcyk7Ci0gICAgaWYgKCFjYW5FeGVjdXRlKCkpIAotICAgIHsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gRE5ELkRST1BfTk9ORTsKLSAgICB9Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlYjQxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIERyYWdBbmREcm9wQ29tbWFuZAotewotICAvLyAgcHVibGljIERyYWdBbmREcm9wQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcyk7Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpOwotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKTsKLQotICBwdWJsaWMgaW50IGdldEZlZWRiYWNrKCk7Ci0gIAotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZShPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYTViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIERyYWdBbmREcm9wTWFuYWdlcgotewotICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NGVhZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci0KLQotLyoqCi0gKiBUaGlzIGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBieXRlIGFycmF5IHRyYW5zZmVyIHNob3J0IGNpcmN1aXRzIHRoZSB0cmFuc2ZlciBwcm9jZXNzCi0gKiBzbyB0aGF0IGEgbG9jYWwgdHJhbnNmZXIgZG9lcyBub3Qgc2VyaWFsaXplIHRoZSBvYmplY3QKLSAqIGFuZCBoZW5jZSBjYW4gYW5kIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvYmplY3QsIG5vdCBqdXN0IGEgY2xvbmUuCi0gKiBZb3Ugb25seSByZWFsbHkgbmVlZCBldmVyIGtub3cgYWJvdXQge0BsaW5rICNnZXRJbnN0YW5jZSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSwKLSAqIHNvIHRoYXQgeW91IGNhbiBpbmNsdWRlIGl0IGluIHdoZW4gYWRkaW5nIGRyYWcgc3VwcG9ydCB0byBhIHZpZXdlci4KLSAqIFNlZSB7QGxpbmsgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyfSBhbmQge0BsaW5rIFZpZXdlckRyYWdBZGFwdGVyfSBmb3IgbW9yZSBkZXRhaWxzLgotICogPHA+Ci0gKiBBcyBhbiBhZGRkZWQgZ3VhcmQsIHRoZSB0aW1lIGlzIHJlY29yZGVkIGFuZCBzZXJpYWxpemVkIGluIGphdmFUb05hdGl2ZQotICogdG8gdGhhdCBuYXZpdmUgdG8gamF2YSBjYW4gZW5zdXJlIHRoYXQgaXQncyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFsbHkgdG8gaGF2ZSBiZWVuIHRyYW5zZmVycmVkLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlcgotewotICAvKioKLSAgICogVGhpcyBpcyB0aGUgcmVnaXN0ZXIgdHJhbnNmZXIgdHlwZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gImxvY2FsLXRyYW5zZmVyLWZvcm1hdCI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIElEIHRoYXQgaXMgcmVnaXN0ZXJlZCB0byB0aGUgbmFtZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUQgPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQotICAvKioKLSAgICogVGhpcyBpcyBpbml0aWFsaXplZCBhbmQgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJbnN0YW5jZX0uCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFRyYW5zZmVyIGluc3RhbmNlOwotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRyYW5zZmVyIGFnZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPYmplY3RUcmFuc2ZlciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBPYmplY3RUcmFuc2ZlcigpOwotICAgIH0KLQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHRyYW5zZmVyIGRhdGEgd2FzIHJlY29yZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lOwotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKLQotICAvKioKLSAgICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlOyB0eXBpY2FsbHkgeW91IGdldCBvbmUgZnJvbSB7QGxpbmsgI2dldEluc3RhbmNlfS4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3RUcmFuc2ZlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIHRyYW5zZmVyIGlkcyB0aGF0IHRoaXMgYWdlbnQgc3VwcG9ydHMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBpbnRbXSB7IFRZUEVfSUQgfTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgdGhlIHRyYW5zZmVyIG5hbWVzIHRoYXQgdGhpcyBhZ2VudCBzdXBwb3J0cy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSAKLSAgewotICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBUWVBFX05BTUUgfTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY29yZHMgdGhlIG9iamVjdCBhbmQgY3VycmVudCB0aW1lIGFuZCBlbmNvZGVzIG9ubHkgdGhlIGN1cnJlbnQgdGltZSBpbnRvIHRoZSB0cmFuc2ZlciBkYXRhLgotICAgKi8KLSAgcHVibGljIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIAotICB7Ci0gICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgaWYgKHRyYW5zZmVyRGF0YSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLmphdmFUb05hdGl2ZShTdHJpbmcudmFsdWVPZihzdGFydFRpbWUpLmdldEJ5dGVzKCksIHRyYW5zZmVyRGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgZGVjb2RlcyB0aGUgdGltZSBvZiB0aGUgdHJhbnNmZXIgYW5kIHJldHVybnMgdGhlIHJlY29yZGVkIHRoZSBvYmplY3QgaWYgdGhlIHJlY29yZGVkIHRpbWUgYW5kIHRoZSBkZWNvZGVkIHRpbWUgbWF0Y2guCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSAKLSAgewotICAgIGxvbmcgc3RhcnRUaW1lICA9IExvbmcudmFsdWVPZihuZXcgU3RyaW5nKChieXRlW10pc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSkpKS5sb25nVmFsdWUoKTsKLSAgICByZXR1cm4KLSAgICAgIHRoaXMuc3RhcnRUaW1lID09IHN0YXJ0VGltZSA/Ci0gICAgICAgIG9iamVjdCA6Ci0gICAgICAgIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhYTM0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGlvbiBvZiB7QGxpbmsgRHJhZ1NvdXJjZUxpc3RlbmVyfS4KLSAqIEl0IGFsbG93cyB0aGUgc2VsZWN0aW9uIGluIGVmZmVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRyYWcgYW5kIGRyb3AgaW50ZXJhY3Rpb24gdG8gYmUgcmVjb3JkZWQsCi0gKiB3aGljaCBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgYSBkcmFnIGFuZCBkcm9wIGludGVyYWN0aW9uIHdpdGhpbiBhIHNpbmdsZSB2aWV3LgotICogVGhpcyBpcyBob3cgb25lIG9mIHRoZXNlIGFkYXB0ZXJzIGlzIHR5cGljYWxseSBob29rZWQgdXA6Ci0gKiA8cHJlPgotICogICB2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQKLSAqICAgICAoRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LLCAKLSAqICAgICAgbmV3IFRyYW5zZmVyIFtdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0sCi0gKiAgICAgIFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotICogPC9wcmU+Ci0gKiBEb2luZyBzbyBzaW1wbHkgYWxsb3dzIGEgZHJhZyBvcGVyYXRpb24gdG8gYmUgaW5pdGlhdGVkIGZyb20gdGhlIHZpZXdlcgotICogc3VjaCB0aGF0IHRoZSB2aWV3ZXIncyBzZWxlY3Rpb24gaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGRyb3AgdGFyZ2V0LgotICogU2VlIHtAbGluayBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXJ9IGFuZCB7QGxpbmsgTG9jYWxUcmFuc2Zlcn0gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotcHVibGljIGNsYXNzIFZpZXdlckRyYWdBZGFwdGVyIGltcGxlbWVudHMgRHJhZ1NvdXJjZUxpc3RlbmVyCi17Ci0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSB2aWV3ZXIgdG8gd2hpY2ggd2UgYXJlIGxpc3RlbmluZy4KLSAgICovCi0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCi0gIC8qKgotICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3Rpb24gdGhhdCBpcyBpbiBlZmZlY3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIG9wZXJhdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgVmlld2VyRHJhZ0FkYXB0ZXIoVmlld2VyIHZpZXdlcikKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICAvLyBSZW1lbWJlciB0aGUgdmlld2VyIGFuZCBsaXN0ZW4gdG8gU1dULkRyYWdEZXRlY3QgdG8gYWxlcnQgdGhlIHN0YXJ0IG9mIHRoZSBkcmFnIG9wZXJhdGlvbi4KLSAgICAvLwotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgaXMgaW5pdGlhdGVkOyBpdCByZWNvcmRzIHRoZSB7QGxpbmsgI3NlbGVjdGlvbn0gb2Yge0BsaW5rICN2aWV3ZXJ9LgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGNvbXBsZXRlZDsgaXQgZm9yZ2V0cyB0aGUge0BsaW5rICNzZWxlY3Rpb259LgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIHNlbGVjdGlvbiA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB0byB0cmFuc2ZlciB0aGUgZGF0YS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkKLSAgewotICAgIGlmIChPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpCi0gICAgewotICAgICAgZXZlbnQuZGF0YSA9IHNlbGVjdGlvbjsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkMDNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGEgZHJvcCB0YXJnZXQgbGlzdGVuZXIgCi0gKiBpcyBkZXNpZ25lZCB0byB0dXJuIGEgZHJhZyBhbmQgZHJvcCBvcGVyYXRpb24gaW50byBhIHtAbGluayBDb21tYW5kfSBiYXNlZCBvbiB0aGUgbW9kZWwgb2JqZWN0cyBvZiBhbiB7QGxpbmsgRWRpdGluZ0RvbWFpbn0KLSAqIGFuZCBjcmVhdGVkIGJ5IHtAbGluayBEcmFnQW5kRHJvcE1hbmFnZXIjY3JlYXRlfS4KLSAqIEl0IGlzIGRlc2lnbmVkIHRvIGRvIGVhcmx5IGRhdGEgdHJhbnNmZXIgc28gdGhlIHRoZSBlbmFibGVtZW50IGFuZCBmZWVkYmFjayBvZiB0aGUgZHJhZyBhbmQgZHJvcCBpbnRlcmFjdGlvbgotICogY2FuIGludGltYXRlbHkgZGVwZW5kIG9uIHRoZSBzdGF0ZSBvZiB0aGUgbW9kZWwgb2JqZWN0cyBpbnZvbGVkLgotICogPHA+Ci0gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucy4KLSAqIEFueSBjaGFuZ2UgaW4gYmVoYXZpb3VyIGlzIHR5cGljYWxseSBhY2NvbXBsaXNoZWQgYnkgb3ZlcnJpZGluZyAKLSAqIHtAbGluayBJdGVtUHJvdmlkZXJBZGFwdGVyfS5jcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQKLSAqIHRvIHJldHVybiBhIGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERyYWdBbmREcm9wQ29tbWFuZH0uCi0gKiBUaGlzIGlzIGhvdyBvbmUgdGhlc2UgYWRhcHRlcnMgaXMgdHlwaWNhbGx5IGhvb2tlZCB1cDoKLSAqIDxwcmU+Ci0gKiAgIHZpZXdlci5hZGREcm9wU3VwcG9ydAotICogICAgIChETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkssCi0gKiAgICAgIG5ldyBUcmFuc2ZlciBbXSB7IE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSwKLSAqICAgICAgRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyKHZpZXdlcikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcHJlZmVycyB0byB1c2UgYSB7QGxpbmsgT2JqZWN0VHJhbnNmZXJ9LCAKLSAqIHdoaWNoIHNob3J0LWNpcmN1aXRzIHRoZSB0cmFuc2ZlciBwcm9jZXNzIGZvciBzaW1wbGUgdHJhbnNmZXJzIHdpdGhpbiB0aGUgd29ya2JlbmNoLAotICogdGhlIG1ldGhvZCB7QGxpbmsgI2dldERyYWdTb3VyY2V9IGNhbiBiZSBvdmVycmlkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gYWxzbyBvbmx5IGhhbmRsZXMgYW4ge0BsaW5rIElTdHJ1Y3R1cmVkU2VsZWN0aW9ufSwKLSAqIGJ1dCB0aGUgbWV0aG9kIHtAbGluayAjZXh0cmFjdERyYWdTb3VyY2V9IGNhbiBiZSBvdmVycmlkZW4gdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIuCi0gKiA8cD4KLSAqIFlvdSBjYW4gY2FsbCB7QGxpbmsgI3NldEhvdmVyVGhyZXNob2xkfSB0byBzZXQgdGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIAotICogdG8gaG92ZXIgb3ZlciBhbiBpdGVtIGJlZm9yZSB7QGxpbmsgI2hvdmVyfSBpcyBjYWxsZWQ7Ci0gKiB0aGUgZGVmYXVsdCBpcyAxNTAwIG1pbGxpc2Vjb25kcy4KLSAqLwotcHVibGljIGNsYXNzIFZpZXdlckRyb3BBZGFwdGVyIGV4dGVuZHMgRHJvcFRhcmdldEFkYXB0ZXIKLXsKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhpcyBpcyBhIGRyb3AgdGFyZ2V0IGxpc3RlbmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGNvbGxlY3Rpb24gb2Ygc291cmNlIG9iamVjdHMgYmVpbmcgZHJhZ2dlZC4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIHNvdXJjZTsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgY29tbWFuZCBjcmVhdGVkIGR1cmluZyBkcmFnZ2luZyB3aGljaCBwcm92aWRlcyB0aGUgZmVlZGJhY2sgYW5kIHdpbGwgY2Fycnkgb3V0IHRoZSBhY3Rpb24gdXBvbiBjb21wbGV0aW9uLgotICAgKi8KLSAgLy8gIHByb3RlY3RlZCBDb21tYW5kIGNvbW1hbmQ7Ci0gIHByb3RlY3RlZCBEcmFnQW5kRHJvcENvbW1hbmQgY29tbWFuZDsKLSAKLSAgLyoqCi0gICAqIFRoaXMgcmVjb3JkcyB0aGUgb2JqZWN0IGZvciB3aGljaCB0aGUge0BsaW5rICNjb21tYW5kfSB3YXMgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgY29tbWFuZFRhcmdldDsKLQotICAvKioKLSAgICogVGhlIGFtb3VudCBvZiB0aW1lIHRvIGhvdmVyIG92ZXIgYSB0cmVlIGl0ZW0gYmVmb3JlIGV4cGFuZGluZyBpdAotICAgKi8KLSAgcHJvdGVjdGVkIGludCBob3ZlclRocmVzaG9sZCA9IDE1MDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBpcyB0aGUgdGltZSB0aGUgbW91c2UgZmlyc3Qgc3RhcnRlZCBob3ZlcmluZyBvdmVyIHRoZSBjdXJyZW50IGl0ZW0uCi0gICAqLwotICBwcm90ZWN0ZWQgbG9uZyBob3ZlclN0YXJ0ID0gMDsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgbW9zdCByZWNlbnQgaXRlbSBmb3IgdGhlIHtAbGluayAjaG92ZXJTdGFydH0uCi0gICAqLwotICBwcm90ZWN0ZWQgV2lkZ2V0IHByZXZpb3VzSXRlbTsKLQotICAvKioKLSAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIHRoYXQgd2FzIGluIGVmZmVjdCBiZWZvcmUgd2Ugc2V0IHRoZSBldmVudC5kZXRhaWwgaW4gaGVyZS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgb3JpZ2luYWxPcGVyYXRpb247Ci0KLSAgLyoqCi0gICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IGNvbW1hbmQuCi0gICAqLwotICBwcm90ZWN0ZWQgRHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb247Ci0KLSAgcHJvdGVjdGVkIERyYWdBbmREcm9wTWFuYWdlciBkcmFnQW5kRHJvcE1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGRvbWFpbiBhbmQgdmlld2VyLgotICAgKi8KLSAgcHVibGljIFZpZXdlckRyb3BBZGFwdGVyKFZpZXdlciB2aWV3ZXIsIERyYWdBbmREcm9wTWFuYWdlciBkcmFnQW5kRHJvcE1hbmFnZXIpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLmRyYWdBbmREcm9wTWFuYWdlciA9IGRyYWdBbmREcm9wTWFuYWdlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBmaXJzdCBlbnRlcnMgb3Igc3RhcnRzIGRyYWdnaW5nIGluIHRoZSB2aWV3ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgb3JpZ2luYWxPcGVyYXRpb24gPSBldmVudC5kZXRhaWw7Ci0gICAgaGVscGVyKGV2ZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgb3Igc3RvcHMgZHJhZ2dpbmcgaW4gdGhlIHZpZXdlcgotICAgKi8KLSAgcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIENsZWFuIHVwIHRoZSBjb21tYW5kIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAvLwotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotLy8gICAgICAgIGNvbW1hbmQuZGlzcG9zZSgpOwotICAgICAgY29tbWFuZCA9IG51bGw7Ci0gICAgICBjb21tYW5kVGFyZ2V0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCB0aGUgb3RoZXIgdmFsdWVzLgotICAgIC8vCi0gICAgcHJldmlvdXNJdGVtID0gbnVsbDsKLSAgICBob3ZlclN0YXJ0ID0gMDsKLSAgICBzb3VyY2UgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgY2hhbmdlZCBpbiBzb21lIHdheSwgdHlwaWNhbGx5IGJlY2F1c2UgdGhlIHVzZXIgY2hhbmdlcyBrZXlib2FyZCBtb2RpZmllcnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBvcmlnaW5hbE9wZXJhdGlvbiA9IGV2ZW50LmRldGFpbDsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHJlcGVhdGVkIHdoZW4gdGhlIG1vdXNlIG92ZXIgdGhlIHZpZXdlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgCi0gIHsKLSAgICBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIGp1c3QgYXMgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG92ZXIgdGhlIHZpZXdlciB0byBpbml0aWF0ZSBhIGRyb3AuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgCi0gIHsKLSAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBTV1QgdGhhdCB0aGUgdmlldyBtYXkgaGF2ZSBzY3JvbGxlZC4KLSAgICAvLyBoZWxwZXIoZXZlbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgY2FsbGVkIHRvIGluZGF0ZSB0aGF0IHRoZSBkcm9wIGFjdGlvbiBzaG91bGQgYmUgaW52b2tlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gU1dUIHRoYXQgdGhlIHZpZXcgbWF5IGhhdmUgc2Nyb2xsZWQuCi0gICAgLy8gaGVscGVyKGV2ZW50KTsKLSAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24uY3JlYXRlQ29tbWFuZCgpOwotCi0gICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLQotICAgICAgLy8gQ2xlYW4gdXAgdGhlIHN0YXRlLgotICAgICAgLy8KLSAgICAgIGNvbW1hbmQgPSBudWxsOwotICAgICAgY29tbWFuZFRhcmdldCA9IG51bGw7Ci0gICAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotICAgICAgaG92ZXJTdGFydCA9IDA7Ci0gICAgICBzb3VyY2UgPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdGhlIHNhbWUgd2F5IGZvciBlYWNoIG9mIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXJ9IG1ldGhvZHMsIGV4Y2VwdCBkdXJpbmcgbGVhdmUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBoZWxwZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVHJ5IHRvIGdldCB0aGUgc291cmNlIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICAvLwotICAgIGlmIChzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzb3VyY2UgPSBnZXREcmFnU291cmNlKGV2ZW50KTsKLSAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKGV2ZW50LmN1cnJlbnREYXRhVHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNldEN1cnJlbnREYXRhVHlwZShldmVudCk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUncyBzdGlsbCBubyBzb3VyY2UsIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB0byB0cnkgYWdhaW4uCi0gICAgLy8KLSAgICBpZiAoc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLSAgICAgIGV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLSAgICB9Ci0gICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSBuZWVkIHRvIHNjcm9sbC4uLgotICAgIC8vCi0gICAgZWxzZSBpZiAoc2Nyb2xsSWZOZWVkZWQoZXZlbnQpKQotICAgIHsKLSAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2Ugc2Nyb2xsLCB3ZSBqdXN0IGRvIGFsbCB0aGUgd29yayBvbiB0aGUgbmV4dCBldmVudCBhbmQgb25seSBqdXN0IHNjcm9sbCBub3cuCi0gICAgICAvLwotICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBkYXRhIGZyb20gdGhlIGl0ZW0sIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgIC8vCi0gICAgICBPYmplY3QgdGFyZ2V0ID0gZXZlbnQuaXRlbSA9PSBudWxsID8gbnVsbCA6IGV2ZW50Lml0ZW0uZ2V0RGF0YSgpOwotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9ICgoVGFibGVUcmVlSXRlbSl0YXJnZXQpLmdldERhdGEoKTsKLSAgICAgIH0KLQotICAgICAgLy8gRG8gdGhlIGxvZ2ljIHRvIGRldGVybWluZSB0aGUgaG92ZXIgaW5mb3JtYXRpb24uCi0gICAgICAvLyBJZiB3ZSdyZSBvdmVyIGEgbmV3IGl0ZW0gZnJvbSBiZWZvcmUuCi0gICAgICAvLwotICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgewotICAgICAgICAvLyBSZW1lbWJlciB0aGUgaXRlbSBhbmQgdGhlIHRpbWUuCi0gICAgICAgIC8vCi0gICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgIGhvdmVyU3RhcnQgPSBldmVudC50aW1lOwotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKHRhcmdldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZXZlbnQudGltZSAtIGhvdmVyU3RhcnQgPiBob3ZlclRocmVzaG9sZCkKLSAgICAgICAgewotICAgICAgICAgIGhvdmVyKHRhcmdldCk7Ci0KLSAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGhvdmVyIG92ZXIgdGhpcyBndXkgYWdhaW4uCi0gICAgICAgICAgLy8KLSAgICAgICAgICBob3ZlclN0YXJ0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGNhbiBjcmVhdGUgYSB2YWxpZCBjb21tYW5kIGF0IHRoZSBjdXJyZW50IG1vdXNlIGxvY2F0aW9uLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIGNhY2hlZCBjb21tYW5kLi4uCi0gICAgICAvLwotICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tYW5kIGFuZCB0ZXN0IGlmIGl0IGlzIGV4ZWN1dGFibGUuCi0gICAgICAgIC8vCi0gICAgICAgIGNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlQ29tbWFuZCh0YXJnZXQsIGdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgZXZlbnQuZGV0YWlsLCBzb3VyY2UpOwotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgIAl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGludCBvcGVyYXRpb24gPSBvcmlnaW5hbE9wZXJhdGlvbiAhPSBldmVudC5kZXRhaWwgPyBvcmlnaW5hbE9wZXJhdGlvbiA6IGV2ZW50LmRldGFpbDsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2FjaGVkIGNvbW1hbmQgaXMgYWJsZSB0byBwcm92aWRlIGRyYWcgYW5kIGRyb3AgZmVlZGJhY2suCi0gICAgICAgIC8vCi0gICAgICAgIGlmICh0YXJnZXQgPT0gY29tbWFuZFRhcmdldCkvLyAmJiBjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BGZWVkYmFjaykKLSAgICAgICAgewotICAgICAgICAgIGZsb2F0IGxvY2F0aW9uID0gZ2V0TG9jYXRpb24oZXZlbnQpOwotCi0gICAgICAgICAgZHJhZ0FuZERyb3BDb21tYW5kSW5mb3JtYXRpb24gPSAKLSAgICAgICAgICAgIG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbih0YXJnZXQsIGxvY2F0aW9uLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0KLSAgICAgICAgICAvLyBJZiBzbywgcmV2YWxpZGF0ZSB0aGUgY29tbWFuZC4KLSAgICAgICAgICAvLwotICAgICAgICAgIGNvbW1hbmQucmVpbml0aWFsaXplKHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICB2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBub3QsIGRpc3Bvc2UgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAvLwotICAgICAgICAgIC8vICAgICAgICAgIGNvbW1hbmQuZGlzcG9zZSgpOwotICAgICAgICAgIGNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0KLSAgICAgICAgICBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IAotICAgICAgICAgICAgbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKHRhcmdldCwgZ2V0TG9jYXRpb24oZXZlbnQpLCBldmVudC5vcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0KLSAgICAgICAgICAvLyBEcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlKGRvbWFpbiwgdGFyZ2V0LCBnZXRMb2NhdGlvbihldmVudCksIGV2ZW50Lm9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLSAgICAgICAgICAvLwotICAgICAgICAgIGNvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbi5jcmVhdGVDb21tYW5kKCk7Ci0KLSAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAJdmFsaWQgPSBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhpcyBjb21tYW5kIGNhbiBwcm92aWRlIGRldGFpbGVkIGRyYWcgYW5kIGRyb3AgZmVlZGJhY2suLi4KLSAgICAgIC8vCi0gICAgICAvL2lmIChjb21tYW5kIGluc3RhbmNlb2YgRHJhZ0FuZERyb3BDb21tYW5kKQotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVXNlIHRoZSBmZWVkYmFjayBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgbW91c2UgcG9pbnQgZnJvbSB0aGUgY29tbWFuZC4KLSAgICAgICAgLy8KLSAgICAgICAgZXZlbnQuZGV0YWlsID0gY29tbWFuZC5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBjb21tYW5kLmdldEZlZWRiYWNrKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh2YWxpZCkKLSAgICAgIHsKLSAgICAgICAgLy8gQWxsIHdlIGNhbiBrbm93IGlzIHRvIHByb3ZpZGUgc2VsZWN0aW9uIGZlZWRiYWNrLgotICAgICAgICAvLwotICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGV4ZWN1dGFibGUgY29tbWFuZCwgc28gd2UnZCBiZXR0ZXIgbml4IHRoZSB3aG9sZSBkZWFsLgotICAgICAgICAvLwotICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotICAgICAgICBldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudERhdGFUeXBlKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0VHJhbnNmZXIgb2JqZWN0VHJhbnNmZXIgPSBPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotICAgIFRyYW5zZmVyRGF0YSBbXSBkYXRhVHlwZXMgPSBldmVudC5kYXRhVHlwZXM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhVHlwZXMubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSA9IGRhdGFUeXBlc1tpXTsKLSAgICAgIC8vIElmIHRoZSBsb2NhbCB0YW5zZmVyIHN1cHBvcnRzIHRoaXMgZGF0YXR5cGUsIHN3aXRjaCB0byB0aGF0IGRhdGEgdHlwZQotICAgICAgLy8KLSAgICAgIGlmIChvYmplY3RUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkKLSAgICAgIHsKLSAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gdHJhbnNmZXJEYXRhOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogVGhpcyAgYXR0ZW1wdHMgdG8gZXh0cmFjdCB0aGUgZHJhZyBzb3VyY2UgZnJvbSB0aGUgZXZlbnQgZWFybHksIGkuZS4sIGJlZm9yZSB0aGUgZHJvcCBtZXRob2QuCi0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gdHJpZXMgdG8gdXNlIGEge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLk9iamVjdFRyYW5zZmVyfS4KLSAgICovCi0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGdldERyYWdTb3VyY2UoRHJvcFRhcmdldEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBkYXRhIHR5cGUgY2FuIGJlIHRyYW5zZmVyZWQgbG9jYWxseS4KLSAgICAvLwotICAgIE9iamVjdFRyYW5zZmVyIG9iamVjdFRyYW5zZmVyID0gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoIW9iamVjdFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKQotICAgIHsKLSAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZGF0YSB0eXBlcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBkYXRhdHlwZSB0aGF0IHN1cHBvcnRzIGEgbG9jYWwgdHJhbnNmZXIuCi0gICAgICAvLwotICAgICAgc2V0Q3VycmVudERhdGFUeXBlKGV2ZW50KTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVHJhbnNmZXIgdGhlIGRhdGEgYW5kIGV4dHJhY3QgaXQuCi0gICAgICAvLwotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFRyYW5zZmVyLm5hdGl2ZVRvSmF2YShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgCXJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCXJldHVybiBleHRyYWN0RHJhZ1NvdXJjZShvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGV4dHJhY3RzIGEgY29sbGVjdGlvbiBvZiBkcmFnZ2VkIHNvdXJjZSBvYmplY3RzIGZyb20gdGhlIGdpdmVuIG9iamVjdCByZXRyaWV2ZWQgZnJvbSB0aGUgdHJhbnNmZXIgYWdlbnQuCi0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb252ZXJ0cyBhIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGludG8gYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZXh0cmFjdERyYWdTb3VyY2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIFRyYW5zZmVyIHRoZSBkYXRhIGFuZCBjb252ZXJ0IHRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiB0byBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cy4KLSAgICAvLwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgZWxlbWVudHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW9iamVjdCkuaXRlcmF0b3IoKTsgZWxlbWVudHMuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudHMubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBnZXRzIHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0SG92ZXJUaHJlc2hvbGQoKQotICB7Ci0gICAgcmV0dXJuIGhvdmVyVGhyZXNob2xkOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgc2V0IHRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBob3ZlciBvdmVyIGFuIGl0ZW0gYmVmb3JlIHtAbGluayAjaG92ZXJ9IGlzIGNhbGxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhvdmVyVGhyZXNob2xkKGludCBob3ZlclRocmVzaG9sZCkKLSAgewotICAgIHRoaXMuaG92ZXJUaHJlc2hvbGQgPSBob3ZlclRocmVzaG9sZDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjdXJzb3IgaGFzIGhvdmVyZWQgb3ZlciB0aGUgZ2l2ZW4gdGFyZ2V0IGZvciBsb25nZXIgdGhhbiB7QGxpbmsgI2hvdmVyVGhyZXNob2xkfS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGhvdmVyKE9iamVjdCB0YXJnZXQpCi0gIHsKLSAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKQotICAgIHsKLSAgICAgICgoQWJzdHJhY3RUcmVlVmlld2VyKXZpZXdlcikuZXhwYW5kVG9MZXZlbCh0YXJnZXQsIDEpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogVGhpcyByZXR1cm5zIHdoZXRoZXIgYSBzY3JvbGwgd2FzIHBlcmZvcm1lZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZHJhZyBjb29yZGluYXRlcy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNjcm9sbElmTmVlZGVkKERyb3BUYXJnZXRFdmVudCBldmVudCkKLSAgewotICAgIC8vIEJ5IGRlZmF1bHQgd2UnbGwgbm90IHNjcm9sbAotICAgIC8vCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIC8vIFdlIG9ubHkgaGFuZGxlIGEgdHJlZSBpdGVtIHJpZ2h0IG5vdy4KLSAgICAvLwotICAgIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pCi0gICAgewotICAgICAgLy8gVHJlZSBpdGVtcyBoYXZlIHNwZWNpYWwgZGF0YSB0aGF0IHdpbGwgaGVscC4KLSAgICAgIC8vCi0gICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCi0gICAgICAvLyBXZSBuZWVkIG5lZWQgdGhlIHBvaW50IGluIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBhbmQgdGhlIGNvbnRyb2wncyBib3VuZHMuCi0gICAgICAvLwotICAgICAgVHJlZSB0cmVlID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IHRyZWUudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdHJlZS5nZXRDbGllbnRBcmVhKCk7Ci0KLSAgICAgIC8vIFRoaXMgaXMgdGhlIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb3IgYm90dG9tIHRoYXQgd2lsbCBjYXVzZSBzY3JvbGxpbmcuCi0gICAgICAvLwotICAgICAgaW50IHNjcm9sbEVwc2lsb24gPSBNYXRoLm1pbih0cmVlSXRlbS5nZXRCb3VuZHMoKS5oZWlnaHQsIGJvdW5kcy5oZWlnaHQgLyAzKTsKLQotICAgICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBpdGVtIHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdGhlIHZpZXcuCi0gICAgICAvLwotICAgICAgVHJlZUl0ZW0gc2Nyb2xsVHJlZUl0ZW0gPSBudWxsOwotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIHVwLgotICAgICAgLy8KLSAgICAgIGlmIChwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBwYXJlbnQgdG8gZmluZCB0aGUgc2libGluZy4KLSAgICAgICAgLy8KLSAgICAgICAgVHJlZUl0ZW0gcGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHNpYmxpbmdzLgotICAgICAgICAvLwotICAgICAgICBUcmVlSXRlbSBbXSBjaGlsZHJlbiA9IHBhcmVudCA9PSBudWxsID8gdHJlZS5nZXRJdGVtcygpIDogcGFyZW50LmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJcyB0aGlzIGEgbWF0Y2guCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gdHJlZUl0ZW0pCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBzaWJsaW5nLi4uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuW2kgLSAxXTsKLQotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhc3QgZGVlcGVzdCBkZXNjZW5kZW50IG9mIHRoaXMgcHJldmlvdXMgc2libGluZy4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gc2Nyb2xsVHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggIT0gMCAmJiBzY3JvbGxUcmVlSXRlbS5nZXRFeHBhbmRlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gVGhlIHBhcmVudCBtdXN0IGJlIHRoZSBwcmV2aW91cy4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgc2Nyb2xsVHJlZUl0ZW0gPSBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgYWZ0ZXIgdGhlIG1hdGNoLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCBkb3duLi4uCi0gICAgICAvLwotICAgICAgZWxzZSBpZiAoYm91bmRzLmhlaWdodCAtIHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGlzIHRoaW5nIGhhcyB2aXNpYmxlIGNoaWxkcmVuLCB0aGVuIHRoZSBmaXJzdCBjaGlsZCBtdXN0IGJlIG5leHQuCi0gICAgICAgIC8vCi0gICAgICAgIFRyZWVJdGVtIFtdIGNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoICE9IDAgJiYgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRyZWVJdGVtID0gY2hpbGRyZW5bMF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gV2UgbmVlZCB0aGUgcGFyZW50IHRvIGRldGVybWluZSBzaWJsaW5ncyBhbmQgd2lsbCB3YWxrIHVwIHRoZSB0cmVlIGlmIHdlIGFyZSB0aGUgbGFzdCBzaWJsaW5nLgotICAgICAgICAgIC8vCi0gICAgICAgICAgd2hpbGUgKHNjcm9sbFRyZWVJdGVtID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgVHJlZUl0ZW0gcGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgICAgLy8gV2FsayB0aGUgY2hpbGRyZW4uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQgPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbXMoKSA6IHBhcmVudC5nZXRJdGVtcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBmaW5kIHRoZSBjaGlsZC4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IHRyZWVJdGVtKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgaW5kZXggaXMgYSB2YWxpZCBpbmRleC4uLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgaWYgKCsraSA8IGNoaWxkcmVuLmxlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBmb3VuZCB0aGUgaXRlbS4KLSAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICBzY3JvbGxUcmVlSXRlbSA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHBhcmVudC4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdhbGsgdXAuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgdHJlZUl0ZW0gPSBwYXJlbnQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwuCi0gICAgICAvLwotICAgICAgaWYgKHNjcm9sbFRyZWVJdGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE9ubHkgc2Nyb2xsIGlmIHdlJ3JlIG9uIGFuIGl0ZW0gZm9yIGEgd2hpbGUuCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwcmV2aW91c0l0ZW0gIT0gbnVsbCAmJiBldmVudC50aW1lIC0gaG92ZXJTdGFydCA+IDIwMCkKLSAgICAgICAgewotICAgICAgICAgIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbEJhciA9IHRyZWUuZ2V0VmVydGljYWxCYXIoKTsKLSAgICAgICAgICBpZiAodmVydGljYWxTY3JvbGxCYXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYmVmb3JlID0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaXRlbSBpcyBzY3JvbGxlZCBpbiBwbGFjZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0cmVlLnNob3dJdGVtKHNjcm9sbFRyZWVJdGVtKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNjcm9sbCBhZ2FpbiBxdWlja2x5LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UndmUgZG9uZSBhIHNjcm9sbCBhbmQgbm90aGluZyBlbHNlIHNob3VsZCBiZSBkb25lLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZSAhPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gY2hhbmdlcywgcmVzZXQgdGhlIHRpbWVyIGluZm9ybWF0aW9uLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0gIT0gcHJldmlvdXNJdGVtKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXZpb3VzSXRlbSA9IGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBob3ZlclN0YXJ0ID0gZXZlbnQudGltZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkKLSAgICB7Ci0gICAgICAvLyBUYWJsZSBpdGVtcyBoYXZlIHNwZWNpYWwgZGF0YSB0aGF0IHdpbGwgaGVscC4KLSAgICAgIC8vCi0gICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCi0gICAgICAvLyBXZSBuZWVkIG5lZWQgdGhlIHBvaW50IGluIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY29udHJvbCBhbmQgdGhlIGNvbnRyb2wncyBib3VuZHMuCi0gICAgICAvLwotICAgICAgVGFibGUgdGFibGUgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IHRhYmxlLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLSAgICAgIGlmICh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpCi0gICAgICB7Ci0gICAgICAgIGludCBvZmZzZXQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCk7Ci0gICAgICAgIGJvdW5kcy55ICs9IG9mZnNldDsKLSAgICAgICAgYm91bmRzLmhlaWdodCAtPSBvZmZzZXQ7Ci0gICAgICAgIHBvaW50LnkgLT0gb2Zmc2V0OwotICAgICAgfQotCi0gICAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhpcyBpdGVtLgotICAgICAgLy8KLSAgICAgIGludCBpbmRleCA9IHRhYmxlLmluZGV4T2YodGFibGVJdGVtKTsKLQotICAgICAgLy8gVGhpcyBpcyB0aGUgZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvciBib3R0b20gdGhhdCB3aWxsIGNhdXNlIHNjcm9sbGluZy4KLSAgICAgIC8vCi0gICAgICBpbnQgc2Nyb2xsRXBzaWxvbiA9IE1hdGgubWluKHRhYmxlSXRlbS5nZXRCb3VuZHMoMCkuaGVpZ2h0LCBib3VuZHMuaGVpZ2h0IC8gMyk7Ci0KLSAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgaXRlbSB0aGF0IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3LgotICAgICAgLy8KLSAgICAgIFRhYmxlSXRlbSBzY3JvbGxUYWJsZUl0ZW0gPSBudWxsOwotCi0gICAgICAvLyBJZiB3ZSBzaG91bGQgc2Nyb2xsIHVwLgotICAgICAgLy8KLSAgICAgIGlmIChwb2ludC55IDwgc2Nyb2xsRXBzaWxvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHNjcm9sbFRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW1zKClbaW5kZXggLSAxXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNjcm9sbCBkb3duLi4uCi0gICAgICAvLwotICAgICAgZWxzZSBpZiAoYm91bmRzLmhlaWdodCAtIHBvaW50LnkgPCBzY3JvbGxFcHNpbG9uKQotICAgICAgewotICAgICAgICBpZiAoaW5kZXggKyAxIDwgdGFibGUuZ2V0SXRlbXMoKS5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICBzY3JvbGxUYWJsZUl0ZW0gPSAgdGFibGUuZ2V0SXRlbXMoKVtpbmRleCArIDFdOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIHNob3VsZCBzY3JvbGwuCi0gICAgICAvLwotICAgICAgaWYgKHNjcm9sbFRhYmxlSXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBPbmx5IHNjcm9sbCBpZiB3ZSdyZSBvbiBhbiBpdGVtIGZvciBhIHdoaWxlLgotICAgICAgICAvLwotICAgICAgICBpZiAocHJldmlvdXNJdGVtICE9IG51bGwgJiYgZXZlbnQudGltZSAtIGhvdmVyU3RhcnQgPiAyMDApCi0gICAgICAgIHsKLSAgICAgICAgICBTY3JvbGxCYXIgdmVydGljYWxTY3JvbGxCYXIgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpOwotICAgICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbEJhciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBiZWZvcmUgPSB2ZXJ0aWNhbFNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBpdGVtIGlzIHNjcm9sbGVkIGluIHBsYWNlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRhYmxlLnNob3dJdGVtKHNjcm9sbFRhYmxlSXRlbSk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzY3JvbGwgYWdhaW4gcXVpY2tseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBudWxsOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlJ3ZlIGRvbmUgYSBzY3JvbGwgYW5kIG5vdGhpbmcgZWxzZSBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICByZXN1bHQgPSBiZWZvcmUgIT0gdmVydGljYWxTY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGNoYW5nZXMsIHJlc2V0IHRoZSB0aW1lciBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChldmVudC5pdGVtICE9IHByZXZpb3VzSXRlbSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSBldmVudC5pdGVtOwotICAgICAgICAgICAgaG92ZXJTdGFydCA9IGV2ZW50LnRpbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmxvYXQgZ2V0TG9jYXRpb24oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pCi0gICAgewotICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLSAgICAgIENvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotICAgICAgUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotICAgICAgcmV0dXJuIChmbG9hdCkocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdClib3VuZHMuaGVpZ2h0OwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAgICBQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLSAgICAgIHJldHVybiAoZmxvYXQpKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpYm91bmRzLmhlaWdodDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwLjBGOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbgotICB7Ci0gICAgLy8gICAgcHJvdGVjdGVkIEVkaXRpbmdEb21haW4gZG9tYWluOwotICAgIHByb3RlY3RlZCBPYmplY3QgdGFyZ2V0OwotICAgIHByb3RlY3RlZCBmbG9hdCBsb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgaW50IG9wZXJhdGlvbnM7Ci0gICAgcHJvdGVjdGVkIGludCBvcGVyYXRpb247Ci0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gc291cmNlOwotICAgIHB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbgotICAgICAgKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpCi0gICAgewotICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICB0aGlzLnNvdXJjZSA9IG5ldyBBcnJheUxpc3Qoc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHJhZ0FuZERyb3BDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKQotICAgIHsKLSAgICAgIHJldHVybiBkcmFnQW5kRHJvcE1hbmFnZXIuY3JlYXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9OYXZpZ2FibGVUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvTmF2aWdhYmxlVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwM2QzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9OYXZpZ2FibGVUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotcHVibGljIGNsYXNzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLSAgIFRhYmxlTmF2aWdhdG9yIG5hdmlnYXRvcjsKLQotICAgcHVibGljIE5hdmlnYWJsZVRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCkKLSAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICBuYXZpZ2F0b3IgPSBuZXcgVGFibGVOYXZpZ2F0b3IoZ2V0VGFibGUoKSwgdGhpcyk7Ci0gICB9Ci0KLSAgIC8vb3ZlcnJpZGUgc2V0Q2VsbEVkaXRvcnMgdG8gcHV0IGluIGNhbGwgdG8gbW92ZUFib3ZlQ2VsbEVkaXRvcnMgZm9yIFRhYmxlTmF2aWdhdG9yCi0gICBwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9ycyhDZWxsRWRpdG9yW10gZWRpdG9ycykKLSAgIHsKLSAgICAgc3VwZXIuc2V0Q2VsbEVkaXRvcnMoZWRpdG9ycyk7Ci0gICAgIG5hdmlnYXRvci5tb3ZlQ2VsbEVkaXRvcnNBYm92ZShlZGl0b3JzKTsKLQotICAgfQotCi0gICAvL292ZXJyaWRlIHJlZnJlc2ggc28gdGhhdCBUYWJsZU5hdmlnYXRvciBpcyByZWZyZXNoZWQgZm9yIGFsbCBtb2RlbCBjaGFuZ2VzCi0gICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgIHsKLSAgIAlpZiggIXRoaXMuZ2V0VGFibGUoKS5pc0Rpc3Bvc2VkKCkgKQotICAgCXsKLSAgICAgIAlzdXBlci5yZWZyZXNoKCk7Ci0gICAgICAJbmF2aWdhdG9yLnJlZnJlc2goKTsKLSAgIAl9Ci0gICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1Jlc291cmNlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9SZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWEzZjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1Jlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBmRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElGaWxlW10gZkV4Y2x1ZGVkRmlsZXM7Ci0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGZFeGNsdWRlczsKLQkKLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIElGaWxlW10gZXhjbHVkZWRGaWxlcywgQ29sbGVjdGlvbiBleGNsdWRlKSAKLSAgewotICAgIGZFeHRlbnNpb25zPSBleHRlbnNpb25zOwotICAgIGZFeGNsdWRlcz0gZXhjbHVkZTsKLSAgICBmRXhjbHVkZWRGaWxlcyA9IGV4Y2x1ZGVkRmlsZXM7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSAKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCQotICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIAotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgewotICAgICAgaWYgKGZFeGNsdWRlcyAhPSBudWxsICYmIGZFeGNsdWRlcy5jb250YWlucyhlbGVtZW50KSkgCi0gICAgICB7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgU3RyaW5nIG5hbWU9ICgoSUZpbGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZFeGNsdWRlZEZpbGVzICE9IG51bGwpIAotICAgICAgewotICAgICAgICBmb3IgKGludCBqPSAwOyBqIDwgZkV4Y2x1ZGVkRmlsZXMubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoKElGaWxlKWVsZW1lbnQpLmdldExvY2F0aW9uKCkuCi0gICAgICAgICAgICAgICB0b09TU3RyaW5nKCkuY29tcGFyZVRvKChmRXhjbHVkZWRGaWxlc1tqXSkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpID09IDAgKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAoZkV4dGVuc2lvbnMubGVuZ3RoID09IDApIAotICAgICAgewotICAgICAgICAvLyBhc3N1bWUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGZpbHRlciBhbnkgZmlsZXMgYmFzZWQgb24gCi0gICAgICAgIC8vIGV4dGVuc2lvbgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGZFeHRlbnNpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIAotICAgIHsgLy8gSVByb2plY3QsIElGb2xkZXIKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgIAlJUmVzb3VyY2VbXSByZXNvdXJjZXM9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JZm9yIChpbnQgaT0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgCi0gICAgICAgIHsKLQkgIC8vIHJlY3Vyc2l2ZSEKLQkgIGlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnQsIHJlc291cmNlc1tpXSkpIAotICAgICAgICAgIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JfQotICAgICAgfSAKLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotICAgICAgewotICAgICAgfQkJCQkKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RNdWx0aUZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RNdWx0aUZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTkwODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0TXVsdGlGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotCi0vLyBQYWdlIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBmaWxlcwotcHVibGljIGNsYXNzIFNlbGVjdE11bHRpRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0gIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnk7Ci0gIFRyZWVWaWV3ZXIgc291cmNlRmlsZVZpZXdlcjsKLSAgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLSAgQnV0dG9uIHJlbW92ZUFsbEJ1dHRvbjsKLSAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBzZWxlY3RlZExpc3RCb3g7Ci0gIEJ1dHRvbiBpbXBvcnRCdXR0b247Ci0gIHByaXZhdGUgVmVjdG9yIGZGaWx0ZXJzOwotICBwcm90ZWN0ZWQgSUZpbGVbXSBmaWxlTmFtZXM7Ci0gIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3Q7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJWklOR19MSVNUU19IRUlHSFQgPSAyMDA7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTSVpJTkdfTElTVFNfV0lEVEggPSAxNTA7Ci0KLSAgLy8gcGFyYW1ldGVyIGlzRmlsZU1hbmRhdG9yeSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZmlsZSBtdXN0IGJlIHNlbGVjdGVkICAKLSAgLy8gYmVmb3JlIGJlaW5nIGFibGUgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlCi0gIHB1YmxpYyBTZWxlY3RNdWx0aUZpbGVQYWdlKAotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2gsCi0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgewotICAgIHN1cGVyKCJTZWxlY3RNdWx0aUZpbGVQYWdlIik7Ci0gICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgdGhpcy5pc0ZpbGVNYW5kYXRvcnkgPSBpc0ZpbGVNYW5kYXRvcnk7Ci0gICAgdGhpcy53b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICB0aGlzLmZpbGVOYW1lcyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAKLSAgICBDb21wb3NpdGUgcGFnZUNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgcGFnZUNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgcGFnZUNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICAvLyB2YXJpYWJsZSBuZXZlciB1c2VkIC4uLiBpcyBwYWdlQ29udGVudC5nZXRMYXlvdXREYXRhKCkgbmVlZGVkPwotICAgIC8vR3JpZERhdGEgb3V0ZXJGcmFtZUdyaWREYXRhID0gKEdyaWREYXRhKSAKLSAgICBwYWdlQ29udGVudC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgCi0gICAgLy8JCW91dGVyRnJhbWVHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotICAgIC8vCQlvdXRlckZyYW1lR3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMOwotCi0gICAgLy8gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKAotICAgIC8vICAgICAgICBwYWdlQ29udGVudCwKLSAgICAvLyAgICAgICAgQjJCR1VJQ29udGV4dElkcy5CVEJHX1NFTEVDVF9NVUxUSV9GSUxFX1BBR0UpOwotCi0gICAgY3JlYXRlTGFiZWxzKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVTb3VyY2VWaWV3ZXIocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZUJ1dHRvblBhbmVsKHBhZ2VDb250ZW50KTsKLSAgICBjcmVhdGVTZWxlY3RlZExpc3RCb3gocGFnZUNvbnRlbnQpOwotICAgIGNyZWF0ZUltcG9ydEJ1dHRvbihwYWdlQ29udGVudCk7Ci0KLSAgICBzZXRDb250cm9sKHBhZ2VDb250ZW50KTsKLSAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICB9Ci0KLSAgcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0gICAgcmV0dXJuIGZpbGVOYW1lczsKLSAgfQotCi0gIC8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0gIC8vIGV4ZW5zaW9ucy4gSXQgaW50ZXJuYWxseSBjcmVhdGVzIGEgUmVzb3VyY2VGaWx0ZXIgc28gdGhhdCB1c2VycyBvZiB0aGlzCi0gIC8vIGNsYXNzIGRvbid0IGhhdmUgdG8gY29uc3RydWN0IG9uZS4KLSAgLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLSAgICAvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0KLSAgICAgIG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLSAgICAgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICBlbHNlCi0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgIH0KLQotICAgIFZpZXdlckZpbHRlciBmaWx0ZXIgPQotICAgICAgbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFNvdXJjZUZpbGVWaWV3ZXJTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgaWYgKHZpc2libGUgPT0gdHJ1ZSkgewotICAgICAgaWYgKGZGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZXNldEZpbHRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRmlsdGVyKChWaWV3ZXJGaWx0ZXIpIGkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgfQotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLSAgICBpbnQgc2l6ZSA9IEFycmF5cy5hc0xpc3QoZmlsZU5hbWVzKS5zaXplKCk7Ci0gICAgVmVjdG9yIGlGaWxlTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZmluZE1lbWJlcihmaWxlTmFtZXNbaV0pOwotICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgIGlGaWxlTmFtZXMuYWRkRWxlbWVudChyZXNvdXJjZSk7Ci0gICAgfQotICAgIElGaWxlW10gZHVtbXlBcnJheSA9IG5ldyBJRmlsZVtpRmlsZU5hbWVzLnNpemUoKV07Ci0gICAgdGhpcy5maWxlTmFtZXMgPSAoSUZpbGVbXSkgKGlGaWxlTmFtZXMudG9BcnJheShkdW1teUFycmF5KSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKSB7Ci0gICAgZkZpbHRlcnMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLSAgICBpZiAoZkZpbHRlcnMgPT0gbnVsbCkKLSAgICAgIGZGaWx0ZXJzID0gbmV3IFZlY3RvcigpOwotICAgIGZGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWRkQnV0dG9uRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVCdXR0b25FbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVMYWJlbHMoQ29tcG9zaXRlIHBhZ2VDb250ZW50KSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFnZUNvbnRlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9TT1VSQ0VfRklMRVMpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGxhYmVsID0gbmV3IExhYmVsKHBhZ2VDb250ZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNURURfRklMRVMpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2hlY2tJZkZpbGVJblRhcmdldChJRmlsZSBmaWxlVG9DaGVjaykgewotICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKTsKLSAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtQ291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKHN0cmluZ3NbaV0uY29tcGFyZVRvKGZpbGVUb0NoZWNrLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkKLSAgICAgICAgICA9PSAwKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgc291cmNlRmlsZVZpZXdlciA9Ci0gICAgICBuZXcgVHJlZVZpZXdlcigKLSAgICAgICAgICBuZXcgVHJlZSgKLSAgICAgICAgICAgICAgcGFyZW50LAotICAgICAgICAgICAgICBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc291cmNlRmlsZVZpZXdlcgotICAgIC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0OwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBib29sZWFuIG5ld0ZpbGVzU2VsZWN0ZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICBpZiAoY2hlY2tJZkZpbGVJblRhcmdldCgoSUZpbGUpIHJlc291cmNlKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICBuZXdGaWxlc1NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgc2V0QWRkQnV0dG9uRW5hYmxlZChuZXdGaWxlc1NlbGVjdGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIENvbnRyb2wgdHJlZVdpZGdldCA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gU0laSU5HX0xJU1RTX1dJRFRIOwotICAgIGdkLmhlaWdodEhpbnQgPSBTSVpJTkdfTElTVFNfSEVJR0hUOwotICAgIHRyZWVXaWRnZXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uUGFuZWwoQ29tcG9zaXRlIHBhZ2VDb250ZW50KSB7Ci0gICAgQ29tcG9zaXRlIGJ1dHRvblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYWdlQ29udGVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgYnV0dG9uUGFuZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0FERF9CVVRUT04pOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgYWRkQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9BRERfQlVUVE9OX1RPT0xfVElQKTsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9CVVRUT04pOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9SRU1PVkVfQlVUVE9OX1RPT0xfVElQKTsKLSAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICByZW1vdmVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvblBhbmVsLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQWxsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX1JFTU9WRV9BTExfQlVUVE9OKTsKLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICByZW1vdmVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJ1dHRvblNlbGVjdExpc3RlbmVyKCkpOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUkVNT1ZFX0FMTF9CVVRUT05fVE9PTF9USVApOwotICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3RlZExpc3RCb3goQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHNlbGVjdGVkTGlzdEJveCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgc2VsZWN0ZWRMaXN0Qm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAKLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkKLSAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc2V0UmVtb3ZlQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gU0laSU5HX0xJU1RTX1dJRFRIOwotICAgIGdkLmhlaWdodEhpbnQgPSBTSVpJTkdfTElTVFNfSEVJR0hUOwotICAgIHNlbGVjdGVkTGlzdEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgfQotCi0gIHZvaWQgY3JlYXRlSW1wb3J0QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgIGltcG9ydEJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9JTVBPUlRfQlVUVE9OKTsKLSAgICAKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgaW1wb3J0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGltcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIEZpbGVTeXN0ZW1JbXBvcnRXaXphcmQgaW1wb3J0V2l6YXJkID0KLSAgICAgICAgICBuZXcgRmlsZVN5c3RlbUltcG9ydFdpemFyZCgpOwotICAgICAgICBpbXBvcnRXaXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9Ci0gICAgICAgICAgbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgaW1wb3J0V2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICB3aXphcmREaWFsb2cub3BlbigpOwotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRGaWxlc1RvVGFyZ2V0TGlzdCgpIHsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICBpZiAoaXNWYWxpZFNvdXJjZUZpbGVWaWV3ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSkgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgbGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7Ci0KLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0cyBpbiB0aGUgbGlzdC4gRG9uJ3QgYWRkIGl0IGlmIGl0IGlzLgotICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0KLSAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guaW5kZXhPZihyZXNvdXJjZU5hbWUpID09IC0xKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkTGlzdEJveC5hZGQocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgc2V0RmlsZXMoc2VsZWN0ZWRMaXN0Qm94LmdldEl0ZW1zKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0QWRkQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtQ291bnQoKSA+IDApIHsKLSAgICAgICAgICByZW1vdmVBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApCi0gICAgICAgICAgICBzZXRSZW1vdmVCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNldFJlbW92ZUJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQnV0dG9uU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKSB7Ci0gICAgICAgIGFkZFNlbGVjdGVkRmlsZXNUb1RhcmdldExpc3QoKTsKLSAgICAgIH0gZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKSB7Ci0gICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBzZWxlY3RlZExpc3RCb3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGludCBzaXplID0gc2VsZWN0ZWRMaXN0Qm94LmdldFNlbGVjdGlvbkNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgc2VsZWN0ZWRMaXN0Qm94LnJlbW92ZShzdHJpbmdzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGlmIChzZWxlY3RlZExpc3RCb3guZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotICAgICAgICAgIHJlbW92ZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRGaWxlcyhzZWxlY3RlZExpc3RCb3guZ2V0SXRlbXMoKSk7Ci0gICAgICB9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUFsbEJ1dHRvbikgewotICAgICAgICBzZWxlY3RlZExpc3RCb3gucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBpZiAoaXNGaWxlTWFuZGF0b3J5KQotICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHNldEZpbGVzKHNlbGVjdGVkTGlzdEJveC5nZXRJdGVtcygpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFmMjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLSAgcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotICBwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0gIAotICAvLyBwYXJhbWV0ZXIgaXNGaWxlTWFuZGF0b3J5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZmlsZSBtdXN0IGJlIHNlbGVjdGVkICAKLSAgLy8gYmVmb3JlIGJlaW5nIGFibGUgdG8gcHJvY2VlZCB0byB0aGUgbmV4dCBwYWdlCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgewotICAgIHN1cGVyKCJTZWxlY3RTaW5nbGVGaWxlUGFnZSIpOwotICAgIHRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOyAgICAgICAgICAgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcih2aXNpYmxlKTsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkKLSAgICAgIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzQ29tcGxldGUpOwotICAgICAgfQotICAgIH07Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIENvbnRyb2wgY29udHJvbCA9IHNlbGVjdFNpbmdsZUZpbGVWaWV3LmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250cm9sLCBCMkJHVUlDb250ZXh0SWRzLkJUQkdfU0VMRUNUX1NJTkdMRV9GSUxFX1BBR0UpOwotICAgIHNldENvbnRyb2woY29udHJvbCk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKSAKLSAgeyAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXIoZmlsdGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgeyAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotICB9ICAgICAKLQotICBwdWJsaWMgdm9pZCByZXNldEZpbHRlcnMoKQotICB7ICAgIAotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnJlc2V0RmlsdGVycygpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsgIAotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRGaWxlKCk7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gICAqIEByZXR1cm4gU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAgICovCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFNvdXJjZUZpbGVWaWV3ZXIoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3LnNvdXJjZUZpbGVWaWV3ZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gICAqIEByZXR1cm4gU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAgICovCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlVmlldyBnZXRTZWxlY3RTaW5nbGVGaWxlVmlldygpIHsKLSAgICByZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzM2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1NlbGVjdFNpbmdsZUZpbGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5VSVBsdWdpbjsKLQotICAgIAotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVZpZXcKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29tcG9zaXRlICAgICAgICAgICAgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICAgICAgICAgaXNGaWxlTWFuZGF0b3J5OwotICBwcm90ZWN0ZWQgVHJlZVZpZXdlciAgICAgICAgICAgc291cmNlRmlsZVZpZXdlcjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiAgICAgICAgICAgICAgIGltcG9ydEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFZlY3RvciAgICAgICAgICAgICAgIGZGaWx0ZXJzOwotICBwcm90ZWN0ZWQgSUZpbGUgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiAgICAgICAgICAgZGVmYXVsdFNlbGVjdGlvbjsgIAotICBwcm90ZWN0ZWQgTGlzdGVuZXIgICAgICAgICAgICAgbGlzdGVuZXI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSk7IAotICB9Ci0KLSAgcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgdGhpcy5pc0ZpbGVNYW5kYXRvcnkgPSBpc0ZpbGVNYW5kYXRvcnk7Ci0gICAgdGhpcy5zZWxlY3RlZEZpbGU9IG51bGw7Ci0gICAgdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gbnVsbDsgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7ICAgICAgICAgICAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIENvbXBvc2l0ZSBzbWFsbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc21hbGxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMLCB0cnVlLCBmYWxzZSkpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc21hbGxDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIAotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNtYWxsQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfU09VUkNFX0ZJTEVTKTsJCi0JbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcsIEdyaWREYXRhLkVORCwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAvL0NvbGxhcHNlIGFuZCBFeHBhbmQgYWxsIGJ1dHRvbnMKLSAgICBUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihzbWFsbENvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIHRvb2xCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5FTkQsIHRydWUsIGZhbHNlKSk7Ci0gICAgCi0gICAgVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULk5PTkUpOwotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9leHBhbmRBbGwuZ2lmIik7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICB0b29sSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0gICAgdG9vbEl0ZW0uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1BPUFVQX0VYUEFORF9BTEwpOwotICAgIHRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgIAkKLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJc291cmNlRmlsZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCi0JfX0pOwotICAgIAotICAgIAotICAgIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5OT05FKTsKLSAgICBpbWFnZURlc2NyaXB0b3IgPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9jb2xsYXBzZUFsbC5naWYiKTsKLSAgICBpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgIHRvb2xJdGVtLnNldEltYWdlKGltYWdlKTsKLSAgICB0b29sSXRlbS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfUE9QVVBfQ09MTEFQU0VfQUxMKTsKLSAgICB0b29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlzb3VyY2VGaWxlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQotCX19KTsKLQotICAgIGNyZWF0ZVNvdXJjZVZpZXdlcihjb21wb3NpdGUpOwotICAgIGNyZWF0ZUZpbHRlckNvbnRyb2woY29tcG9zaXRlKTsgICAKLSAgICBjcmVhdGVJbXBvcnRCdXR0b24oY29tcG9zaXRlKTsgIAotICAgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSAKLSAgewkKLSAgfSAKLQotcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc291cmNlRmlsZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKG5ldyBUcmVlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLSAgICBzb3VyY2VGaWxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIAotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgamF2YS51dGlsLkxpc3QgbGlzdDsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikudG9MaXN0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkRmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpIAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsgICAgIAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkpIAotICAgICAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICAgIGxpc3RlbmVyLnNldENvbnRyb2xDb21wbGV0ZShpc0NvbXBsZXRlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0JCi0gICAgfSk7Ci0gICAgQ29udHJvbCB0cmVlV2lkZ2V0ID0gc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICB0cmVlV2lkZ2V0LnNldExheW91dERhdGEoZ2QpOwotICB9Ci0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbXBvcnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAgIAotICAgIGltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgaW1wb3J0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT04pOwotICAgIAotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7ICAgIAotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgaW1wb3J0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGltcG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgbGlzdGVuZXIgaXMgaWYgdGhlIEltcG9ydCBXaXphcmQgYWRkcyBhIG5ldyBmZXcsIHdlIHdhbnQKLSAgICAgICAgLy8gaXQgdG8gYmUgc2VsZWN0ZWQgd2hlbiB3ZSBjb21lIGJhY2sgZnJvbSBpdAotICAgICAgICBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXI9IG5ldyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKTsKLSAgICAgICAgICAKLSAgICAgICAgRmlsZVN5c3RlbUltcG9ydFdpemFyZCBpbXBvcnRXaXphcmQgPSBuZXcgRmlsZVN5c3RlbUltcG9ydFdpemFyZCgpOwotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzb3VyY2VGaWxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpbXBvcnRXaXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbiAhPSBudWxsID8gc2VsZWN0aW9uIDogbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGltcG9ydFdpemFyZCk7Ci0gICAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgc291cmNlRmlsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIpOwotICAgICAgICBJRmlsZSBpbXBvcnRlZEZpbGUgPSBpbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyLmdldEltcG9ydGVkRmlsZSgpOwotICAgICAgICBpZiAoaW1wb3J0ZWRGaWxlICE9IG51bGwpIAotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGltcG9ydGVkRmlsZSk7Ci0gICAgICAgICAgc291cmNlRmlsZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsgICAgICAgICAgICAgICAgICAKLSAgICBpbXBvcnRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0lNUE9SVF9CVVRUT05fVE9PTF9USVApOwotICB9IAotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZEZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZhdWx0U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RmlsdGVycygpCi0gIHsKLSAgICBmRmlsdGVycz1udWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIAotICB7Ci0gICAgaWYgKGZGaWx0ZXJzID09IG51bGwpCi0gICAgewotICAgICAgZkZpbHRlcnM9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0gICAgZkZpbHRlcnMuYWRkKGZpbHRlcik7Ci0gIH0KLQotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgYWRkRmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgIHsKLSAgICAgIC8vIElmIHRoZSBleHRlbnNpb24gZG9lc24ndCBzdGFydCB3aXRoIGEgJy4nLCB0aGVuIGFkZCBvbmUuCi0gICAgICBpZiAoZmlsdGVyRXh0ZW5zaW9uc1tpXS5zdGFydHNXaXRoKCIuIikpCi0gICAgICB7Ci0gICAgICAgIGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSBmaWx0ZXJFeHRlbnNpb25zW2ldOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gIi4iICsgZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBnaXZlbiBmaWxlCi0vLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotLy8gY2xhc3MgZG9uJ3QgaGF2ZSB0byBjb25zdHJ1Y3Qgb25lLgotLy8gSWYgdGhlIGV4dGVuc2lvbnMgcHJvdmlkZWQgZG9uJ3QgaGF2ZSAnLicsIG9uZSB3aWxsIGJlIGFkZGVkLgotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMsIElGaWxlIFtdIGV4Y2x1ZGVkRmlsZXMpCi0gIHsKLSAgICAvLyBGaXJzdCBhZGQgdGhlICcuJyB0byB0aGUgZmlsdGVyRXh0ZW5zaW9ucyBpZiB0aGV5IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBTdHJpbmdbXSBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zID0gbmV3IFN0cmluZ1tmaWx0ZXJFeHRlbnNpb25zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgZXh0ZW5zaW9uIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhICcuJywgdGhlbiBhZGQgb25lLgotICAgICAgaWYgKGZpbHRlckV4dGVuc2lvbnNbaV0uc3RhcnRzV2l0aCgiLiIpKQotICAgICAgewotICAgICAgICBjb3JyZWN0ZWRGaWx0ZXJFeHRlbnNpb25zW2ldID0gZmlsdGVyRXh0ZW5zaW9uc1tpXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9ICIuIiArIGZpbHRlckV4dGVuc2lvbnNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIFZpZXdlckZpbHRlciBmaWx0ZXI7Ci0gICAgaWYgKGV4Y2x1ZGVkRmlsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgZXhjbHVkZWRGaWxlcywgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIoY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucywgbnVsbCk7Ci0gICAgfQotICAgIGFkZEZpbHRlcihmaWx0ZXIpOwotICB9Ci0gIAotICAvLyBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ2l2ZW4gZmlsZQotICAvLyBleGVuc2lvbnMuIEl0IGludGVybmFsbHkgY3JlYXRlcyBhIFJlc291cmNlRmlsdGVyIHNvIHRoYXQgdXNlcnMgb2YgdGhpcwotICAvLyBjbGFzcyBkb24ndCBoYXZlIHRvIGNvbnN0cnVjdCBvbmUuCi0gIC8vIElmIHRoZSBleHRlbnNpb25zIHByb3ZpZGVkIGRvbid0IGhhdmUgJy4nLCBvbmUgd2lsbCBiZSBhZGRlZC4KLSAgcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKQotICB7Ci0JLy8gRmlyc3QgYWRkIHRoZSAnLicgdG8gdGhlIGZpbHRlckV4dGVuc2lvbnMgaWYgdGhleSBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0JU3RyaW5nW10gY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbZmlsdGVyRXh0ZW5zaW9ucy5sZW5ndGhdOwotCWZvciAoaW50IGk9MDsgaSA8IGZpbHRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotCXsJCQotCSAgLy8gSWYgdGhlIGV4dGVuc2lvbiBkb2Vzbid0IHN0YXJ0IHdpdGggYSAnLicsIHRoZW4gYWRkIG9uZS4KLQkgIGlmIChmaWx0ZXJFeHRlbnNpb25zW2ldLnN0YXJ0c1dpdGgoIi4iKSkKLQkgIHsKLQkJY29ycmVjdGVkRmlsdGVyRXh0ZW5zaW9uc1tpXSA9IGZpbHRlckV4dGVuc2lvbnNbaV07Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCWNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnNbaV0gPSAiLiIgKyBmaWx0ZXJFeHRlbnNpb25zW2ldOwotCSAgfQotCX0KLQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKGNvcnJlY3RlZEZpbHRlckV4dGVuc2lvbnMsIG51bGwpOwotICAgIGZGaWx0ZXJzPSBuZXcgVmVjdG9yKCk7Ci0JZkZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JaWYgKHNvdXJjZUZpbGVWaWV3ZXIgIT0gbnVsbCkKLQl7CQotCSAgc291cmNlRmlsZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KGZhbHNlKTsKLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGk9ZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgeyAgICAgCi0JICAgIHNvdXJjZUZpbGVWaWV3ZXIuYWRkRmlsdGVyKChWaWV3ZXJGaWx0ZXIpaS5uZXh0KCkpOwotIAkgIH0KLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnNldFJlZHJhdyh0cnVlKTsKLQkgIHNvdXJjZUZpbGVWaWV3ZXIuZ2V0VHJlZSgpLnJlZHJhdygpOwotCX0JCi0gIH0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgYSBXaXphcmQgcGFnZSBvciBEaWFsb2cgd2hlbiBpdCBiZWNvbWVzIHZpc2libGUKLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIHZpc2libGUpCi0gIHsgICAgCi0gICAgaWYgKHZpc2libGUgPT0gdHJ1ZSkgCi0gICAgewotICAgICAgaWYgKGZGaWx0ZXJzICE9IG51bGwpIAotICAgICAgewotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnJlc2V0RmlsdGVycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9ZkZpbHRlcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgICAJICBzb3VyY2VGaWxlVmlld2VyLmFkZEZpbHRlcigoVmlld2VyRmlsdGVyKWkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICBzb3VyY2VGaWxlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMSk7Ci0KLSAgICAgIGlmIChkZWZhdWx0U2VsZWN0aW9uICE9IG51bGwpIAotICAgICAgewotICAgICAgICBzb3VyY2VGaWxlVmlld2VyLnNldFNlbGVjdGlvbihkZWZhdWx0U2VsZWN0aW9uLCB0cnVlKTsgICAgICAgIAotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoIXNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotICAgICAgeyAgICAgCi0gICAgICAgIHNvdXJjZUZpbGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNvdXJjZUZpbGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpc0ZpbGVNYW5kYXRvcnkgJiYgbGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgbGlzdGVuZXIuc2V0Q29udHJvbENvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIAotICBjbGFzcyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotICB7Ci0JVmVjdG9yIGltcG9ydGVkRmlsZXM7Ci0KLQlJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCkKLQl7Ci0JICBpbXBvcnRlZEZpbGVzID0gbmV3IFZlY3RvcigpOyAKLQl9Ci0gIAotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkKLQl7Ci0JICBJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAKLQkgIHRyeQotCSAgewotCQlpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsKSAKLQkJewotCQkgIHJlc291cmNlRGVsdGEuYWNjZXB0KHRoaXMpOwotCQl9Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JCS8vVE9ETy4uLiBsb2cgZXhjZXB0aW9uCi0JCS8vVUlQbHVnaW4uZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkV4Y2VwdGlvbiBjYXVnaHQgZHVyaW5nIHJlc291cmNlIGNoYW5nZSIgKyBlKTsKLQkJLy9VSVBsdWdpbi5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsgCi0JICB9ICAgICAgCi0JfQotCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpCi0JewotCSAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKLQkgIHsKLQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkgCi0JCSAgaW1wb3J0ZWRGaWxlcy5hZGQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JICB9Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRJbXBvcnRlZEZpbGVzKCkKLQl7Ci0JICByZXR1cm4gaW1wb3J0ZWRGaWxlczsKLQl9Ci0gICAgCi0JLy8gVGhpcyByZXR1cm5zIHRoZSBmaXJzdCBpbXBvcnRlZCBmaWxlIGluIHRoZSBsaXN0IG9mIGltcG9ydGVkIGZpbGVzCi0JcHVibGljIElGaWxlIGdldEltcG9ydGVkRmlsZSgpCi0JewotCSAgaWYgKGltcG9ydGVkRmlsZXMuaXNFbXB0eSgpID09IGZhbHNlKSAKLQkJcmV0dXJuIChJRmlsZSlpbXBvcnRlZEZpbGVzLmZpcnN0RWxlbWVudCgpOwotICAKLQkgIHJldHVybiBudWxsOwotCX0KLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkVHJlZUxpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgdHJlZUxpc3RlbmVyKSB7Ci0gIAlzb3VyY2VGaWxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlTGlzdGVuZXIpOwotICB9Ci19ICAgICAgICAgICAgICAKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFibGVOYXZpZ2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmxlTmF2aWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDM3YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFibGVOYXZpZ2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotCi0KLSAgLyoqCi0gICAqIEFkZHMgYSBUYWJsZUN1cnNvciB0byBhIFN0cnVjdHVyZWRWaWV3ZXIgLSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiBvZiB0aGUgdGFibGUKLSAgICogVGhlIGludGVudCBvZiB0aGlzIGNsYXNzIGlzIHRvIHByb3ZpZGUgdGhlIHN0YW5kYXJkIGxpc3RlbmVycyBmb3IgdXNpbmcgRjIgdG8KLSAgICogYWN0aXZhdGUgY2VsbCBlZGl0b3JzLgotICAgKgotICAgKiBEdWUgdG8gYSBjdXJyZW50IGJ1ZyBpbiB0aGUgVGFibGVDdXJzb3IsIFRhYmxlVmlld2VycyB1c2luZyB0aGlzIGNsYXNzIG11c3QgbWFrZQotICAgKiBhIGNhbGwgc2ltaWxhciB0byB0aGUgVGFibGVOYXZpZ2F0b3IgbWV0aG9kIG1vdmVDZWxsRWRpdG9yc0Fib3ZlKGNlbGxFZGl0b3JzKQotICAgKiB3aGVuZXZlciBhIHNldENlbGxFZGl0b3JzIGNhbGwgaXMgbWFkZSBpbiB0aGUgU3RydWN0dXJlZFZpZXdlci4gIFRoaXMgaXMgc28gdGhhdCB0aGUKLSAgICogY2VsbCBlZGl0b3IgY29udHJvbCBzaG93cyB1cCBhYm92ZSB0aGUgdGFibGUgY3Vyc29yIGNvbnRyb2wuCi0gICAqLwotCi1wdWJsaWMgY2xhc3MgVGFibGVOYXZpZ2F0b3IgZXh0ZW5kcyBUYWJsZUN1cnNvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVUUkVFSVRFTV9JRCA9ICJUYWJsZVRyZWVJdGVtSUQiOwotCi0gICBmaW5hbCBUYWJsZSB0YWJsZTsKLQotICAgcHVibGljIFRhYmxlTmF2aWdhdG9yKFRhYmxlIHRhYmxlLCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgIHsKLSAgICAgIHN1cGVyKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICB0aGlzLnRhYmxlID0gdGFibGU7Ci0gICAgICBmaW5hbCBUYWJsZSBjdXJyZW50VGFibGUgPSB0YWJsZTsKLSAgICAgIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgc1ZpZXdlciA9IHZpZXdlcjsKLQotICAgICAgLy8gTGludXggaW5kZXggb3V0IG9mIGJvdW5kcyBmaXguICBTZWUgZGVmZWN0IDI1MzQyOSwgMjUzNDMzLCBhbmQgbW9yZQotICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0KLSAgICAgIGFkZFBhaW50TGlzdGVuZXIodmlld2VyKTsKLSAgICAgIGFkZEtleUxpc3RlbmVycyh2aWV3ZXIpOwotICAgICAgYWRkTW91c2VMaXN0ZW5lcnModmlld2VyKTsKLSAgICAgIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgIAkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCSAgICAgaWYgKHNWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlnZXRSb3coKS5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGFibGVUcmVlSXRlbS5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgIHNWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgIH0KLQkJfQotCi0KLSAgICAgIH0pOwotICAgICAgYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCl7Ci0gICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgICB7Ci0gICAgICAgICAJLy8gaWYgZS5zb3VyY2UgaXMgbm90IGEgY2hpbGQgb2YgdGhlIHRhYmxlIHRoZW4gc2V0IHNlbGVjdGlvbiAtIHRoaXMgaXMgZm9yIHRhYiBpbnRvIHZpZXdlcgotICAgICAgICAgCU9iamVjdCBldmVudFNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAJaWYgKGV2ZW50U291cmNlIGluc3RhbmNlb2YgQ29udHJvbCkKLSAgICAgICAgIAl7Ci0gICAgICAgICAJaWYgKCFpc0NoaWxkKGN1cnJlbnRUYWJsZSwgKENvbnRyb2wpZXZlbnRTb3VyY2UpKQotICAgICAgICAgCXsKLSAgICAgICAgIAkgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbUNvdW50KCkgPiAwICYmIGN1cnJlbnRUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpIDw9IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYgKHNWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlnZXRSb3coKS5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGFibGVUcmVlSXRlbS5nZXREYXRhKCkpOwotICAgICAgICAgICAgICAgICAgIHNWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICAgY3VycmVudFRhYmxlLnNldFNlbGVjdGlvbigwKTsgCi0gICAgICAgICAgICAgICAJICAgc2V0U2VsZWN0aW9uKDAsMCk7Ci0gICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAJICAgIH0KLSAgICAgICAJICAgIGVsc2UgCi0gICAgICAgCSAgICB7Ci0gICAgICAgCSAgICAgIGlmIChjdXJyZW50VGFibGUuZ2V0SXRlbXMoKS5sZW5ndGggPiAwKQotICAgICAgIAkgICAgICB7Ci0gICAgICAgCSAgICAgIAkgLy8gY3Vyc29yIGNhbiBlbmQgdXAgb24gYSBub24tZXhpc3RlbnQgdGFibGUgcm93IAotICAgICAgIAkgICAgICAgICAvLyAgIGN1cnJlbnRseSBubyB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRhYmxlIGN1cnNvciByb3cgCi0gICAgICAgCSAgICAgIAkgLy8gICBzbyBmb3Igbm93IGp1c3QgY2F0Y2ggdGhlIGV4Y2VwdGlvbiBzaW5jZSBpdCBkb2Vzbid0Ci0gICAgICAgCSAgICAgIAkgLy8gICBjYXVzZSBhbnkgc2lkZSBlZmZlY3RzLgotICAgICAgIAkgICAgICAJIHRyeQotICAgICAgIAkgICAgICAJIHsKLSAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgIAkgICAgICAJIH0KLSAgICAgICAJICAgICAgCSBjYXRjaCAoRXhjZXB0aW9uIGVlKQotICAgICAgIAkgICAgICAJIHsgICAgIAkgICAgICAgICAgICAJICAgICAgCQotICAgICAgIAkgICAgICAJCWN1cnJlbnRUYWJsZS5zZXRTZWxlY3Rpb24oMCk7ICAgICAgIAkgICAgICAJCSAgICAgICAgIAotICAgICAgIAkgICAgICAJCXNldFNlbGVjdGlvbigwLDApOwotICAgICAgIAkgICAgICAJIH0KLSAgICAgICAJICAgICAgIH0gICAgICAgCSAgICAKLSAgICAgICAJICAgICAgIGVsc2UgIC8vIGRvIG5vdCBzaG93IHRhYmxlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIHRhYmxlIC0gYXZvaWQgcmVwYWludAotICAgICAgIAkgICAgICAgewotICAgICAgIAkgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAJICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgCX0gICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ2hpbGQoQ29udHJvbCBwYXJlbnQsIENvbnRyb2wgY2hpbGQpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29udHJvbCB0ZW1wQ2hpbGQgPSBjaGlsZDsKLSAgICAgICAgICAgIHdoaWxlICh0ZW1wQ2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHRlbXBDaGlsZCA9PSBwYXJlbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB0ZW1wQ2hpbGQgPSB0ZW1wQ2hpbGQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNMb3N0KEZvY3VzRXZlbnQpCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHRhYmxlIG5hdmlnYXRvciB0byBiZSBub3QgdmlzaWJsZSBpZiB0aGUgdGhlIHRhYmxlCi0gICAgICAgICAgICAvLyBpcyBub3QgaW4gZm9jdXMgYW5kIGEgY2hpbGQgb2YgdGhlIHRhYmxlIGlzIG5vdCBpbiBmb2N1cwotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIHRoaXMgYXN5bmNocm9ub3VzbHkgc28gd2UgZG9uJ3QgbWVzcyB1cCB0aGUKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgZm9jdXMgaGFuZGxpbmcuCi0gICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGFibGUgIT0gbnVsbCAmJiAhY3VycmVudFRhYmxlLmlzRGlzcG9zZWQoKSAmJiAhY3VycmVudFRhYmxlLmlzRm9jdXNDb250cm9sKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlzQ2hpbGQoY3VycmVudFRhYmxlLCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRGb2N1c0NvbnRyb2woKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICB9Ci0KLSAgICAgIH0pOyAKLSAgICAgIAotICAgICAKLSAgICAgIAotCi0gICAgICB0YWJsZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIjZm9jdXNHYWluZWQoRm9jdXNFdmVudCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSBuYXZpZ2F0b3IgaWYgdGhlcmUgYXJlIGl0ZW1zIGluIHRoZSB0YWJsZSAKLSAgICAgICAgICAvLyBhbmQgaWYgdGhlIGZvY3VzIHdhc24ndCBnYWluZWQgZnJvbSBvdXIgb3duIHRhYmxlIG5hdmlnYXRvcgotICAgICAgICAgIC8vIChpZSBmb2N1cyBjYW1lIGZyb20gb3V0c2lkZSkKLSAgICAgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCAmJgotICAgICAgICAgICAgICAoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0Rm9jdXNDb250cm9sKCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgIURpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEZvY3VzQ29udHJvbCgpLmVxdWFscyhUYWJsZU5hdmlnYXRvci50aGlzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgd2UgZG8gdGhpcyBhc3luY2hyb25vdXNseSBzbyB3ZSBkb24ndCBtZXNzIHVwIHRoZQotICAgICAgICAgICAgLy8gY3VycmVudCBmb2N1cyBoYW5kbGluZy4KLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVmlzaWJsZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXRGb2N1cygpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdGNoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnMgaGVyZSAtIGluZGV4IG91dCBvZiBib3VuZHMgb24gdGFibGV2aWV3ZXIKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRhYmxlLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhYmxlLnNldFNlbGVjdGlvbigwKTsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oMCwwKTsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIC8vIGRvIG5vdCBzaG93IHRhYmxlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIHRhYmxlIC0gYXZvaWQgcmVwYWludAotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7ICAgICAgICAgICAKLSAgIH0KLQotICAgcHVibGljIFRhYmxlIGdldFRhYmxlKCkKLSAgIHsKLSAgICAgcmV0dXJuIHRhYmxlOwotICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFpbnRMaXN0ZW5lcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgIAotICAgICAgYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIAotICAgICAgewotICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkKLSAgICAgICAgIHsKLSAgICAgICAgIAlUYWJsZUl0ZW1bXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/IHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2VsbFRleHQgPSByb3cuZ2V0VGV4dChnZXRDb2x1bW4oKSk7Ci0gICAgICAgICAgICBmaW5hbCBJbWFnZSBjZWxsSW1hZ2UgPSByb3cuZ2V0SW1hZ2UoZ2V0Q29sdW1uKCkpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbCA9IGdldENvbHVtbigpOwotCi0gICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoIXJvdy5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHJvdy5nZXRUZXh0KGdldENvbHVtbigpKTsKLSAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3VGV4dC5lcXVhbHMoY2VsbFRleHQpIHx8ICEocm93LmdldEltYWdlKGNvbCkgPT0gY2VsbEltYWdlKSkgCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgfQotICAgICAgIH0pOwotICAgIH0KLQotCi0gICAgcHVibGljIFNlbGVjdGlvbktleUFkYXB0ZXIgZ2V0S2V5QWRhcHRlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICAgIGlmIChrZXlBZGFwdGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25LZXlBZGFwdGVyKHZpZXdlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSByZXR1cm4ga2V5QWRhcHRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXlBZGFwdGVyKFNlbGVjdGlvbktleUFkYXB0ZXIga0FkYXB0ZXIpCi0gICAgewotICAgICAgIGtleUFkYXB0ZXIgPSBrQWRhcHRlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2VsZWN0aW9uS2V5QWRhcHRlciBrZXlBZGFwdGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25LZXlBZGFwdGVyIGV4dGVuZHMgS2V5QWRhcHRlcgotICAgIHsKLSAgICAgICBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXI7Ci0KLSAgICAgICBwdWJsaWMgU2VsZWN0aW9uS2V5QWRhcHRlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICAgICB7Ci0gICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICB0aGlzLnN0cnVjdHVyZWRWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgfQotCi0gICAgICAgaW50IGxhc3RLZXlQcmVzc2VkID0gLTE7ICAvLyB1c2VkIHRvIGNhY2hlIHRoZSBsYXN0IGtleSBmb3Iga2V5IGNvbWJvcwotCi0gICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSAKLSAgICAgICB7ICAgICAgIAkKLSAgICAgICAgICAgICAgIFRhYmxlSXRlbSByb3cgPSBnZXRSb3coKTsKLSAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSBnZXRDb2x1bW4oKTsgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgIC8vIGhhY2sgdG8gZW11bGF0ZSBTSElGVCtGMTAgcG9wdXAgbWVudSAtIG90aGVyd2lzZSB0YWJsZSBjdXJzb3IKLSAgICAgICAgICAgICAgIC8vICAgb2JzY3VyZXMgdGhlIHRhYmxlIHBvcHVwIG1lY2hhbmlzbSBhbmQgaXQgZG9lc24ndCB3b3JrLgotICAgICAgICAgICAgICAgaWYgKGxhc3RLZXlQcmVzc2VkID09IFNXVC5TSElGVCAmJiBlLmtleUNvZGUgPT0gU1dULkYxMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE1lbnUgcG9wdXAgPSBnZXRUYWJsZSgpLmdldE1lbnUoKTsKLSAgICAgICAgICAgICAgICAgIHBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBsYXN0S2V5UHJlc3NlZCA9IGUua2V5Q29kZTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgLy9qdmggLSBsb29rIGZvciArIG9yIC0ga2V5Ci0gICAgICAgICAgICAgICAvLyBjb2x1bW4gPT0gMAotICAgICAgICAgICAgICAgaWYgKHJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpIGluc3RhbmNlb2YgVGFibGVUcmVlSXRlbSkKLSAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICBpZiAoY29sdW1uID09IDAgJiYgZS5jaGFyYWN0ZXIgPT0gJysnKSAKLQkgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAJICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsJICAgICAgICAgICAgICAgCQotCSAgICAgICAgICAgICAgIAkgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgCSAgcmVmcmVzaCgpOwotCSAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4gPT0gMCAmJiBlLmNoYXJhY3RlciA9PSAnLScpIAotCSAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAJICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsJICAgICAgICAgICAgICAgCQotCSAgICAgICAgICAgICAgIAkgICgoVGFibGVUcmVlVmlld2VyKXN0cnVjdHVyZWRWaWV3ZXIpLnNldEV4cGFuZGVkU3RhdGUodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2goKTsKLQkgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAvLyB1c2UgRjIgdG8gaW52b2tlIGVkaXRpbmcgZm9yIGEgY2VsbAotICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBTV1QuRjIpICAgICAKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIAkgIGlmIChzdHJ1Y3R1cmVkVmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0gICAgICAgICAgICAgICAJICB7Ci0gICAgICAgICAgICAgICAgICAgICgoVGFibGVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQocm93LmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgIAkgIGVsc2UgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIpCi0gICAgICAgICAgICAgICAJICB7ICAKLSAgICAgICAgICAgICAgIAkgIAkgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOwotICAgICAgICAgICAgICAgCSAgCSAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5lZGl0RWxlbWVudCh0YWJsZVRyZWVJdGVtLmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVycyhTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGFkZEtleUxpc3RlbmVyKGdldEtleUFkYXB0ZXIoc3RydWN0dXJlZFZpZXdlcikpOwotICAgIH0gICAgICAKLSAgICAKLSAgIHB1YmxpYyB2b2lkIGFkZE1vdXNlTGlzdGVuZXJzKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKQotICAgewotICAgICAgZmluYWwgU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyID0gdmlld2VyOwotCi0gICAgICBhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgICAgewotCi0gICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgCi0gICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgIFRhYmxlSXRlbSByb3cgPSBnZXRSb3coKTsKLSAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSBnZXRDb2x1bW4oKTsgCi0gICAgICAgICAKLSAgICAgICAgICAgICAgIC8vIHVzZSBtb3VzZSBidXR0b24gMSB0byBpbnZva2UgZWRpdGluZyBmb3IgYSBjZWxsCi0gICAgICAgICAgICAgICBpZiAoZS5idXR0b24gPT0gMSkgICAgIAotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICgoVGFibGVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQocm93LmdldERhdGEoKSwgY29sdW1uKTsgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnVjdHVyZWRWaWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVRyZWVWaWV3ZXIgJiYgY29sdW1uID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZVRyZWVJdGVtIHRhYmxlVHJlZUl0ZW0gPSAoVGFibGVUcmVlSXRlbSlyb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUYWJsZVRyZWVWaWV3ZXIpc3RydWN0dXJlZFZpZXdlcikuZWRpdEVsZW1lbnQodGFibGVUcmVlSXRlbS5nZXREYXRhKCksIGNvbHVtbik7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICBpZiAoc3RydWN0dXJlZFZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlciAmJiByb3cuZ2V0RGF0YShUQUJMRVRSRUVJVEVNX0lEKSBpbnN0YW5jZW9mIFRhYmxlVHJlZUl0ZW0pCi0gICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKXJvdy5nZXREYXRhKFRBQkxFVFJFRUlURU1fSUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZFN0YXRlID0gdGFibGVUcmVlSXRlbS5nZXRFeHBhbmRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAoKFRhYmxlVHJlZVZpZXdlcilzdHJ1Y3R1cmVkVmlld2VyKS5zZXRFeHBhbmRlZFN0YXRlKHRhYmxlVHJlZUl0ZW0uZ2V0RGF0YSgpLCAhZXhwYW5kU3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgIH0pOwotICAgICB9Ci0KLQotICAvKioKLSAgICogRW5zdXJlIHRoYXQgY2VsbCBlZGl0b3IgY29udHJvbCBzaG93cyB1cCBhYm92ZSB0aGUgdGFibGUgY3Vyc29yIGNvbnRyb2wuCi0gICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRhYmxlIHZpZXdlciBtYWtlcyBhIG5ldyBjYWxsIHRvIHNldENlbGxFZGl0b3JzCi0gICAqIGkuZS4gaW4gY29uc3RydWN0b3IgYW5kIGluIHJlZnJlc2hDZWxsRWRpdG9ycwotICAgKgotICAgKiBAcGFyYW0gLSBhcnJheSBvZiBjZWxsIGVkaXRvcnMgZm9yIHRoZSBTdHJ1Y3R1cmVkVmlld2VyCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIG1vdmVDZWxsRWRpdG9yc0Fib3ZlKENlbGxFZGl0b3JbXSBlZGl0b3JBcnJheSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yQXJyYXkubGVuZ3RoIDsgaSsrKQotICAgIHsKLSAgICAgIENlbGxFZGl0b3IgY0VkID0gZWRpdG9yQXJyYXlbaV07Ci0gICAgICBpZiAoY0VkICE9IG51bGwgJiYgY0VkLmdldENvbnRyb2woKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjRWQuZ2V0Q29udHJvbCgpLm1vdmVBYm92ZShudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICghaXNEaXNwb3NlZCgpICYmIGlzVmlzaWJsZSgpKQotICAgICAgICAgICAgIHJlZHJhdygpOwotICAgICAgICB9Ci0gICAgIH0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZUVkaXRvclNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyODBjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3Zpc2lvbmFsLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBObyBsb25nZXIgbmVjZXNzYXJ5IGFzIG9mIDMuMk0zLgotICovCi1wdWJsaWMgY2xhc3MgUG9zdE11bHRpUGFnZUVkaXRvclNpdGUgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JTaXRlIHsKLQkvKioKLQkgKiBUaGUgcG9zdCBzZWxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyLCBpbml0aWFsaXplZCBsYXppbHk7Ci0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHlldCBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbnVsbDsKLQotCXB1YmxpYyBQb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZShNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvciwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXN1cGVyKG11bHRpUGFnZUVkaXRvciwgZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lciB3aGljaCBsaXN0ZW5zIHRvIHRoZSBuZXN0ZWQKLQkgKiBlZGl0b3IncyBwb3N0IHNlbGVjdGlvbiBjaGFuZ2VzLCBhbmQgY2FsbHMKLQkgKiA8Y29kZT5oYW5kbGVQb3N0U2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXIKLQkgKi8KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJaWYgKHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCVBvc3RNdWx0aVBhZ2VFZGl0b3JTaXRlLnRoaXMuaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIHBvc3Qgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgZnJvbSB0aGUgbmVzdGVkIGVkaXRvci4gVGhlCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBnZXRzIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIgZnJvbSB0aGUgbXVsdGktcGFnZQotCSAqIGVkaXRvcidzIHNpdGUsIGFuZCBjYWxscyA8Y29kZT5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+IG9uIGl0Ci0JICogKG9ubHkgaWYgaXQgaXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI8L2NvZGU+KSwKLQkgKiBwYXNzaW5nIGEgbmV3IGV2ZW50IG9iamVjdC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgb3IgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBwYXJlbnRQcm92aWRlciA9IGdldE11bHRpUGFnZUVkaXRvcigpLmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlpZiAocGFyZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBuZXdFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQocGFyZW50UHJvdmlkZXIsIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCSgoUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBwYXJlbnRQcm92aWRlcikuZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKG5ld0V2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JTaXRlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICogPGNvZGU+SVdvcmtiZW5jaFBhcnRTaXRlPC9jb2RlPiBtZXRob2QgcmVtZW1iZXJzIHRoZSBzZWxlY3Rpb24KLQkgKiBwcm92aWRlciwgYW5kIGFsc28gaG9va3MgYSBsaXN0ZW5lciBvbiBpdCwgd2hpY2ggY2FsbHMKLQkgKiA8Y29kZT5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPiB3aGVuIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQKLQkgKiBvY2N1cnMgYW5kIDxjb2RlPmhhbmRsZVBvc3RTZWxlY3Rpb25DaGFuZ2VkPC9jb2RlPiB3aGVuIGEgcG9zdAotCSAqIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IG9jY3Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdmlkZXIKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICogQHNlZSBQb3N0TXVsdGlQYWdlRWRpdG9yU2l0ZSNoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIG9sZFNlbGVjdGlvblByb3ZpZGVyID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKG9sZFNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChvbGRTZWxlY3Rpb25Qcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIG9sZFNlbGVjdGlvblByb3ZpZGVyKS5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGdldFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5zZXRTZWxlY3Rpb25Qcm92aWRlcihwcm92aWRlcik7Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGdldFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9wcm92aXNpb25hbC9lZGl0b3JzL1Bvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGY5MDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm92aXNpb25hbC5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBObyBsb25nZXIgbmVjZXNzYXJ5IGFzIG9mIDMuMk0zLgotICovCi1wdWJsaWMgY2xhc3MgUG9zdE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIGV4dGVuZHMgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJUG9zdFNlbGVjdGlvblByb3ZpZGVyIHsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBwb3N0TGlzdGVuZXJzOwotCi0JcHVibGljIFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcihNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvcikgewotCQlzdXBlcihtdWx0aVBhZ2VFZGl0b3IpOwotCQlwb3N0TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlwb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBwb3N0TGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBwbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQlQbGF0Zm9ybS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXBsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXBvc3RMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0U2VsZWN0aW9uTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL3Byb3Zpc2lvbmFsL2VkaXRvcnMvUG9zdFNlbGVjdGlvbk11bHRpUGFnZUVkaXRvclBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMmYwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvcHJvdmlzaW9uYWwvZWRpdG9ycy9Qb3N0U2VsZWN0aW9uTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvdmlzaW9uYWwuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci0KLS8qKgotICogQWRkcyBwb3N0cyBzZWxlY3Rpb24gbm90aWZpY2F0aW9ucyBmcm9tIGNvbnRhaW5lZCBlZGl0b3IgcGFydHMgdG8KLSAqIGxpc3RlbmVycy4gVGhpcyBwYXJ0IHdhcyBjcmVhdGVkIGFzIGEgd29ya2Fyb3VuZCBmb3IKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDgzMjQgYW5kIHdpbGwgYmUgcmVtb3ZlZAotICogb25jZSBXVFAgaXMgYnVpbGRpbmcgb24gYSBwbGF0Zm9ybSBtaWxlc3RvbmUgdGhhdCBpbmNsdWRlcyBhIGZpeC4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSBObyBsb25nZXIgbmVjZXNzYXJ5IGFzIG9mIDMuMk0zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9zdFNlbGVjdGlvbk11bHRpUGFnZUVkaXRvclBhcnQgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIobmV3IFBvc3RNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcih0aGlzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gZ2V0RWRpdG9yKG5ld1BhZ2VJbmRleCk7Ci0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yLmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJKChQb3N0TXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQzMzYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXVyaXJlc29sdmVyLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcl8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5YjY5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGEwZDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIEphbiAzMCAxOTo0ODowNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYzdiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL1JFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhZjUxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQSSBmb3IgYW4gVVJJIHJlc29sdmVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWE5OGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNzY2NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1Db21tb24gVVJJIFJlc29sdmVyIEZyYW1ld29yawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1yZXNvbHZlckV4dGVuc2lvbnM9VVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgUG9pbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE5OWM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc29sdmVyRXh0ZW5zaW9ucyIgbmFtZT0iJXJlc29sdmVyRXh0ZW5zaW9ucyIgc2NoZW1hPSJzY2hlbWEvcmVzb2x2ZXJFeHRlbnNpb25zLmV4c2QiLz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zY2hlbWEvcmVzb2x2ZXJFeHRlbnNpb25zLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc2NoZW1hL3Jlc29sdmVyRXh0ZW5zaW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJiYjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zY2hlbWEvcmVzb2x2ZXJFeHRlbnNpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIgaWQ9InJlc29sdmVyRXh0ZW5zaW9ucyIgbmFtZT0iVVJJIFJlc29sdmVyIEV4dGVuc2lvbnMgUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIFVSSSBSZXNvbHZlciBFeHRlbnNpb25zIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIHJlZ2lzdGVyIGN1c3RvbSBVUkkgcmVzb2x2ZXJzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSByZXNvbHV0aW9uIG9mIHJlc291cmNlcyBieSB0b29scyBzdWNoIGFzIGVkaXRvcnMsIGdlbmVyYXRvcnMsIHZhbGlkYXRvcnMsIGFuZCB3aXphcmRzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvbHZlckV4dGVuc2lvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVzb2x2ZXJFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9qZWN0TmF0dXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFnZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgc3RhZ2UgaW4gd2hpY2ggdG8gcnVuIHRoaXMgZXh0ZW5zaW9uIHJlc29sdmVyOiBwcmVub3JtYWxpemF0aW9uLCBwb3N0bm9ybWFsaXphdGlvbiwgb3IgcGh5c2ljYWwuIERlZmF1bHRzIHRvIHBvc3Rub3JtYWxpemF0aW9uLiZsdDticiZndDsKLXByZW5vcm1hbGl6YXRpb246ICBydW4gYmVmb3JlIG5vcm1hbGl6YXRpb24gb2YgdGhlIGlucHV0Jmx0O2JyJmd0OwotcG9zdG5vcm1hbGl6YXRpb246IHJ1biBhZnRlciBub3JtYWxpemF0aW9uIG9mIHRoZSBpbnB1dCZsdDticiZndDsKLXBoeXNpY2FsOiAgICAgICAgICBydW4gYWZ0ZXIgYWxsIHByZSBhbmQgcG9zdG5vcm1hbGl6YXRpb24gcmVzb2x2ZXJzCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcHJpb3JpdHkgb2YgdGhpcyByZXNvbHZlcjogaGlnaCwgbWVkaXVtLCBvciBsb3cuIERlZmF1bHRzIHRvIG1lZGl1bS4gVGhlIHByaW9yaXR5IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGVuIHRoaXMgcmVzb2x2ZXIgc2hvdWxkIHJ1biB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgcmVzb2x2ZXJzIGRlZmluZWQgZm9yIHRoZSBzYW1lIHN0YWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0TmF0dXJlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBJZiBhIHByb2plY3QgbmF0dXJlIGlzIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgb25seSBiZSB1c2VkIGZvciBwcm9qZWN0cyB0aGF0IGNvbnRhaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBuYXR1cmVzLiBJZiBubyBwcm9qZWN0IG5hdHVyZXMgYXJlIHNwZWNpZmllZCB0aGUgVVJJIHJlc29sdmVyIHdpbGwgYmUgdXNlZCBmb3IgYWxsIHByb2plY3RzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHByb2plY3QgbmF0dXJlIElEIGZvciB3aGljaCB0aGUgVVJJIHJlc29sdmVyIHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIFVSSSByZXNvbHZlciBjb250cmlidXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSZxdW90O3BoeXNpY2FsJnF1b3Q7Ci0gICAgICAgICAgICBwcmlvcml0eT0mcXVvdDtsb3cmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuU2FtcGxlUmVzb2x2ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L3Jlc29sdmVyRXh0ZW5zaW9uJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgc3VwcGxpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtjb2RlJmd0Owotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVzb2x2ZXIKLSZsdDsvY29kZSZndDsKLXByb3ZpZGVzIGFuIFVSSSByZXNvbHZlciB0aGF0IHJlc29sdmVzIHJlZmVyZW5jZXMgaW4gYSBwcm9qZWN0IHdpdGggbXVsdGlwbGUgY29tcG9uZW50cwotJmx0O2NvZGUmZ3Q7Ci1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBhIGNhY2hlCi0mbHQ7Y29kZSZndDsKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbgotJmx0Oy9jb2RlJmd0OwotcHJvdmlkZXMgYW4gVVJJIHJlc29sdmVyIHRoYXQgcmVzb2x2ZXMgcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCBjYXRhbG9nCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9FeHRlbnNpYmxlVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMmMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvRXh0ZW5zaWJsZVVSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIEBhdXRob3IgY3NhbHRlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9nRXhjZXB0aW9ucyA9IGZhbHNlOwotCi0JLy9wcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCS8vVE9ETy4uLiBjb25zaWRlciBjdG9yIHRoYXQgdGFrZXMgYSBwcm9qZWN0IGFyZwotCS8vcHVibGljIEV4dGVuc2libGVVUklSZXNvbHZlcihJUHJvamVjdCBwcm9qZWN0KQotCS8vewotCS8vCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JLy99Ci0KLQlwdWJsaWMgRXh0ZW5zaWJsZVVSSVJlc29sdmVyKCkKLQl7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCXsKLQkJU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotCi0JCS8vIGNvbXB1dGUgdGhlIHByb2plY3QgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UKLQkJLy8KLSAgICBJRmlsZSBmaWxlID0gY29tcHV0ZUZpbGUoYmFzZUxvY2F0aW9uKTsKLQkJSVByb2plY3QgcHJvamVjdCA9ICBmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGw7Ci0KLQkJVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeSByZXNvbHZlclJlZ2lzdHJ5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnRhbmNlKCk7Ci0JCUxpc3QgbGlzdCA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uRGVzY3JpcHRvcnMocHJvamVjdCk7Ci0KLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcHJlLW5vcm1hbGl6ZWQgcmVzb2x2ZXJzIGZyb20gdGhlCi0JCS8vIGV4dGVuc2lvbiByZWdpc3RyeQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUFJFTk9STUFMSVpBVElPTikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGVtcHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoZmlsZSwgYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgcmVzdWx0KTsKLQkJCWlmKHRlbXByZXN1bHQgIT0gbnVsbCkKLQkJCXsKLQkJCSAgcmVzdWx0ID0gdGVtcHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCS8vIG5vcm1hbGl6ZSB0aGUgdXJpCi0JCS8vCi0JCXJlc3VsdCA9IG5vcm1hbGl6ZShiYXNlTG9jYXRpb24sIHJlc3VsdCk7Ci0KLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcG9zdC1ub3JtYWxpemVkIHJlc29sdmVycyBmcm9tIHRoZQotCQkvLyBleHRlbnNpb24gcmVnaXN0cnkKLQkJLy8JCQotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUE9TVE5PUk1BTElaQVRJT04pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJeyAKLQkJCVVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyID0gKFVSSVJlc29sdmVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0ZW1wcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShmaWxlLCBiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCByZXN1bHQpOwotCQkJaWYodGVtcHJlc3VsdCAhPSBudWxsKQotCQkJewotCQkJICByZXN1bHQgPSB0ZW1wcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBsb2dpY2FsTG9jYXRpb24pCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IGxvZ2ljYWxMb2NhdGlvbjsKLSAgICAgIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVzb2x2ZXJSZWdpc3RyeSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW50YW5jZSgpOwotICAgICAgSUZpbGUgZmlsZSA9IGNvbXB1dGVGaWxlKGJhc2VMb2NhdGlvbik7Ci0gICAgICAKLSAgICAgIC8vIGNvbXB1dGUgdGhlIHByb2plY3QgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UKLSAgICAgIC8vICAgICAgCi0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gIGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbDsgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IHJlc29sdmVyUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uRGVzY3JpcHRvcnMocHJvamVjdCk7ICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlclJlZ2lzdHJ5LmdldE1hdGNoaW5nVVJJUmVzb2x2ZXJzKGxpc3QsIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUEhZU0lDQUwpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGFwcGxpY2FibGUgcGh5c2ljYWwgcmVzb2x2ZXJzIGZyb20gdGhlIGV4dGVuc2lvbiByZWdpc3RyeQotICAgICAgICAvLwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBVUklSZXNvbHZlckV4dGVuc2lvbiByZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHRlbXByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGZpbGUsIGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHJlc3VsdCk7Ci0gICAgICAgICAgaWYodGVtcHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRlbXByZXN1bHQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotCi0JcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHN5c3RlbUlkKQotCXsKLQkgIC8vIElmIG5vIHN5c3RlbUlkIGhhcyBiZWVuIHNwZWNpZmllZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0JICAvLyBzbyByZXR1cm4gbnVsbDsKLQkgIGlmKHN5c3RlbUlkID09IG51bGwpCi0JICAgIHJldHVybiBudWxsOwotCSAgU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotICAgICAgCi0gICAgICAvLyBjcyA6IHNvbWV0aW1lcyBub3JtYWxpemluZyB0aGUgVVJJIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGdldCB0aHJvd24KLSAgICAgIC8vIGZvciBleGFtcGxlIHRoZSAnYmFkJyB2ZXJzaW9uIG9mIHRoZSBVUkkgYmVsb3cgLi4uCi0gICAgICAvLwotICAgICAgLy8gICBnb29kID0gImphcjovcmVzb3VyY2UvcHJvamVjdC1uYW1lL1dlYkNvbnRlbnQvV0VCLUlORi9saWIvZ2VuZXJhdG9yLmphciEvTUVUQS1JTkYvc2NoZW1hL2NvbmZpZy5kdGQiCi0gICAgICAvLyAgIGJhZCAgPSAiamFyOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvV2ViQ29udGVudC9XRUItSU5GL2xpYi9nZW5lcmF0b3IuamFyL01FVEEtSU5GL3NjaGVtYS9jb25maWcuZHRkIgotICAgICAgLy8KLSAgICAgIC8vIEhlcmUgd2UgZW5jbG9zZSB0aGUgbm9ybWFsaXphdGlvbiBpbiBhIHRyeS9jYXRjaCBibG9jayB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGNhbGxlcgotICAgICAgLy8gKGkuZS4gdGhlICdyZXNvbHZlJyBtZXRob2QpIGlzbid0IGludGVyZXN0ZWQgaW4gaGFuZGxpbmcgdGhpcyBleGNlcHRpb24uICAgICAgICAKLQkgIHRyeQotCSAgewotCSAgICAvLyBub3JtYWxpemUgdGhlIFVSSQotCSAgICBVUkkgc3lzdGVtVVJJID0gVVJJLmNyZWF0ZVVSSShzeXN0ZW1JZCk7Ci0JICAgIGlmIChzeXN0ZW1VUkkuaXNSZWxhdGl2ZSgpKQotCSAgICB7Ci0JICAgICAgYmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnJlcGxhY2UoJ1xcJywnLycpOwotCSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOwotICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE8gKGNzKSB3ZSBzaG91bGQgYWRkIG1vcmUgY29tbWVudHMgdG8gZXhwbGFpbiB0aGlzIGluIGEgYml0IG1vcmUgZGV0YWlsCi0JICAgICAgdHJ5Ci0JICAgICAgewotCSAgICAgICAgcmVzdWx0ID0gc3lzdGVtVVJJLnJlc29sdmUoYmFzZVVSSSkudG9TdHJpbmcoKTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICBCdW5kbGUgYnVuZGxlID0gVVJJUmVzb2x2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKTsKLQkgICAgICAgIElTdGF0dXMgc3RhdHVzT2JqID0gbnVsbDsKLQkgICAgICAgIGphdmEubmV0LlVSSSBiYXNlVVJJMiA9IG51bGw7Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBiYXNlVVJJMiA9IGphdmEubmV0LlVSSS5jcmVhdGUoYmFzZUxvY2F0aW9uKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZTIpIHsKLQkgICAgICAgICAgaWYobG9nRXhjZXB0aW9ucykgewotCSAgICAgICAgICAgIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSBpbiBjcmVhdGluZyBqYXZhLm5ldC5VUkkgaW4gRXh0ZW5zaWJsZVVSSVJlc29sdmVyOiIgKyBlMi5nZXRNZXNzYWdlKCksIGUyKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgIFBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBpZihiYXNlVVJJMiAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgamF2YS5uZXQuVVJJIHJlc3VsdFVSSSA9IGJhc2VVUkkyLnJlc29sdmUoc3lzdGVtSWQpOwotCSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFVSSS50b1N0cmluZygpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUyKSB7Ci0JICAgICAgICAgIGlmKGxvZ0V4Y2VwdGlvbnMpIHsKLQkgICAgICAgICAgICBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgIlByb2JsZW0gaW4gcmVzb2x2aW5nIHdpdGggamF2YS5uZXQuVVJJIGluIEV4dGVuc2libGVVUklSZXNvbHZlcjoiICsgZTIuZ2V0TWVzc2FnZSgpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgIFBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7ICAgICAKLSAgICAgICAgLy8ganVzdCBlYXQgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGJhY2sgdGhlIG9yaWdpbmFsIHN5c3RlbUlkCi0JICB9Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLQotICBwcm90ZWN0ZWQgSUZpbGUgY29tcHV0ZUZpbGUoU3RyaW5nIGJhc2VMb2NhdGlvbikKLSAgewotICAgIElGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGF0dGVybiA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICAgIHsKLSAgICAgICAgYmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnN1YnN0cmluZyhwYXR0ZXJuLmxlbmd0aCgpKTsKLSAgICAgIH0KLSAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZTsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZDIwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpLCBhcyBzcGVjaWZpZWQgYnkKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5SRkMgMjM5NjwvYT4sIHdpdGggY2VydGFpbgotICogZW5oYW5jZW1lbnRzLiAgQSA8Y29kZT5VUkk8L2NvZGU+IGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIGJ5IHNwZWNpZnlpbmcKLSAqIHZhbHVlcyBmb3IgaXRzIGNvbXBvbmVudHMsIG9yIGJ5IHByb3ZpZGluZyBhIHNpbmdsZSBVUkkgc3RyaW5nLCB3aGljaCBpcwotICogcGFyc2VkIGludG8gaXRzIGNvbXBvbmVudHMuICBTdGF0aWMgZmFjdG9yeSBtZXRob2RzIHdob3NlIG5hbWVzIGJlZ2luCi0gKiB3aXRoICJjcmVhdGUiIGFyZSB1c2VkIGZvciBib3RoIGZvcm1zIG9mIG9iamVjdCBjcmVhdGlvbi4gIE5vIHB1YmxpYyBvcgotICogcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgcHJvdmlkZWQ7IHRoaXMgY2xhc3MgY2FuIG5vdCBiZSBzdWJjbGFzc2VkLgotICoKLSAqIDxwPkxpa2UgPGNvZGU+U3RyaW5nPC9jb2RlPiwgPGNvZGU+VVJJPC9jb2RlPiBpcyBhbiBpbW11dGFibGUgY2xhc3M7Ci0gKiBhIDxjb2RlPlVSSTwvY29kZT4gaW5zdGFuY2Ugb2ZmZXJzIHNldmVyYWwgYnktdmFsdWUgbWV0aG9kcyB0aGF0IHJldHVybiBhCi0gKiBuZXcgPGNvZGU+VVJJPC9jb2RlPiBvYmplY3QgYmFzZWQgb24gaXRzIGN1cnJlbnQgc3RhdGUuICBNb3N0IHVzZWZ1bCwKLSAqIGEgcmVsYXRpdmUgPGNvZGU+VVJJPC9jb2RlPiBjYW4gYmUge0BsaW5rICNyZXNvbHZlKFVSSSkgcmVzb2x2ZX1kIGFnYWluc3QKLSAqIGEgYmFzZSBhYnNvbHV0ZSA8Y29kZT5VUkk8L2NvZGU+IC0tIHRoZSBsYXR0ZXIgdHlwaWNhbGx5IGlkZW50aWZpZXMgdGhlCi0gKiBkb2N1bWVudCBpbiB3aGljaCB0aGUgZm9ybWVyIGFwcGVhcnMuICBUaGUgaW52ZXJzZSB0byB0aGlzIGlzIHtAbGluawotICogI2RlcmVzb2x2ZShVUkkpIGRlcmVzb2x2ZX0sIHdoaWNoIGFuc3dlcnMgdGhlIHF1ZXN0aW9uLCAid2hhdCByZWxhdGl2ZQotICogVVJJIHdpbGwgcmVzb2x2ZSwgYWdhaW5zdCB0aGUgZ2l2ZW4gYmFzZSwgdG8gdGhpcyBhYnNvbHV0ZSBVUkk/IgotICoKLSAqIDxwPkluIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDPC9hPiwgbXVjaAotICogYXR0ZW50aW9uIGlzIGZvY3VzZWQgb24gYSBoaWVyYXJjaGljYWwgbmFtaW5nIHN5c3RlbSB1c2VkIHdpZGVseSB0bwotICogbG9jYXRlIHJlc291cmNlcyB2aWEgY29tbW9uIHByb3RvY29scyBzdWNoIGFzIEhUVFAsIEZUUCwgYW5kIEdvcGhlciwgYW5kCi0gKiB0byBpZGVudGlmeSBmaWxlcyBvbiBhIGxvY2FsIGZpbGUgc3lzdGVtLiAgQWNvcmRpbmdseSwgbW9zdCBvZiB0aGlzCi0gKiBjbGFzcydzIGZ1bmN0aW9uYWxpdHkgaXMgZm9yIGhhbmRsaW5nIHN1Y2ggVVJJcywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQKLSAqIHZpYSB7QGxpbmsgI2lzSGllcmFyY2hpY2FsIGlzSGllcmFyY2hpY2FsfS4KLSAqCi0gKiA8cD48YSBuYW1lPSJkZXZpY2VfZXhwbGFuYXRpb24iPgotICogVGhlIHByaW1hcnkgZW5oYW5jZW1lbnQgYmV5b25kIHRoZSBSRkMgZGVzY3JpcHRpb24gaXMgYW4gb3B0aW9uYWwKLSAqIGRldmljZSBjb21wb25lbnQuICBJbnN0ZWFkIG9mIHRyZWF0aW5nIHRoZSBkZXZpY2UgYXMganVzdCBhbm90aGVyIHNlZ21lbnQKLSAqIGluIHRoZSBwYXRoLCBpdCBjYW4gYmUgc3RvcmVkIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50IChhbG1vc3QgYQotICogc3ViLWF1dGhvcml0eSksIHdpdGggdGhlIHJvb3QgYmVsb3cgaXQuICBGb3IgZXhhbXBsZSwgcmVzb2x2aW5nCi0gKiA8Y29kZT4vYmFyPC9jb2RlPiBhZ2FpbnN0IDxjb2RlPmZpbGU6Ly8vYzovZm9vPC9jb2RlPiB3b3VsZCByZXN1bHQgaW4KLSAqIDxjb2RlPmZpbGU6Ly8vYzovYmFyPC9jb2RlPiBiZWluZyByZXR1cm5lZC4gIEFsc28sIHlvdSBjYW5ub3QgdGFrZQotICogdGhlIHBhcmVudCBvZiBhIGRldmljZSwgc28gcmVzb2x2aW5nIDxjb2RlPi4uPC9jb2RlPiBhZ2FpbnN0Ci0gKiA8Y29kZT5maWxlOi8vL2M6LzwvY29kZT4gd291bGQgbm90IHlpZWxkIDxjb2RlPmZpbGU6Ly8vPC9jb2RlPiwgYXMgeW91Ci0gKiBtaWdodCBleHBlY3QuICBUaGlzIGZlYXR1cmUgaXMgdXNlZnVsIHdoZW4gd29ya2luZyB3aXRoIGZpbGUtc2NoZW1lCi0gKiBVUklzLCBhcyBkZXZpY2VzIGRvIG5vdCB0eXBpY2FsbHkgb2NjdXIgaW4gcHJvdG9jb2wtYmFzZWQgb25lcy4gIEEKLSAqIGRldmljZS1lbmFibGVkIDxjb2RlPlVSSTwvY29kZT4gaXMgY3JlYXRlZCBieSBwYXJzaW5nIGEgc3RyaW5nIHdpdGgKLSAqIHtAbGluayAjY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfTsgaWYgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlIHBhdGgKLSAqIGVuZHMgd2l0aCB0aGUgPGNvZGU+OjwvY29kZT4gY2hhcmFjdGVyLCBpdCBpcyBzdG9yZWQgKGluY2x1ZGluZyB0aGUgY29sb24pCi0gKiBhcyB0aGUgZGV2aWNlLCBpbnN0ZWFkLiAgQWx0ZXJuYXRlbHksIGVpdGhlciB0aGUge0BsaW5rCi0gKiAjY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKSBuby1wYXRofQotICogb3IgdGhlIHtAbGluayAjY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdLAotICogU3RyaW5nLCBTdHJpbmcpIGFic29sdXRlLXBhdGh9IGZvcm0gb2YgPGNvZGU+Y3JlYXRlSGllcmFyY2hpY2FsVVJJKCk8L2NvZGU+Ci0gKiBjYW4gYmUgdXNlZCwgaW4gd2hpY2ggYSBub24tbnVsbCA8Y29kZT5kZXZpY2U8L2NvZGU+IHBhcmFtZXRlciBjYW4gYmUKLSAqIHNwZWNpZmllZC4KLSAqCi0gKiA8cD48YSBuYW1lPSJhcmNoaXZlX2V4cGxhbmF0aW9uIj4gCi0gKiBUaGUgb3RoZXIgZW5oYW5jZW1lbnQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGFsbW9zdC1oaWVyYXJjaGljYWwKLSAqIGZvcm0gdXNlZCBmb3IgZmlsZXMgd2l0aGluIGFyY2hpdmVzLCBzdWNoIGFzIHRoZSBKQVIgc2NoZW1lLCBkZWZpbmVkCi0gKiBmb3IgdGhlIEphdmEgUGxhdGZvcm0gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawotICogamF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbn0uIEJ5IGRlZmF1bHQsIHRoaXMgc3VwcG9ydCBpcyBlbmFibGVkIGZvcgotICogYWJzb2x1dGUgVVJJcyB3aXRoIHNjaGVtZSBlcXVhbCB0byAiamFyIiwgInppcCIsIG9yICJhcmNoaXZlIiAoaWdub3JpbmcgY2FzZSksIGFuZAotICogaXMgaW1wbGVtZW50ZWQgYnkgYSBoaWVyYXJjaGljYWwgVVJJLCB3aG9zZSBhdXRob3JpdHkgaW5jbHVkZXMgdGhlCi0gKiBlbnRpcmUgVVJJIG9mIHRoZSBhcmNoaXZlLCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSA8Y29kZT4hPC9jb2RlPgotICogY2hhcmFjdGVyLiAgVGhlIFVSSSBvZiB0aGUgYXJjaGl2ZSBtdXN0IGhhdmUgbm8gZnJhZ21lbnQuICBUaGUgd2hvbGUKLSAqIGFyY2hpdmUgVVJJIG11c3QgaGF2ZSBubyBkZXZpY2UgYW5kIGFuIGFic29sdXRlIHBhdGguICBTcGVjaWFsIGhhbmRsaW5nCi0gKiBpcyBzdXBwb3J0ZWQgZm9yIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0aW5nfSwge0BsaW5rCi0gKiAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5IHZhbGlkYXRpbmd9LCB7QGxpbmsgI2RldmljZVBhdGggZ2V0dGluZyB0aGUgcGF0aH0KLSAqIGZyb20sIGFuZCB7QGxpbmsgI3RvU3RyaW5nIGRpc3BsYXlpbmd9IGFyY2hpdmUgVVJJcy4gSW4gYWxsIG90aGVyCi0gKiBvcGVyYXRpb25zLCBpbmNsdWRpbmcge0BsaW5rICNyZXNvbHZlKFVSSSkgcmVzb2x2aW5nfSBhbmQge0BsaW5rCi0gKiAjZGVyZXNvbHZlKFVSSSkgZGVyZXNvbHZpbmd9LCB0aGV5IGFyZSBoYW5kbGVkIGxpa2UgYW55IG9yZGluYXJ5IFVSSS4KLSAqCi0gKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGltcG9zZSB0aGUgYWxsIG9mIHRoZSByZXN0cmljdGlvbnMgb24KLSAqIGNoYXJhY3RlciB2YWxpZGl0eSB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIFJGQy4gIFN0YXRpYyBtZXRob2RzIHdob3NlCi0gKiBuYW1lcyBiZWdpbiB3aXRoICJ2YWxpZCIgYXJlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGlzIHZhbGlkCi0gKiB2YWx1ZSBmb3IgdGhlIHZhcmlvdXMgVVJJIGNvbXBvbmVudHMuICBQcmVzZW50bHksIHRoZXNlIHRlc3RzIHBsYWNlIG5vCi0gKiByZXN0cmljdGlvbnMgYmV5b25kIHdoYXQgd291bGQgaGF2ZSBiZWVuIHJlcXVpcmVkIGluIG9yZGVyIGZvciB7QGxpbmsKLSAqIGNyZWF0ZVVSSShTdHJpbmcpIGNyZWF0ZVVSSX0gdG8gaGF2ZSBwYXJzZWQgdGhlbSBjb3JyZWN0bHkgZnJvbSBhIHNpbmdsZQotICogVVJJIHN0cmluZy4gIElmIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlLCB0aGVzZSB0ZXN0cyBtYXkgYmUgbWFkZSBtb3JlCi0gKiBzdHJpY3QsIHRvIGJldHRlciBjb2Zvcm0gdG8gdGhlIFJGQy4KLSAqIAotICogPHA+QW5vdGhlciBncm91cCBvZiBzdGF0aWMgbWV0aG9kcywgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCAiZW5jb2RlIiwgdXNlCi0gKiBwZXJjZW50IGVzY2FwaW5nIHRvIGVuY29kZSBhbnkgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcGVybWl0dGVkIGluIHRoZQotICogdmFyaW91cyBVUkkgY29tcG9uZW50cy4gQW5vdGhlciBzdGF0aWMgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIHtAbGluawotICogI2RlY29kZSBkZWNvZGV9IGVuY29kZWQgc3RyaW5ncy4gIEFuIGVzY2FwZWQgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGFzCi0gKiBhIHBlcmNlbnQgc3lib2wgKDxjb2RlPiU8L2NvZGU+KSwgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMgdGhhdCBzcGVjaWZ5Ci0gKiB0aGUgY2hhcmFjdGVyIGNvZGUuICBUaGVzZSBlbmNvZGluZyBtZXRob2RzIGFyZSBtb3JlIHN0cmljdCB0aGFuIHRoZQotICogdmFsaWRhdGlvbiBtZXRob2RzIGRlc2NyaWJlZCBhYm92ZS4gIFRoZXkgZW5zdXJlIHZhbGlkaXR5IGFjY29yZGluZyB0byB0aGUKLSAqIFJGQywgd2l0aCBvbmUgZXhjZXB0aW9uOiBub24tQVNDSUkgY2hhcmFjdGVycy4KLSAqCi0gKiA8cD5UaGUgUkZDIGFsbG93cyBvbmx5IGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgbWFwcGVkIHRvIDctYml0IFVTLUFTQ0lJCi0gKiByZXByZXNlbnRhdGlvbnMuICBOb24tQVNDSUksIHNpbmdsZS1ieXRlIGNoYXJhY3RlcnMgY2FuIGJlIHVzZWQgb25seSB2aWEKLSAqIHBlcmNlbnQgZXNjYXBpbmcsIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBKYXZhJ3MKLSAqIFVuaWNvZGUgPGNvZGU+Y2hhcjwvY29kZT4gYW5kIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50YXRpb25zLCBhbmQKLSAqIG1ha2VzIG5vIGF0dGVtcHQgdG8gZW5jb2RlIGNoYXJhY3RlcnMgMHhBMCBhbmQgYWJvdmUuICBDaGFyYWN0ZXJzIGluIHRoZQotICogcmFuZ2UgMHg4MC0weDlGIGFyZSBzdGlsbCBlc2NhcGVkLiAgSW4gdGhpcyByZXNwZWN0LCB0aGlzIG5vdGlvbiBvZiBhIFVSSQotICogaXMgYWN0dWFsbHkgbW9yZSBsaWtlIGFuIElSSSAoSW50ZXJuYXRpb25hbGl6ZWQgUmVzb3VyY2UgSWRlbnRpZmllciksIGZvcgotICogd2hpY2ggYW4gUkZDIGlzIG5vdyBpbiA8aHJlZj0iaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9pcmktZWRpdC9kcmFmdC1kdWVyc3QtaXJpLTA5LnR4dCI+ZHJhZnQKLSAqIGZvcm08L2E+LgotICoKLSAqIDxwPkZpbmFsbHksIG5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIDxjb2RlPm51bGw8L2NvZGU+IHBhcmFtZXRlciB0bwotICogdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgYW5kIGFuIGVtcHR5IHN0cmluZy4gIFRoZSBmb3JtZXIgc2lnbmlmaWVzIHRoZQotICogYWJzZW5zZSBvZiBhIGdpdmVuIFVSSSBjb21wb25lbnQsIHdoaWxlIHRoZSBsYXR0ZXIgc2ltcGx5IG1ha2VzIHRoZQotICogY29tcG9uZW50IGJsYW5rLiAgVGhpcyBjYW4gaGF2ZSBhIHNpZ25pZmljYW50IGVmZmVjdCB3aGVuIHJlc29sdmluZy4gIEZvcgotICogZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gVVJJczogPGNvZGU+L2JhcjwvY29kZT4gKHdpdGggbm8KLSAqIGF1dGhvcml0eSkgYW5kIDxjb2RlPi8vL2JhcjwvY29kZT4gKHdpdGggYSBibGFuayBhdXRob3JpdHkpLiAgSW1hZ2luZQotICogcmVzb2x2aW5nIHRoZW0gYWdhaW5zdCBhIGJhc2Ugd2l0aCBhbiBhdXRob3JpdHksIHN1Y2ggYXMKLSAqIDxjb2RlPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9jb2RlPi4gIFRoZSBmb3JtZXIgY2FzZSB3aWxsIHlpZWxkCi0gKiA8Y29kZT5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2JhcjwvY29kZT4sIGFzIHRoZSBiYXNlIGF1dGhvcml0eSB3aWxsIGJlCi0gKiBwcmVzZXJ2ZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBlbXB0eSBhdXRob3JpdHkgd2lsbCBvdmVycmlkZSB0aGUKLSAqIGJhc2UgYXV0aG9yaXR5LCByZXN1bHRpbmcgaW4gPGNvZGU+aHR0cDovLy9iYXI8L2NvZGU+IQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVVJJCi17Ci0gIC8vIENvbW1vbiB0byBhbGwgVVJJIHR5cGVzLgotICBwcml2YXRlIGZpbmFsIGludCBoYXNoQ29kZTsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhpZXJhcmNoaWNhbDsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NoZW1lOyAgLy8gbnVsbCAtPiByZWxhdGl2ZSBVUkkgcmVmZXJlbmNlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGF1dGhvcml0eTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnJhZ21lbnQ7Ci0gIHByaXZhdGUgVVJJIGNhY2hlZFRyaW1GcmFnbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVkVG9TdHJpbmc7Ci0gIC8vcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlyaTsKLSAgLy9wcml2YXRlIFVSSSBjYWNoZWRBU0NJSVVSSTsKLQotICAvLyBBcHBsaWNhYmxlIG9ubHkgdG8gYSBoaWVyYXJjaGljYWwgVVJJLgotICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXZpY2U7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhYnNvbHV0ZVBhdGg7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc2VnbWVudHM7IC8vIGVtcHR5IGxhc3Qgc2VnbWVudCAtPiB0cmFpbGluZyBzZXBhcmF0b3IKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVlcnk7Ci0KLSAgLy8gQSBjYWNoZSBvZiBVUklzLCBrZXllZCBieSB0aGUgc3RyaW5ncyBmcm9tIHdoaWNoIHRoZXkgd2VyZSBjcmVhdGVkLgotICAvLyBUaGUgZnJhZ21lbnQgb2YgYW55IFVSSSBpcyByZW1vdmVkIGJlZm9yZSBjYWNoaW5nIGl0IGhlcmUsIHRvIG1pbmltaXplCi0gIC8vIHRoZSBzaXplIG9mIHRoZSBjYWNoZSBpbiB0aGUgdXN1YWwgY2FzZSB3aGVyZSBtb3N0IFVSSXMgb25seSBkaWZmZXIgYnkKLSAgLy8gdGhlIGZyYWdtZW50LgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgdXJpQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0KLSAgLy8gVGhlIGxvd2VyLWNhc2VkIHNjaGVtZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaWRlbnRpZnkgYXJjaGl2ZSBVUklzLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgYXJjaGl2ZVNjaGVtZXM7Ci0KLSAgLy8gSWRlbnRpZmllcyBhIGZpbGUtdHlwZSBhYnNvbHV0ZSBVUkkuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfRklMRSA9ICJmaWxlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9KQVIgPSAiamFyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9aSVAgPSAiemlwIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9BUkNISVZFID0gImFyY2hpdmUiOwotCi0gIC8vIFNwZWNpYWwgc2VnbWVudCB2YWx1ZXMgaW50ZXJwcmV0ZWQgYXQgcmVzb2x2ZSBhbmQgcmVzb2x2ZSB0aW1lLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9FTVBUWSA9ICIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9TRUxGID0gIi4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VHTUVOVF9QQVJFTlQgPSAiLi4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19TRUdNRU5UUyA9IG5ldyBTdHJpbmdbMF07Ci0KLSAgLy8gU2VwYXJhdG9ycyBmb3IgcGFyc2luZyBhIFVSSSBzdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0NIRU1FX1NFUEFSQVRPUiA9ICc6JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWV9TRVBBUkFUT1IgPSAiLy8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERFVklDRV9JREVOVElGSUVSID0gJzonOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFR01FTlRfU0VQQVJBVE9SID0gJy8nOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVRVJZX1NFUEFSQVRPUiA9ICc/JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGUkFHTUVOVF9TRVBBUkFUT1IgPSAnIyc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVVNFUl9JTkZPX1NFUEFSQVRPUiA9ICdAJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBQT1JUX1NFUEFSQVRPUiA9ICc6JzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IgPSAnLic7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQVJDSElWRV9JREVOVElGSUVSID0gJyEnOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRV9TRVBBUkFUT1IgPSAiIS8iOwotCi0gIC8vIENoYXJhY3RlcnMgdG8gdXNlIGluIGVzY2FwaW5nLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEVTQ0FQRSA9ICclJzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9ESUdJVFMgPSB7Ci0gICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnIH07Ci0KLSAgLy8gU29tZSBjaGFyYWN0ZXIgY2xhc3NlcywgYXMgZGVmaW5lZCBpbiBSRkMgMjM5NidzIEJORiBmb3IgVVJJLgotICAvLyBUaGVzZSBhcmUgMTI4LWJpdCBiaXRtYXNrcywgc3RvcmVkIGFzIHR3byBsb25ncywgd2hlcmUgdGhlIE50aCBiaXQgaXMgc2V0Ci0gIC8vIGlmZiB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgTiBpcyBpbmNsdWRlZCBpbiB0aGUgc2V0LiAgVGhlc2UgYXJlCi0gIC8vIGNyZWF0ZWQgd2l0aCB0aGUgaGlnaEJpdG1hc2soKSBhbmQgbG93Qml0bWFzaygpIG1ldGhvZHMgZGVmaW5lZCBiZWxvdywKLSAgLy8gYW5kIGEgY2hhcmFjdGVyIGlzIHRlc3RlZCBhZ2FpbnN0IHRoZW0gdXNpbmcgbWF0Y2hlcygpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBX0hJID0gaGlnaEJpdG1hc2soJ2EnLCAneicpIHwgaGlnaEJpdG1hc2soJ0EnLCAnWicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFMUEhBX0xPID0gbG93Qml0bWFzaygnYScsICd6JykgIHwgbG93Qml0bWFzaygnQScsICdaJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElHSVRfSEkgPSBoaWdoQml0bWFzaygnMCcsICc5Jyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElHSVRfTE8gPSBsb3dCaXRtYXNrKCcwJywgJzknKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTFBIQU5VTV9ISSA9IEFMUEhBX0hJIHwgRElHSVRfSEk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQUxQSEFOVU1fTE8gPSBBTFBIQV9MTyB8IERJR0lUX0xPOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFWF9ISSA9IERJR0lUX0hJIHwgaGlnaEJpdG1hc2soJ0EnLCAnRicpIHwgaGlnaEJpdG1hc2soJ2EnLCAnZicpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFWF9MTyA9IERJR0lUX0xPIHwgbG93Qml0bWFzaygnQScsICdGJykgIHwgbG93Qml0bWFzaygnYScsICdmJyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVU5SRVNFUlZFRF9ISSA9IEFMUEhBTlVNX0hJIHwgaGlnaEJpdG1hc2soIi1fLiF+KicoKSIpOyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVTlJFU0VSVkVEX0xPID0gQUxQSEFOVU1fTE8gfCBsb3dCaXRtYXNrKCItXy4hfionKCkiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFUlZFRF9ISSA9IGhpZ2hCaXRtYXNrKCI7Lz86QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVTRVJWRURfTE8gPSBsb3dCaXRtYXNrKCI7Lz86QCY9KyQsIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVJJQ19ISSA9IFJFU0VSVkVEX0hJIHwgVU5SRVNFUlZFRF9ISTsgIC8vIHwgdWNzY2hhciB8IGVzY2FwZWQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUklDX0xPID0gUkVTRVJWRURfTE8gfCBVTlJFU0VSVkVEX0xPOwotCi0gIC8vIEFkZGl0aW9uYWwgdXNlZnVsIGNoYXJhY3RlciBjbGFzc2VzLCBpbmNsdWRpbmcgY2hhcmFjdGVycyB2YWxpZCBpbiBjZXJ0YWluCi0gIC8vIFVSSSBjb21wb25lbnRzIGFuZCBzZXBhcmF0b3JzIHVzZWQgaW4gcGFyc2luZyB0aGVtIG91dCBvZiBhIHN0cmluZy4gCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0VHTUVOVF9DSEFSX0hJID0gVU5SRVNFUlZFRF9ISSB8IGhpZ2hCaXRtYXNrKCI7OkAmPSskLCIpOyAgLy8gfCB1Y3NjaGFyIHwgZXNjYXBlZAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFR01FTlRfQ0hBUl9MTyA9IFVOUkVTRVJWRURfTE8gfCBsb3dCaXRtYXNrKCI7OkAmPSskLCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBBVEhfQ0hBUl9ISSA9IFNFR01FTlRfQ0hBUl9ISSB8IGhpZ2hCaXRtYXNrKCcvJyk7ICAvLyB8IHVjc2NoYXIgfCBlc2NhcGVkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEFUSF9DSEFSX0xPID0gU0VHTUVOVF9DSEFSX0xPIHwgbG93Qml0bWFzaygnLycpOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0NIRU1FX0NIQVJfSEkgPSBBTFBIQU5VTV9ISSB8IGhpZ2hCaXRtYXNrKCIrLS4iKTsKLS8vICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDSEVNRV9DSEFSX0xPID0gQUxQSEFOVU1fTE8gfCBsb3dCaXRtYXNrKCIrLS4iKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQUpPUl9TRVBBUkFUT1JfSEkgPSBoaWdoQml0bWFzaygiOi8/IyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BSk9SX1NFUEFSQVRPUl9MTyA9IGxvd0JpdG1hc2soIjovPyMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0VORF9ISSA9IGhpZ2hCaXRtYXNrKCIvPyMiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTRUdNRU5UX0VORF9MTyA9IGxvd0JpdG1hc2soIi8/IyIpOwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgYXJjaGl2ZVNjaGVtZXMuCi0gIHN0YXRpYwotICB7Ci0gICAgU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgc2V0LmFkZChTQ0hFTUVfSkFSKTsKLSAgICBzZXQuYWRkKFNDSEVNRV9aSVApOwotICAgIHNldC5hZGQoU0NIRU1FX0FSQ0hJVkUpOwotICAgIAotICAgIAotICAgIGFyY2hpdmVTY2hlbWVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHNldCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBsb3dlciBoYWxmIGJpdG1hc2sgZm9yIHRoZSBnaXZlbiBBU0NJSSBjaGFyYWN0ZXIuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgbG93Qml0bWFzayhjaGFyIGMpCi0gIHsKLSAgICByZXR1cm4gYyA8IDY0ID8gMUwgPDwgYyA6IDBMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciB0aGUgZ2l2ZW4gQUNTSUkgY2hhcmFjdGVyLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGhpZ2hCaXRtYXNrKGNoYXIgYykKLSAgewotICAgIHJldHVybiBjID49IDY0ICYmIGMgPCAxMjggPyAxTCA8PCAoYyAtIDY0KSA6IDBMOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG93ZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgQVNDSUkgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28KLSAgLy8gZ2l2ZW4gY2hhcmFjdGVycywgaW5jbHVzaXZlLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGxvd0JpdG1hc2soY2hhciBmcm9tLCBjaGFyIHRvKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBpZiAoZnJvbSA8IDY0ICYmIGZyb20gPD0gdG8pCi0gICAgewotICAgICAgdG8gPSB0byA8IDY0ID8gdG8gOiA2MzsKLSAgICAgIGZvciAoY2hhciBjID0gZnJvbTsgYyA8PSB0bzsgYysrKQotICAgICAgewotICAgICAgICByZXN1bHQgfD0gKDFMIDw8IGMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdXBwZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgQXNDSUkgY2hhcmFjdGVycyBiZXR3ZWVuIHRoZSB0d28KLSAgLy8gZ2l2ZW4gY2hhcmFjdGVycywgaW5jbHVzaXZlLgotICBwcml2YXRlIHN0YXRpYyBsb25nIGhpZ2hCaXRtYXNrKGNoYXIgZnJvbSwgY2hhciB0bykKLSAgewotICAgIHJldHVybiB0byA8IDY0ID8gMCA6IGxvd0JpdG1hc2soKGNoYXIpKGZyb20gPCA2NCA/IDAgOiBmcm9tIC0gNjQpLCAoY2hhcikodG8gLSA2NCkpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG93ZXIgaGFsZiBiaXRtYXNrIGZvciBhbGwgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0gIC8vIHN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb3dCaXRtYXNrKFN0cmluZyBjaGFycykKLSAgewotICAgIGxvbmcgcmVzdWx0ID0gMEw7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IGNoYXJzLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gY2hhcnMuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCA2NCkgcmVzdWx0IHw9ICgxTCA8PCBjKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHVwcGVyIGhhbGYgYml0bWFzayBmb3IgYWxsIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbgotICAvLyBzdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGxvbmcgaGlnaEJpdG1hc2soU3RyaW5nIGNoYXJzKQotICB7Ci0gICAgbG9uZyByZXN1bHQgPSAwTDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoKCk7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBjaGFycy5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA+PSA2NCAmJiBjIDwgMTI4KSByZXN1bHQgfD0gKDFMIDw8IChjIC0gNjQpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGluIHRoZSBzZXQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbgotICAvLyBiaXRtYXNrLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoY2hhciBjLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2spCi0gIHsKLSAgICBpZiAoYyA+PSAxMjgpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYyA8IDY0ID8KLSAgICAgICgoMUwgPDwgYykgJiBsb3dCaXRtYXNrKSAhPSAwIDoKLSAgICAgICgoMUwgPDwgKGMgLSA2NCkpICYgaGlnaEJpdG1hc2spICE9IDA7Ci0gIH0KLQotICAvLyBEZWJ1Z2dpbmcgbWV0aG9kOiBjb252ZXJ0cyB0aGUgZ2l2ZW4gbG9uZyB0byBhIHN0cmluZyBvZiBiaW5hcnkgZGlnaXRzLgotLyoKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQml0cyhsb25nIGwpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICB7Ci0gICAgICBib29sZWFuIGIgPSAobCAmIDFMKSAhPSAwOwotICAgICAgcmVzdWx0Lmluc2VydCgwLCBiID8gJzEnIDogJzAnKTsKLSAgICAgIGwgPj49IDE7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotKi8KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGZvciBhIGdlbmVyaWMsIG5vbi1oaWVyYXJjaGljYWwgVVJJLiAgVGhlcmUgaXMgbm8KLSAgICogY29uY2VwdCBvZiBhIHJlbGF0aXZlIG5vbi1oaWVyYXJjaGljYWwgVVJJOyBzdWNoIGFuIG9iamVjdCBjYW5ub3QgYmUKLSAgICogY3JlYXRlZC4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4gaXMKLSAgICogbnVsbCwgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZQotICAgKiBVUkk8L2E+IHNjaGVtZSwgb3IgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiwgPGNvZGU+b3BhcXVlUGFydDwvY29kZT4sIG9yCi0gICAqIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUKLSAgICogdmFsaWRTY2hlbWV9LCB7QGxpbmsgI3ZhbGlkT3BhcXVlUGFydCB2YWxpZE9wYXF1ZVBhcnR9LCBvciB7QGxpbmsKLSAgICogI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUdlbmVyaWNVUkkoU3RyaW5nIHNjaGVtZSwgU3RyaW5nIG9wYXF1ZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKHNjaGVtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbGF0aXZlIG5vbi1oaWVyYXJjaGljYWwgVVJJIik7Ci0gICAgfQotCi0gICAgaWYgKGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vbi1oaWVyYXJjaGljYWwgYXJjaGl2ZSBVUkkiKTsKLSAgICB9Ci0KLSAgICB2YWxpZGF0ZVVSSShmYWxzZSwgc2NoZW1lLCBvcGFxdWVQYXJ0LCBudWxsLCBmYWxzZSwgTk9fU0VHTUVOVFMsIG51bGwsIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSShmYWxzZSwgc2NoZW1lLCBvcGFxdWVQYXJ0LCBudWxsLCBmYWxzZSwgTk9fU0VHTUVOVFMsIG51bGwsIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIG5vIHBhdGguICBUaGUKLSAgICogVVJJIHdpbGwgYmUgcmVsYXRpdmUgaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcyBub24tbnVsbCwgYW5kIGFic29sdXRlCi0gICAqIG90aGVyd2lzZS4gIEFuIGFic29sdXRlIFVSSSB3aXRoIG5vIHBhdGggcmVxdWlyZXMgYSBub24tbnVsbAotICAgKiA8Y29kZT5hdXRob3JpdHk8L2NvZGU+IGFuZC9vciA8Y29kZT5kZXZpY2U8L2NvZGU+LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBub24tbnVsbCB3aGlsZSA8Y29kZT5hdXRob3JpdHk8L2NvZGU+IGFuZCA8Y29kZT5kZXZpY2U8L2NvZGU+IGFyZSBudWxsLAotICAgKiBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlCi0gICAqIFVSSTwvYT4gc2NoZW1lLCBvciBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+LCA8Y29kZT5hdXRob3JpdHk8L2NvZGU+LAotICAgKiA8Y29kZT5kZXZpY2U8L2NvZGU+LCA8Y29kZT5xdWVyeTwvY29kZT4sIG9yIDxjb2RlPmZyYWdtZW50PC9jb2RlPiBpcyBub3QKLSAgICogdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTY2hlbWUgdmFsaWRTaGVtZX0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sCi0gICAqIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRldmljZSwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJhYnNvbHV0ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGhvdXQgYXV0aG9yaXR5LCBkZXZpY2UsIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJjaGl2ZSBVUkkgd2l0aCBubyBwYXRoIik7Ci0gICAgfQotCi0gICAgdmFsaWRhdGVVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgZmFsc2UsIE5PX1NFR01FTlRTLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGZhbHNlLCBOT19TRUdNRU5UUywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFic29sdXRlIHBhdGguCi0gICAqIFRoZSBVUkkgd2lsbCBiZSByZWxhdGl2ZSBpZiA8Y29kZT5zY2hlbWU8L2NvZGU+IGlzIG5vbi1udWxsLCBhbmQKLSAgICogYWJzb2x1dGUgb3RoZXJ3aXNlLiAKLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgQXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQgaXMgYXV0b21hdGljYWxseQotICAgKiBwcmVjZWVkZWQgYnkgYSA8Y29kZT4vPC9jb2RlPiBzZXBhcmF0b3IuICBJZiBkZXNpcmVkLCBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvciBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHktc3RyaW5nIHNlZ21lbnQgYXMgdGhlIGxhc3QKLSAgICogZWxlbWVudCBvZiB0aGUgYXJyYXkuIAotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+c2NoZW1lPC9jb2RlPiBpcwotICAgKiBhbiA8YSBocmVmPSIjYXJjaGl2ZV9leHBsYW5hdGlvbiI+YXJjaGl2ZSBVUkk8L2E+IHNjaGVtZSBhbmQgCi0gICAqIDxjb2RlPmRldmljZTwvY29kZT4gaXMgbm9uLW51bGwsIG9yIGlmIDxjb2RlPnNjaGVtZTwvY29kZT4sCi0gICAqIDxjb2RlPmF1dGhvcml0eTwvY29kZT4sIDxjb2RlPmRldmljZTwvY29kZT4sIDxjb2RlPnNlZ21lbnRzPC9jb2RlPiwKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+LCBvciA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0bwotICAgKiB7QGxpbmsgI3ZhbGlkU2NoZW1lIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0KLSAgICogb3Ige0BsaW5rICN2YWxpZEFyY2hpdmVBdXRob3JpdHkgdmFsaWRBcmNoaXZlQXV0aG9yaXR5fSwge0BsaW5rCi0gICAqICN2YWxpZERldmljZSB2YWxpZERldmljZX0sIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rCi0gICAqICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvciB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIGFzCi0gICAqIGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlSGllcmFyY2hpY2FsVVJJKFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGV2aWNlLCBTdHJpbmdbXSBzZWdtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgaWYgKGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpICYmIGRldmljZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFyY2hpdmUgVVJJIHdpdGggZGV2aWNlIik7Ci0gICAgfQotCi0gICAgc2VnbWVudHMgPSBmaXgoc2VnbWVudHMpOwotICAgIHZhbGlkYXRlVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIHRydWUsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIHRydWUsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBmb3IgYSByZWxhdGl2ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGggcmVsYXRpdmUKLSAgICogcGF0aC4KLSAgICoKLSAgICogQHBhcmFtIHNlZ21lbnRzIGFuIGFycmF5IG9mIG5vbi1udWxsIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIG9uZQotICAgKiBzZWdtZW50IG9mIHRoZSBwYXRoLiAgQSB0cmFpbGluZyBzZXBhcmF0b3IgaXMgcmVwcmVzZW50ZWQgYnkgYW4KLSAgICogZW1wdHktc3RyaW5nIHNlZ21lbnQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zZWdtZW50czwvY29kZT4sCi0gICAqIDxjb2RlPnF1ZXJ5PC9jb2RlPiwgb3IgPGNvZGU+ZnJhZ21lbnQ8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gCi0gICAqIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvcgotICAgKiB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0sIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZUhpZXJhcmNoaWNhbFVSSShTdHJpbmdbXSBzZWdtZW50cywgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZyYWdtZW50KQotICB7Ci0gICAgc2VnbWVudHMgPSBmaXgoc2VnbWVudHMpOwotICAgIHZhbGlkYXRlVVJJKHRydWUsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSwgc2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBDb252ZXJ0cyBudWxsIHRvIGxlbmd0aC16ZXJvIGFycmF5LCBhbmQgY2xvbmVzIGFycmF5IHRvIGVuc3VyZQotICAvLyBpbW11dGFiaWxpdHkuCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZpeChTdHJpbmdbXSBzZWdtZW50cykKLSAgewotICAgIHJldHVybiBzZWdtZW50cyA9PSBudWxsID8gTk9fU0VHTUVOVFMgOiAoU3RyaW5nW10pc2VnbWVudHMuY2xvbmUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgVVJJIHN0cmluZywgd2l0aCAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZXhwbGljaXQgZGV2aWNlIHN1cHBvcnQ8L2E+IGFuZCBoYW5kbGluZwotICAgKiBmb3IgPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJczwvYT4gZW5hYmxlZC4gVGhlCi0gICAqIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyc2VkIGFzIGRlc2NyaWJlZCBpbiA8YQotICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDIDIzOTY8L2E+LCBhbmQgYW4KLSAgICogYXBwcm9wcmlhdGUgPGNvZGU+VVJJPC9jb2RlPiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gIE5vdGUgdGhhdAotICAgKiB2YWxpZGl0eSB0ZXN0aW5nIGlzIG5vdCBhcyBzdHJpY3QgYXMgaW4gdGhlIFJGQzsgZXNzZW50aWFsbHksIG9ubHkKLSAgICogc2VwYXJhdG9yIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQuICBTbywgZm9yIGV4YW1wbGUsIG5vbi1MYXRpbgotICAgKiBhbHBoYWJldCBjaGFyYWN0ZXJzIGFwcGVhcmluZyBpbiB0aGUgc2NoZW1lIHdvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFuCi0gICAqIGVycm9yLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IGNvbXBvbmVudCBwYXJzZWQKLSAgICogZnJvbSA8Y29kZT51cmk8L2NvZGU+IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZFNjaGVtZQotICAgKiB2YWxpZFNjaGVtZX0sIHtAbGluayAjdmFsaWRPcGFxdWVQYXJ0IHZhbGlkT3BhcXVlUGFydH0sIHtAbGluawotICAgKiAjdmFsaWRBdXRob3JpdHkgdmFsaWRBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkQXJjaGl2ZUF1dGhvcml0eQotICAgKiB2YWxpZEFyY2hpdmVBdXRob3JpdHl9LCB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwge0BsaW5rCi0gICAqICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yIHtAbGluawotICAgKiAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fSwgYXMgYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBjcmVhdGVVUklXaXRoQ2FjaGUodXJpKTsgCi0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIHRoYXQgZW5jb2RlcyBhbmQgcGFyc2VzIHRoZSBnaXZlbiBVUkkgc3RyaW5nLgotICAgKiBBcHByb3ByaWF0ZSBlbmNvZGluZyBpcyBwZXJmb3JtZWQgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBVUkkuCi0gICAqIElmIG1vcmUgdGhhbiBvbmUgPGNvZGU+IzwvY29kZT4gaXMgaW4gdGhlIHN0cmluZywgdGhlIGxhc3Qgb25lIGlzCi0gICAqIGFzc3VtZWQgdG8gYmUgdGhlIGZyYWdtZW50J3Mgc2VwYXJhdG9yLCBhbmQgYW55IG90aGVycyBhcmUgZW5jb2RlZC4KLSAgICogIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlVVJJV2l0aENhY2hlKGVuY29kZVVSSSh1cmksIGlnbm9yZUVzY2FwZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIFVSSSBzdHJpbmcsIHdpdGggCi0gICAqIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmV4cGxpY2l0IGRldmljZSBzdXBwb3J0PC9hPiBlbmFibGVkLiAgCi0gICAqIE5vdGUgdGhhdCB2YWxpZGl0eSB0ZXN0aW5nIGlzIG5vdCBhIHN0cmljdCBhcyBpbiB0aGUgUkZDOyBlc3NlbnRpYWxseSwKLSAgICogb25seSBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZC4gIFNvLCBmb3IgZXhhbXBsZSwgbm9uLUxhdGluCi0gICAqIGFscGhhYmV0IGNoYXJhY3RlcnMgYXBwZWFyaW5nIGluIHRoZSBzY2hlbWUgd291bGQgbm90IGJlIGNvbnNpZGVyZWQgYW4KLSAgICogZXJyb3IuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIDxjb2RlPnVyaTwvY29kZT4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2NoZW1lCi0gICAqIHZhbGlkU2NoZW1lfSwge0BsaW5rICN2YWxpZE9wYXF1ZVBhcnQgdmFsaWRPcGFxdWVQYXJ0fSwge0BsaW5rCi0gICAqICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluayAjdmFsaWRBcmNoaXZlQXV0aG9yaXR5Ci0gICAqIHZhbGlkQXJjaGl2ZUF1dGhvcml0eX0sIHtAbGluayAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCB7QGxpbmsKLSAgICogI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rCi0gICAqICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LCBhcyBhcHByb3ByaWF0ZS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjY3JlYXRlVVJJIGNyZWF0ZVVSSX0sIHdoaWNoIG5vdyBoYXMgZXhwbGljaXQKLSAgICogZGV2aWNlIHN1cHBvcnQgZW5hYmxlZC4gVGhlIHR3byBtZXRob2RzIG5vdyBvcGVyYXRlIGlkZW50aWNhbGx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlRGV2aWNlVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlVVJJV2l0aENhY2hlKHVyaSk7Ci0gIH0KLQotICAvLyBVc2VzIGEgY2FjaGUgdG8gc3BlZWQgdXAgY3JlYXRpb24gb2YgYSBVUkkgZnJvbSBhIHN0cmluZy4gIFRoZSBjYWNoZQotICAvLyBpcyBjb25zdWx0ZWQgdG8gc2VlIGlmIHRoZSBVUkksIGxlc3MgYW55IGZyYWdtZW50LCBoYXMgYWxyZWFkeSBiZWVuCi0gIC8vIGNyZWF0ZWQuICBJZiBuZWVkZWQsIHRoZSBmcmFnbWVudCBpcyByZS1hcHBlbmRlZCB0byB0aGUgY2FjaGVkIFVSSSwKLSAgLy8gd2hpY2ggaXMgY29uc2lkZXJhYmx5IG1vcmUgZWZmaWNpZW50IHRoYW4gY3JlYXRpbmcgdGhlIHdob2xlIFVSSSBmcm9tCi0gIC8vIHNjcmF0Y2guICBJZiB0aGUgVVJJIHdhc24ndCBmb3VuZCBpbiB0aGUgY2FjaGUsIGl0IGlzIGNyZWF0ZWQgdXNpbmcKLSAgLy8gcGFyc2VJbnRvVVJJKCkgYW5kIHRoZW4gY2FjaGVkLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCi0gIC8vIGJ5IHN0cmluZy1wYXJzaW5nIGZhY3RvcnkgbWV0aG9kcywgaW5zdGVhZCBvZiBwYXJzZUludG9VUkkoKSBkaXJlY3RseS4KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdhcyBpbmNsdWRlZCBpbiB0aGUgcHVibGljIEFQSSBieSBtaXN0YWtlLgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI2NyZWF0ZVVSSSBjcmVhdGVVUkl9IGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUklXaXRoQ2FjaGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKTsKLSAgICBTdHJpbmcgYmFzZSA9IGkgPT0gLTEgPyB1cmkgOiB1cmkuc3Vic3RyaW5nKDAsIGkpOwotICAgIFN0cmluZyBmcmFnbWVudCA9IGkgPT0gLTEgPyBudWxsIDogdXJpLnN1YnN0cmluZyhpICsgMSk7Ci0KLSAgICBVUkkgcmVzdWx0ID0gKFVSSSl1cmlDYWNoZS5nZXQoYmFzZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gcGFyc2VJbnRvVVJJKGJhc2UpOwotICAgICAgdXJpQ2FjaGUucHV0KGJhc2UsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgaWYgKGZyYWdtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gcmVzdWx0LmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIFN0cmluZy1wYXJzaW5nIGltcGxlbWVudGF0aW9uLgotICBwcml2YXRlIHN0YXRpYyBVUkkgcGFyc2VJbnRvVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIGhpZXJhcmNoaWNhbCA9IHRydWU7Ci0gICAgU3RyaW5nIHNjaGVtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGF1dGhvcml0eSA9IG51bGw7Ci0gICAgU3RyaW5nIGRldmljZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBhYnNvbHV0ZVBhdGggPSBmYWxzZTsKLSAgICBTdHJpbmdbXSBzZWdtZW50cyA9IE5PX1NFR01FTlRTOwotICAgIFN0cmluZyBxdWVyeSA9IG51bGw7Ci0gICAgU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKLQotICAgIGludCBpID0gMDsKLSAgICBpbnQgaiA9IGZpbmQodXJpLCBpLCBNQUpPUl9TRVBBUkFUT1JfSEksIE1BSk9SX1NFUEFSQVRPUl9MTyk7Ci0KLSAgICBpZiAoaiA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGopID09IFNDSEVNRV9TRVBBUkFUT1IpCi0gICAgewotICAgICAgc2NoZW1lID0gdXJpLnN1YnN0cmluZyhpLCBqKTsKLSAgICAgIGkgPSBqICsgMTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGFyY2hpdmVTY2hlbWUgPSBpc0FyY2hpdmVTY2hlbWUoc2NoZW1lKTsKLSAgICBpZiAoYXJjaGl2ZVNjaGVtZSkKLSAgICB7Ci0gICAgICBqID0gdXJpLmxhc3RJbmRleE9mKEFSQ0hJVkVfU0VQQVJBVE9SKTsKLSAgICAgIGlmIChqID09IC0xKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBhcmNoaXZlIHNlcGFyYXRvciIpOwotICAgICAgfQotICAgICAgaGllcmFyY2hpY2FsID0gdHJ1ZTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgKytqKTsKLSAgICAgIGkgPSBqOwotICAgIH0KLSAgICBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aChBVVRIT1JJVFlfU0VQQVJBVE9SLCBpKSkKLSAgICB7Ci0gICAgICBpICs9IEFVVEhPUklUWV9TRVBBUkFUT1IubGVuZ3RoKCk7Ci0gICAgICBqID0gZmluZCh1cmksIGksIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0gICAgICBhdXRob3JpdHkgPSB1cmkuc3Vic3RyaW5nKGksIGopOwotICAgICAgaSA9IGo7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNjaGVtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgKGkgPT0gdXJpLmxlbmd0aCgpIHx8IHVyaS5jaGFyQXQoaSkgIT0gU0VHTUVOVF9TRVBBUkFUT1IpKQotICAgIHsKLSAgICAgIGhpZXJhcmNoaWNhbCA9IGZhbHNlOwotICAgICAgaiA9IHVyaS5pbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUiwgaSk7Ci0gICAgICBpZiAoaiA9PSAtMSkgaiA9IHVyaS5sZW5ndGgoKTsKLSAgICAgIGF1dGhvcml0eSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0KLSAgICBpZiAoIWFyY2hpdmVTY2hlbWUgJiYgaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGogPSBmaW5kKHVyaSwgaSArIDEsIFNFR01FTlRfRU5EX0hJLCBTRUdNRU5UX0VORF9MTyk7Ci0gICAgICBTdHJpbmcgcyA9IHVyaS5zdWJzdHJpbmcoaSArIDEsIGopOwotICAgICAgCi0gICAgICBpZiAocy5sZW5ndGgoKSA+IDAgJiYgcy5jaGFyQXQocy5sZW5ndGgoKSAtIDEpID09IERFVklDRV9JREVOVElGSUVSKQotICAgICAgewotICAgICAgICBkZXZpY2UgPSBzOwotICAgICAgICBpID0gajsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgIHsKLSAgICAgIGkrKzsKLSAgICAgIGFic29sdXRlUGF0aCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHNlZ21lbnRzUmVtYWluKHVyaSwgaSkpCi0gICAgewotICAgICAgTGlzdCBzZWdtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgd2hpbGUgKHNlZ21lbnRzUmVtYWluKHVyaSwgaSkpCi0gICAgICB7Ci0gICAgICAgIGogPSBmaW5kKHVyaSwgaSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLSAgICAgICAgc2VnbWVudExpc3QuYWRkKHVyaS5zdWJzdHJpbmcoaSwgaikpOwotICAgICAgICBpID0gajsKLQotICAgICAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFNFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzZWdtZW50c1JlbWFpbih1cmksICsraSkpIHNlZ21lbnRMaXN0LmFkZChTRUdNRU5UX0VNUFRZKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRMaXN0LnNpemUoKV07Ci0gICAgICBzZWdtZW50TGlzdC50b0FycmF5KHNlZ21lbnRzKTsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSAmJiB1cmkuY2hhckF0KGkpID09IFFVRVJZX1NFUEFSQVRPUikKLSAgICB7Ci0gICAgICBqID0gdXJpLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SLCArK2kpOwotICAgICAgaWYgKGogPT0gLTEpIGogPSB1cmkubGVuZ3RoKCk7Ci0gICAgICBxdWVyeSA9IHVyaS5zdWJzdHJpbmcoaSwgaik7Ci0gICAgICBpID0gajsKLSAgICB9Ci0KLSAgICBpZiAoaSA8IHVyaS5sZW5ndGgoKSkgLy8gJiYgdXJpLmNoYXJBdChpKSA9PSBGUkFHTUVOVF9TRVBBUkFUT1IgKGltcGxpZWQpCi0gICAgewotICAgICAgZnJhZ21lbnQgPSB1cmkuc3Vic3RyaW5nKCsraSk7Ci0gICAgfQotCi0gICAgdmFsaWRhdGVVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBzdHJpbmcgY29udGFpbnMgYW55IG1vcmUgc2VnbWVudHMgYWZ0ZXIgdGhlIG9uZSB0aGF0Ci0gIC8vIHN0YXJ0cyBhdCBwb3NpdGlvbiBpLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlZ21lbnRzUmVtYWluKFN0cmluZyB1cmksIGludCBpKQotICB7Ci0gICAgcmV0dXJuIGkgPCB1cmkubGVuZ3RoKCkgJiYgdXJpLmNoYXJBdChpKSAhPSBRVUVSWV9TRVBBUkFUT1IgJiYKLSAgICAgIHVyaS5jaGFyQXQoaSkgIT0gRlJBR01FTlRfU0VQQVJBVE9SOwotICB9Ci0KLSAgLy8gRmluZHMgdGhlIG5leHQgb2NjdXJhbmNlIG9mIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc2V0IHJlcHJlc2VudGVkCi0gIC8vIGJ5IHRoZSBnaXZlbiBiaXRtYXNrIGluIHRoZSBnaXZlbiBzdHJpbmcsIGJlZ2lubmluZyBhdCBpbmRleCBpLiBUaGUgaW5kZXgKLSAgLy8gb2YgdGhlIGZpcnN0IGZvdW5kIGNoYXJhY3Rlciwgb3Igcy5sZW5ndGgoKSBpZiB0aGVyZSBpcyBub25lLCBpcwotICAvLyByZXR1cm5lZC4gIEJlZm9yZSBzZWFyY2hpbmcsIGkgaXMgbGltaXRlZCB0byB0aGUgcmFuZ2UgWzAsIHMubGVuZ3RoKCldLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZChTdHJpbmcgcywgaW50IGksIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaykKLSAgewotICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOwotICAgIGlmIChpID49IGxlbikgcmV0dXJuIGxlbjsKLQotICAgIGZvciAoaSA9IGkgPiAwID8gaSA6IDA7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWF0Y2hlcyhzLmNoYXJBdChpKSwgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spKSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGZhY3RvcnkgbWV0aG9kIGJhc2VkIG9uIHBhcnNpbmcgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBwYXRoCi0gICAqIHN0cmluZy4gIFRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gaXMgY29udmVydGVkIGludG8gYW4gYXBwcm9wcmlhdGUKLSAgICogZm9ybSwgYXMgZm9sbG93czogcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIGFyZSBjb252ZXJ0ZWQgdG8KLSAgICogPGNvZGU+Lzxjb2RlPjsgdGhlIHBhdGggaXMgZW5jb2RlZDsgYW5kIGEgImZpbGUiIHNjaGVtZSBhbmQsIGlmIG1pc3NpbmcsCi0gICAqIGEgbGVhZGluZyA8Y29kZT4vPC9jb2RlPiwgYXJlIGFkZGVkIHRvIGFuIGFic29sdXRlIHBhdGguICBUaGUgcmVzdWx0Ci0gICAqIGlzIHRoZW4gcGFyc2VkIHVzaW5nIHtAbGluayAjY3JlYXRlVVJJKFN0cmluZykgY3JlYXRlVVJJfS4KLSAgICoKLSAgICogPHA+VGhlIGVuY29kaW5nIHN0ZXAgZXNjYXBlcyBhbGwgc3BhY2VzLCA8Y29kZT4jPC9jb2RlPiBjaGFyYWN0ZXJzLCBhbmQKLSAgICogb3RoZXIgY2hhcmFjdGVycyBkaXNhbGxvd2VkIGluIFVSSXMsIGFzIHdlbGwgYXMgPGNvZGU+PzwvY29kZT4sIHdoaWNoCi0gICAqIHdvdWxkIGRlbGltaXQgYSBwYXRoIGZyb20gYSBxdWVyeS4gIERlY29kaW5nIGlzIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkCi0gICAqIGJ5IHtAbGluayAjdG9GaWxlU3RyaW5nIHRvRmlsZVN0cmluZ30sIGFuZCBjYW4gYmUgYXBwbGllZCB0byB0aGUgdmFsdWVzCi0gICAqIHJldHVybmVkIGJ5IG90aGVyIGFjY2Vzc29ycyBieSB2aWEgdGhlIHN0YXRpYyB7QGxpbmsgI2RlY29kZShTdHJpbmcpCi0gICAqIGRlY29kZX0gbWV0aG9kLgotICAgKgotICAgKiA8cD5BIHJlbGF0aXZlIHBhdGggd2l0aCBhIHNwZWNpZmllZCBkZXZpY2UgKHNvbWV0aGluZyBsaWtlCi0gICAqIDxjb2RlPkM6bXlmaWxlLnR4dDwvY29kZT4pIGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSB2YWxpZCBVUkkuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+cGF0aE5hbWU8L2NvZGU+Ci0gICAqIHNwZWNpZmllcyBhIGRldmljZSBhbmQgYSByZWxhdGl2ZSBwYXRoLCBvciBpZiBhbnkgY29tcG9uZW50IG9mIHRoZSBwYXRoCi0gICAqIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZEF1dGhvcml0eSB2YWxpZEF1dGhvcml0eX0sIHtAbGluawotICAgKiAjdmFsaWREZXZpY2UgdmFsaWREZXZpY2V9LCBvciB7QGxpbmsgI3ZhbGlkU2VnbWVudHMgdmFsaWRTZWdtZW50c30sCi0gICAqIHtAbGluayAjdmFsaWRRdWVyeSB2YWxpZFF1ZXJ5fSwgb3Ige0BsaW5rICN2YWxpZEZyYWdtZW50IHZhbGlkRnJhZ21lbnR9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlRmlsZVVSSShTdHJpbmcgcGF0aE5hbWUpCi0gIHsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoTmFtZSk7Ci0gICAgU3RyaW5nIHVyaSA9IEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycgPyBwYXRoTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgU0VHTUVOVF9TRVBBUkFUT1IpIDogcGF0aE5hbWU7Ci0gICAgdXJpID0gZW5jb2RlKHVyaSwgUEFUSF9DSEFSX0hJLCBQQVRIX0NIQVJfTE8sIGZhbHNlKTsKLSAgICBpZiAoZmlsZS5pc0Fic29sdXRlKCkpCi0gICAgewotICAgICAgVVJJIHJlc3VsdCA9IGNyZWF0ZVVSSSgodXJpLmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/ICJmaWxlOiIgOiAiZmlsZTovIikgKyB1cmkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFVSSSByZXN1bHQgPSBjcmVhdGVVUkkodXJpKTsKLSAgICAgIGlmIChyZXN1bHQuc2NoZW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCByZWxhdGl2ZSBwYXRoTmFtZTogIiArIHBhdGhOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0YXRpYyBmYWN0b3J5IG1ldGhvZCBiYXNlZCBvbiBwYXJzaW5nIGEgcGxhdGZvcm0tcmVsYXRpdmUgcGF0aCBzdHJpbmcuCi0gICAqCi0gICAqIDxwPlRoZSA8Y29kZT5wYXRoTmFtZTwvY29kZT4gbXVzdCBiZSBvZiB0aGUgZm9ybToKLSAgICogPHByZT4KLSAgICogICAvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+UGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3JzIHdpbGwgYmUgY29udmVydGVydGVkIHRvIHNsYXNoZXMuCi0gICAqIElmIG5vdCBpbmNsdWRlZCwgdGhlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3Igd2lsbCBiZSBhZGRlZC4gIFRoZQotICAgKiByZXN1bHQgd2lsbCBiZSBvZiB0aGlzIGZvcm0sIHdoaWNoIGlzIHBhcnNlZCB1c2luZyB7QGxpbmsgI2NyZWF0ZVVSSQotICAgKiBjcmVhdGVVUkl9OgotICAgKiA8cHJlPgotICAgKiAgIHBsYXRmb3JtOi9yZXNvdXJjZS9wcm9qZWN0LW5hbWUvcGF0aDwvcHJlPgotICAgKgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBjb21wb25lbnQgcGFyc2VkCi0gICAqIGZyb20gdGhlIHBhdGggaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkRGV2aWNlIHZhbGlkRGV2aWNlfSwKLSAgICoge0BsaW5rICN2YWxpZFNlZ21lbnRzIHZhbGlkU2VnbWVudHN9LCB7QGxpbmsgI3ZhbGlkUXVlcnkgdmFsaWRRdWVyeX0sIG9yCi0gICAqIHtAbGluayAjdmFsaWRGcmFnbWVudCB2YWxpZEZyYWdtZW50fS4KLSAgICoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm0jcmVzb2x2ZQotICAgKiBAc2VlICNjcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKFN0cmluZywgYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGhOYW1lKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aE5hbWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgYmFzZWQgb24gcGFyc2luZyBhIHBsYXRmb3JtLXJlbGF0aXZlIHBhdGggc3RyaW5nLAotICAgKiB3aXRoIGFuIG9wdGlvbiB0byBlbmNvZGUgdGhlIGNyZWF0ZWQgVVJJLgotICAgKgotICAgKiA8cD5UaGUgPGNvZGU+cGF0aE5hbWU8L2NvZGU+IG11c3QgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxwcmU+Ci0gICAqICAgL3Byb2plY3QtbmFtZS9wYXRoPC9wcmU+Ci0gICAqCi0gICAqIDxwPlBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9ycyB3aWxsIGJlIGNvbnZlcnRlcnRlZCB0byBzbGFzaGVzLgotICAgKiBJZiBub3QgaW5jbHVkZWQsIHRoZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yIHdpbGwgYmUgYWRkZWQuICBUaGUKLSAgICogcmVzdWx0IHdpbGwgYmUgb2YgdGhpcyBmb3JtLCB3aGljaCBpcyBwYXJzZWQgdXNpbmcge0BsaW5rICNjcmVhdGVVUkkKLSAgICogY3JlYXRlVVJJfToKLSAgICogPHByZT4KLSAgICogICBwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdC1uYW1lL3BhdGg8L3ByZT4KLSAgICoKLSAgICogPHA+VGhpcyBzY2hlbWUgc3VwcG9ydHMgcmVsb2NhdGFibGUgcHJvamVjdHMgaW4gRWNsaXBzZSBhbmQgaW4KLSAgICogc3RhbmQtYWxvbmUgLgotICAgKgotICAgKiA8cD5EZXBlbmRpbmcgb24gdGhlIDxjb2RlPmVuY29kZTwvY29kZT4gYXJndW1lbnQsIHRoZSBwYXRoIG1heSBiZQotICAgKiBhdXRvbWF0aWNhbGx5IGVuY29kZWQgdG8gZXNjYXBlIGFsbCBzcGFjZXMsIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3RlcnMsCi0gICAqIGFuZCBvdGhlciBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gVVJJcywgYXMgd2VsbCBhcyA8Y29kZT4/PC9jb2RlPiwKLSAgICogd2hpY2ggd291bGQgZGVsaW1pdCBhIHBhdGggZnJvbSBhIHF1ZXJ5LiAgRGVjb2RpbmcgY2FuIGJlIHBlcmZvcm1lZCB3aXRoCi0gICAqIHRoZSBzdGF0aWMge0BsaW5rICNkZWNvZGUoU3RyaW5nKSBkZWNvZGV9IG1ldGhvZC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgY29tcG9uZW50IHBhcnNlZAotICAgKiBmcm9tIHRoZSBwYXRoIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8ge0BsaW5rICN2YWxpZERldmljZSB2YWxpZERldmljZX0sCi0gICAqIHtAbGluayAjdmFsaWRTZWdtZW50cyB2YWxpZFNlZ21lbnRzfSwge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LCBvcgotICAgKiB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtI3Jlc29sdmUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGhOYW1lLCBib29sZWFuIGVuY29kZSkKLSAgewotICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gU0VHTUVOVF9TRVBBUkFUT1IpCi0gICAgewotICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLQotICAgIGlmIChlbmNvZGUpCi0gICAgewotICAgICAgcGF0aE5hbWUgPSBlbmNvZGUocGF0aE5hbWUsIFBBVEhfQ0hBUl9ISSwgUEFUSF9DSEFSX0xPLCBmYWxzZSk7Ci0gICAgfQotICAgIFVSSSByZXN1bHQgPSBjcmVhdGVVUkkoKHBhdGhOYW1lLmNoYXJBdCgwKSA9PSBTRUdNRU5UX1NFUEFSQVRPUiA/ICJwbGF0Zm9ybTovcmVzb3VyY2UiIDogInBsYXRmb3JtOi9yZXNvdXJjZS8iKSArIHBhdGhOYW1lKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIGZvciB1c2Ugb2Ygc3RhdGljIGZhY3RvcnkgbWV0aG9kcy4KLSAgcHJpdmF0ZSBVUkkoYm9vbGVhbiBoaWVyYXJjaGljYWwsIFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCi0gICAgICAgICAgICAgIFN0cmluZyBkZXZpY2UsIGJvb2xlYW4gYWJzb2x1dGVQYXRoLCBTdHJpbmdbXSBzZWdtZW50cywKLSAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpbnQgaGFzaENvZGUgPSAwOwotICAgIC8vYm9vbGVhbiBpcmkgPSBmYWxzZTsKLQotICAgIGlmIChoaWVyYXJjaGljYWwpCi0gICAgewotICAgICAgKytoYXNoQ29kZTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aCkKLSAgICB7Ci0gICAgICBoYXNoQ29kZSArPSAyOwotICAgIH0KLSAgICBpZiAoc2NoZW1lICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gc2NoZW1lLnRvTG93ZXJDYXNlKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IGF1dGhvcml0eS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoZGV2aWNlICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gZGV2aWNlLmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKGRldmljZSk7Ci0gICAgfQotICAgIGlmIChxdWVyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhhc2hDb2RlIF49IHF1ZXJ5Lmhhc2hDb2RlKCk7Ci0gICAgICAvL2lyaSA9IGlyaSB8fCBjb250YWluc05vbkFTQ0lJKHF1ZXJ5KTsKLSAgICB9Ci0gICAgaWYgKGZyYWdtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaGFzaENvZGUgXj0gZnJhZ21lbnQuaGFzaENvZGUoKTsKLSAgICAgIC8vaXJpID0gaXJpIHx8IGNvbnRhaW5zTm9uQVNDSUkoZnJhZ21lbnQpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBoYXNoQ29kZSBePSBzZWdtZW50c1tpXS5oYXNoQ29kZSgpOwotICAgICAgLy9pcmkgPSBpcmkgfHwgY29udGFpbnNOb25BU0NJSShzZWdtZW50c1tpXSk7Ci0gICAgfQotCi0gICAgdGhpcy5oYXNoQ29kZSA9IGhhc2hDb2RlOwotICAgIC8vdGhpcy5pcmkgPSBpcmk7Ci0gICAgdGhpcy5oaWVyYXJjaGljYWwgPSBoaWVyYXJjaGljYWw7Ci0gICAgdGhpcy5zY2hlbWUgPSBzY2hlbWUgPT0gbnVsbCA/IG51bGwgOiBzY2hlbWUuaW50ZXJuKCk7Ci0gICAgdGhpcy5hdXRob3JpdHkgPSBhdXRob3JpdHk7Ci0gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7Ci0gICAgdGhpcy5hYnNvbHV0ZVBhdGggPSBhYnNvbHV0ZVBhdGg7Ci0gICAgdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzOwotICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKLSAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIC8vIFZhbGlkYXRlcyBhbGwgb2YgdGhlIFVSSSBjb21wb25lbnRzLiAgRmFjdG9yeSBtZXRob2RzIHNob3VsZCBjYWxsIHRoaXMKLSAgLy8gYmVmb3JlIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciwgdGhvdWdoIHRoZXkgbXVzdCBlbnN1cmUgdGhhdCB0aGUKLSAgLy8gaW50ZXItY29tcG9uZW50IHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW4gdGhlaXIgb3duIEphdmFkb2NzIGFyZSBhbGwKLSAgLy8gc2F0aXNmaWVkLCB0aGVtc2VsdmVzLiAgSWYgYSBuZXcgVVJJIGlzIGJlaW5nIGNvbnN0cnVjdGVkIG91dCBvZgotICAvLyBhbiBleGlzdGluZyBVUkksIHRoaXMgbmVlZCBub3QgYmUgY2FsbGVkLiAgSW5zdGVhZCwganVzdCB0aGUgbmV3Ci0gIC8vIGNvbXBvbmVudHMgbWF5IGJlIHZhbGlkYXRlZCBpbmRpdmlkdWFsbHkuCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVVUkkoYm9vbGVhbiBoaWVyYXJjaGljYWwsIFN0cmluZyBzY2hlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5LCBTdHJpbmcgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhYnNvbHV0ZVBhdGgsIFN0cmluZ1tdIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZnJhZ21lbnQpCi0gIHsKLSAgICBpZiAoIXZhbGlkU2NoZW1lKHNjaGVtZSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzY2hlbWU6ICIgKyBzY2hlbWUpOwotICAgIH0KLSAgICBpZiAoIWhpZXJhcmNoaWNhbCAmJiAhdmFsaWRPcGFxdWVQYXJ0KGF1dGhvcml0eSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBvcGFxdWVQYXJ0OiAiICsgYXV0aG9yaXR5KTsKLSAgICB9Ci0gICAgaWYgKGhpZXJhcmNoaWNhbCAmJiAhaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSkgJiYgIXZhbGlkQXV0aG9yaXR5KGF1dGhvcml0eSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBhdXRob3JpdHk6ICIgKyBhdXRob3JpdHkpOwotICAgIH0KLSAgICBpZiAoaGllcmFyY2hpY2FsICYmIGlzQXJjaGl2ZVNjaGVtZShzY2hlbWUpICYmICF2YWxpZEFyY2hpdmVBdXRob3JpdHkoYXV0aG9yaXR5KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGF1dGhvcml0eTogIiArIGF1dGhvcml0eSk7Ci0gICAgfQotICAgIGlmICghdmFsaWREZXZpY2UoZGV2aWNlKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRldmljZTogIiArIGRldmljZSk7Ci0gICAgfQotICAgIGlmICghdmFsaWRTZWdtZW50cyhzZWdtZW50cykpCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBzZWdtZW50cyA9PSBudWxsID8gImludmFsaWQgc2VnbWVudHM6ICIgKyBzZWdtZW50cyA6Ci0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBmaXJzdEludmFsaWRTZWdtZW50KHNlZ21lbnRzKTsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocyk7Ci0gICAgfQotICAgIGlmICghdmFsaWRRdWVyeShxdWVyeSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBxdWVyeTogIiArIHF1ZXJ5KTsKLSAgICB9Ci0gICAgaWYgKCF2YWxpZEZyYWdtZW50KGZyYWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGZyYWdtZW50OiAiICsgZnJhZ21lbnQpOwotICAgIH0KLSAgfQotCi0gIC8vIEFsdGVybmF0ZSwgc3RyaWN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBtZXRob2RzCi0gIC8vIGFyZSBwcm92aWRlZCwgY29tbWVudGVkIG91dCwgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuLi4KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgc2NoZW1lIGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBzY2hlbWUgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZQotICAgKiBmb2xsb3dpbmc6IDxjb2RlPjogLyA/ICM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRTY2hlbWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWNvbnRhaW5zKHZhbHVlLCBNQUpPUl9TRVBBUkFUT1JfSEksIE1BSk9SX1NFUEFSQVRPUl9MTyk7ICAKLQotICAvLyA8cD5BIHZhbGlkIHNjaGVtZSBtYXkgYmUgbnVsbCwgb3IgY29uc2lzdCBvZiBhIHNpbmdsZSBsZXR0ZXIgZm9sbG93ZWQKLSAgLy8gYnkgYW55IG51bWJlciBvZiBsZXR0ZXJzLCBudW1iZXJzLCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgotICAvLyA8Y29kZT4rIC0gLjwvY29kZT4KLQotICAgIC8vaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0cnVlOwotICAgIC8vcmV0dXJuIHZhbHVlLmxlbmd0aCgpICE9IDAgJiYKLSAgICAvLyAgbWF0Y2hlcyh2YWx1ZS5jaGFyQXQoMCksIEFMUEhBX0hJLCBBTFBIQV9MTykgJiYKLSAgICAvLyAgdmFsaWRhdGUodmFsdWUsIFNDSEVNRV9DSEFSX0hJLCBTQ0hFTUVfQ0hBUl9MTywgZmFsc2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBvcGFxdWUgcGFydCBjb21wb25lbnQgb2YgYSBVUkk7IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdmFsaWQgb3BhcXVlIHBhcnQgbXVzdCBiZSBub24tbnVsbCwgbm9uLWVtcHR5LCBhbmQgbm90IGNvbnRhaW4gdGhlCi0gICAqIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3Rlci4gIEluIGFkZGl0aW9uLCBpdHMgZmlyc3QgY2hhcmFjdGVyIG11c3Qgbm90IGJlCi0gICAqIDxjb2RlPi88L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRPcGFxdWVQYXJ0KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKSA9PSAtMSAmJgotICAgIHZhbHVlLmxlbmd0aCgpID4gMCAmJiB2YWx1ZS5jaGFyQXQoMCkgIT0gU0VHTUVOVF9TRVBBUkFUT1I7Ci0KLSAgLy8gPHA+QSB2YWxpZCBvcGFxdWUgcGFydCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tZW1wdHkuIEl0IG1heSBjb250YWluCi0gIC8vIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzLCBidXQgaXRzIGZpcnN0IGNoYXJhY3RlciBtYXkgbm90IGJlCi0gIC8vIDxjb2RlPi88L2NvZGU+IAotCi0gICAgLy9yZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSAhPSAwICYmCi0gICAgLy8gIHZhbHVlLmNoYXJBdCgwKSAhPSBTRUdNRU5UX1NFUEFSQVRPUiAmJgotICAgIC8vICB2YWxpZGF0ZSh2YWx1ZSwgVVJJQ19ISSwgVVJJQ19MTywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBhdXRob3JpdHkgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgY2hhcmFjdGVycyBleGNlcHQgZm9yCi0gICAqIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPyAjPC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkQXV0aG9yaXR5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICFjb250YWlucyh2YWx1ZSwgU0VHTUVOVF9FTkRfSEksIFNFR01FTlRfRU5EX0xPKTsKLQotICAvLyBBIHZhbGlkIGF1dGhvcml0eSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBhbGxvd2VkIFVSSSBjaGFyYWN0ZXJzIGV4Y2VwdAotICAvLyBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPgotCi0gICAgLy9yZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIGF1dGhvcml0eSBjb21wb25lbnQgb2YgYW4gPGEKLSAgICogaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPjsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+VG8gYmUgdmFsaWQsIHRoZSBhdXRob3JpdHksIGl0c2VsZiwgbXVzdCBiZSBhIFVSSSB3aXRoIG5vIGZyYWdtZW50LAotICAgKiBmb2xsb3dlZCBieSB0aGUgY2hhcmFjdGVyIDxjb2RlPiE8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkQXJjaGl2ZUF1dGhvcml0eShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCgpIC0gMSkgPT0gQVJDSElWRV9JREVOVElGSUVSKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkkgYXJjaGl2ZVVSSSA9IGNyZWF0ZVVSSSh2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgIHJldHVybiAhYXJjaGl2ZVVSSS5oYXNGcmFnbWVudCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIHZhbGlkIGFzIHRoZSBkZXZpY2UgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIGRldmljZSBtYXkgYmUgbnVsbCBvciBub24tZW1wdHksIGNvbnRhaW5pbmcgYW55IGNoYXJhY3RlcnMKLSAgICogZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nOiA8Y29kZT4vID8gIzwvY29kZT4gIEluIGFkZGl0aW9uLCBpdHMgbGFzdAotICAgKiBjaGFyYWN0ZXIgbXVzdCBiZSA8Y29kZT46PC9jb2RlPgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRGV2aWNlKFN0cmluZyB2YWx1ZSkKLSAgeyAgICAKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOwotICAgIHJldHVybiBsZW4gPiAwICYmIHZhbHVlLmNoYXJBdChsZW4gLSAxKSA9PSBERVZJQ0VfSURFTlRJRklFUiAmJgotICAgICAgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIDxwPkEgdmFsaWQgZGV2aWNlIG1heSBiZSBudWxsIG9yIG5vbi1lbXB0eSwgY29udGFpbmluZyBhbnkgYWxsb3dlZCBVUkkKLSAgLy8gY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmc6IDxjb2RlPi8gPzwvY29kZT4gIEluIGFkZGl0aW9uLCBpdHMKLSAgLy8gbGFzdCBjaGFyYWN0ZXIgbXVzdCBiZSA8Y29kZT46PC9jb2RlPgotCi0gICAgLy9pZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgLy9pbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgLy9yZXR1cm4gbGVuID4gMCAmJiB2YWxpZGF0ZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIHRydWUsIHRydWUpICYmCi0gICAgLy8gIHZhbHVlLmNoYXJBdChsZW4gLSAxKSA9PSBERVZJQ0VfSURFTlRJRklFUjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIGEgdmFsaWQgcGF0aCBzZWdtZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHBhdGggc2VnbWVudCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub3QgY29udGFpbiBhbnkgb2YgdGhlCi0gICAqIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiA8Y29kZT4vID8gIzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFNlZ21lbnQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgIWNvbnRhaW5zKHZhbHVlLCBTRUdNRU5UX0VORF9ISSwgU0VHTUVOVF9FTkRfTE8pOwotCi0gIC8vIDxwPkEgdmFsaWQgcGF0aCBzZWdtZW50IG11c3QgYmUgbm9uLW51bGwgYW5kIG1heSBjb250YWluIGFueSBhbGxvd2VkIFVSSQotICAvLyBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGZvbGxvd2luZzogPGNvZGU+LyA/PC9jb2RlPiAKLQotICAgIC8vcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdmFsaWRhdGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCB0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdvdWxkIGJlCi0gICAqIGEgdmFsaWQgcGF0aCBzZWdtZW50IGFycmF5IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIHZhbGlkIHBhdGggc2VnbWVudCBhcnJheSBtdXN0IGJlIG5vbi1udWxsIGFuZCBjb250YWluIG9ubHkgcGF0aAotICAgKiBzZWdlbWVudHMgdGhhdCBhcmUgdmFsaWQgYWNjb3JkaW5nIHRvIHtAbGluayAjdmFsaWRTZWdtZW50IHZhbGlkU2VnbWVudH0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRTZWdtZW50cyhTdHJpbmdbXSB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICghdmFsaWRTZWdtZW50KHZhbHVlW2ldKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFJldHVybnMgbnVsbCBpZiB0aGUgc3BlY2ljaWVkIHZhbHVlIGlzIG51bGwgb3Igd291bGQgYmUgYSB2YWxpZCBwYXRoCi0gIC8vIHNlZ21lbnQgYXJyYXkgb2YgYSBVUkk7IG90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZhbGlkCi0gIC8vIHNlZ21lbnQuIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmlyc3RJbnZhbGlkU2VnbWVudChTdHJpbmdbXSB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gdmFsdWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCF2YWxpZFNlZ21lbnQodmFsdWVbaV0pKSByZXR1cm4gdmFsdWVbaV07Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT52YWx1ZTwvY29kZT4gd291bGQgYmUKLSAgICogdmFsaWQgYXMgdGhlIHF1ZXJ5IGNvbXBvbmVudCBvZiBhIFVSSTsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+QSB2YWxpZCBxdWVyeSBtYXkgYmUgbnVsbCBvciBjb250YWluIGFueSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IKLSAgICogPGNvZGU+IzwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFF1ZXJ5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmluZGV4T2YoRlJBR01FTlRfU0VQQVJBVE9SKSA9PSAtMTsKLQotICAvLyA8cD5BIHZhbGlkIHF1ZXJ5IG1heSBiZSBudWxsIG9yIGNvbnRhaW4gYW55IGFsbG93ZWQgVVJJIGNoYXJhY3RlcnMuCi0KLSAgICAvL3JldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbGlkYXRlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCB0cnVlLCB0cnVlKTsKLX0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgZnJhZ21lbnQgY29tcG9uZW50IG9mIGEgVVJJOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiA8cD5BIGZyYWdtZW50IGlzIHRha2VuIHRvIGJlIHVuY29uZGl0aW9uYWxseSB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZEZyYWdtZW50KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIDxwPkEgdmFsaWQgZnJhZ21lbnQgbWF5IGJlIG51bGwgb3IgY29udGFpbiBhbnkgYWxsb3dlZCBVUkkgY2hhcmFjdGVycy4KLQotICAgIC8vcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsaWRhdGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLy8gU2VhcmNoZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgZm9yIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBzZXQgcmVwcmVzbnRlZAotICAvLyBieSB0aGUgMTI4LWJpdCBiaXRtYXNrLiAgUmV0dXJucyB0cnVlIGlmIGFueSBvY2N1ciwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBzLCBsb25nIGhpZ2hCaXRtYXNrLCBsb25nIGxvd0JpdG1hc2spCi0gIHsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gcy5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtYXRjaGVzKHMuY2hhckF0KGkpLCBoaWdoQml0bWFzaywgbG93Qml0bWFzaykpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUZXN0cyB0aGUgbm9uLW51bGwgc3RyaW5nIHZhbHVlIHRvIHNlZSBpZiBpdCBjb250YWlucyBvbmx5IEFTQ0lJCi0gIC8vIGNoYXJhY3RlcnMgaW4gdGhlIHNldCByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIDEyOC1iaXQgYml0bWFzaywKLSAgLy8gYXMgd2VsbCBhcywgb3B0aW9uYWxseSwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgMHhBMCBhbmQgYWJvdmUsIGFuZCwKLSAgLy8gYWxzbyBvcHRpb25hbGx5LCBlc2NhcGUgc2VxdWVuY2VzIG9mICUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuCi0gIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHRoZSBuZXcsIHN0cmljdCBVUkkgdmFsaWRhdGlvbiB0aGF0IGlzIG5vdAotICAvLyBub3QgY3VycmVudGx5IGluIHBsYWNlLgotLyoKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgdmFsdWUsIGxvbmcgaGlnaEJpdG1hc2ssIGxvbmcgbG93Qml0bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93Tm9uQVNDSUksIGJvb2xlYW4gYWxsb3dFc2NhcGVkKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgeyAKLSAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKG1hdGNoZXMoYywgaGlnaEJpdG1hc2ssIGxvd0JpdG1hc2spKSBjb250aW51ZTsKLSAgICAgIGlmIChhbGxvd05vbkFTQ0lJICYmIGMgPj0gMTYwKSBjb250aW51ZTsKLSAgICAgIGlmIChhbGxvd0VzY2FwZWQgJiYgaXNFc2NhcGVkKHZhbHVlLCBpKSkKLSAgICAgIHsKLSAgICAgICAgaSArPSAyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSovCi0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlbGF0aXZlIFVSSSwgb3IKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIGFuIGFic29sdXRlIFVSSS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtZSA9PSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhIGEgaGllcmFyY2hpY2FsIFVSSSwgb3IKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG9mIHRoZSBnZW5lcmljIGZvcm0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gaGllcmFyY2hpY2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNpY2FsIFVSSSB3aXRoIGFuIGF1dGhvcml0eQotICAgKiBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuIAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQXV0aG9yaXR5KCkKLSAgewotICAgIHJldHVybiBoaWVyYXJjaGljYWwgJiYgYXV0aG9yaXR5ICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbgotICAgKiBvcGFxdWUgcGFydCBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNPcGFxdWVQYXJ0KCkKLSAgewotICAgIC8vIG5vdGU6IGhpZXJhcmNoaWNhbCAtPiBhdXRob3JpdHkgIT0gbnVsbAotICAgIHJldHVybiAhaGllcmFyY2hpY2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIGRldmljZQotICAgKiBjb21wb25lbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNEZXZpY2UoKQotICB7Ci0gICAgLy8gbm90ZTogZGV2aWNlICE9IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIGRldmljZSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbgotICAgKiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiAoYWJzb2x1dGVQYXRoIHx8IGF1dGhvcml0eSA9PSBudWxsKSAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYWJzb2x1dGVQYXRoIHx8IChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGFuCi0gICAqIGFic29sdXRlIHBhdGgsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub24taGllcmFyY2hpY2FsLCBoYXMgbm8KLSAgICogcGF0aCwgb3IgaGFzIGEgcmVsYXRpdmUgcGF0aC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Fic29sdXRlUGF0aCgpCi0gIHsKLSAgICAvLyBub3RlOiBhYnNvbHV0ZVBhdGggLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIGFic29sdXRlUGF0aDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSByZWxhdGl2ZQotICAgKiBwYXRoLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm9uLWhpZXJhcmNoaWNhbCwgaGFzIG5vIHBhdGgsIG9yCi0gICAqIGhhcyBhbiBhYnNvbHV0ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVsYXRpdmVQYXRoKCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBlbXB0eQotICAgKiByZWxhdGl2ZSBwYXRoOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLiAgCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCA8Y29kZT4haGFzRW1wdHkoKTwvY29kZT4gZG9lcyA8ZW0+bm90PC9lbT4gaW1wbHkgdGhhdCB0aGlzCi0gICAqIFVSSSBoYXMgYW55IHBhdGggc2VnbWVudHM7IGhvd2V2ZXIsIDxjb2RlPmhhc1JlbGF0aXZlUGF0aCAmJgotICAgKiAhaGFzRW1wdHlQYXRoKCk8L2NvZGU+IGRvZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFbXB0eVBhdGgoKQotICB7Ci0gICAgLy8gbm90ZTogYXV0aG9yaXR5ID09IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgLy8gKGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGgpIC0+IHNjaGVtZSA9PSBudWxsCi0gICAgcmV0dXJuIGF1dGhvcml0eSA9PSBudWxsICYmIGRldmljZSA9PSBudWxsICYmICFhYnNvbHV0ZVBhdGggJiYKLSAgICAgIHNlZ21lbnRzLmxlbmd0aCA9PSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhIHF1ZXJ5Ci0gICAqIGNvbXBvbmVudDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1F1ZXJ5KCkKLSAgewotICAgIC8vIG5vdGU6IHF1ZXJ5ICE9IG51bGwgLT4gaGllcmFyY2hpY2FsCi0gICAgcmV0dXJuIHF1ZXJ5ICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIFVSSSBoYXMgYSBmcmFnbWVudCBjb21wb25lbnQ7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZnJhZ21lbnQgIT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZTsgdGhhdAotICAgKiBpcywgaWYgaXQgaXMgYSByZWxhdGl2ZSBoaWVyYXJjaGljYWwgVVJJIHdpdGggbm8gYXV0aG9yaXR5LCBkZXZpY2Ugb3IKLSAgICogcXVlcnkgY29tcG9uZW50cywgYW5kIG5vIHBhdGggc2VnbWVudHM7IDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZAotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnREb2N1bWVudFJlZmVyZW5jZSgpCi0gIHsKLSAgICAvLyBub3RlOiBhdXRob3JpdHkgPT0gbnVsbCAtPiBoaWVyYXJjaGljYWwKLSAgICAvLyAoYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCkgLT4gc2NoZW1lID09IG51bGwKLSAgICByZXR1cm4gYXV0aG9yaXR5ID09IG51bGwgJiYgZGV2aWNlID09IG51bGwgJiYgIWFic29sdXRlUGF0aCAmJgotICAgICAgc2VnbWVudHMubGVuZ3RoID09IDAgJiYgcXVlcnkgPT0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSB7QGxpbmsKLSAgICogI2lzQ3VycmVudERvY3VtZW50UmVmZXJlbmNlKCkgY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2V9IHdpdGggbm8KLSAgICogZnJhZ21lbnQgY29tcG9uZW50OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2VlICNpc0N1cnJlbnREb2N1bWVudFJlZmVyZW5jZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgewotICAgIC8vIG5vdGU6IGF1dGhvcml0eSA9PSBudWxsIC0+IGhpZXJhcmNoaWNhbAotICAgIC8vIChhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoKSAtPiBzY2hlbWUgPT0gbnVsbAotICAgIHJldHVybiBhdXRob3JpdHkgPT0gbnVsbCAmJiBkZXZpY2UgPT0gbnVsbCAmJiAhYWJzb2x1dGVQYXRoICYmCi0gICAgICBzZWdtZW50cy5sZW5ndGggPT0gMCAmJiBxdWVyeSA9PSBudWxsICYmIGZyYWdtZW50ID09IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IG1heSByZWZlcgotICAgKiBkaXJlY3RseSB0byBhIGxvY2FsbHkgYWNjZXNzaWJsZSBmaWxlLiAgVGhpcyBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZQotICAgKiBjYXNlIGZvciBhIGZpbGUtc2NoZW1lIGFic29sdXRlIFVSSSwgb3IgZm9yIGEgcmVsYXRpdmUgVVJJIHdpdGggbm8gcXVlcnk7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgJiYKLSAgICAgICgoaXNSZWxhdGl2ZSgpICYmICFoYXNRdWVyeSgpKSB8fCBTQ0hFTUVfRklMRS5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkpOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYXJjaGl2ZSBVUkkuICBJZiBzbywgd2Ugc2hvdWxkIGV4cGVjdCB0aGF0Ci0gIC8vIGl0IGlzIGFsc28gaGllcmFyY2hpY2FsLCB3aXRoIGFuIGF1dGhvcml0eSAoY29uc2lzdGluZyBvZiBhbiBhYnNvbHV0ZQotICAvLyBVUkkgZm9sbG93ZWQgYnkgIiEiKSwgbm8gZGV2aWNlLCBhbmQgYW4gYWJzb2x1dGUgcGF0aC4KLSAgcHJpdmF0ZSBib29sZWFuIGlzQXJjaGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gaXNBcmNoaXZlU2NoZW1lKHNjaGVtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPiB3b3VsZCBiZQotICAgKiB2YWxpZCBhcyB0aGUgc2NoZW1lIG9mIGFuIDxhCi0gICAqIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT47IDxjb2RlPmZhbHNlPC9jb2RlPgotICAgKiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlU2NoZW1lKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGFyY2hpdmVTY2hlbWVzLmNvbnRhaW5zKHZhbHVlLnRvTG93ZXJDYXNlKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlLgotICAgKi8KLSAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gaGFzaENvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mCi0gICAqIDxjb2RlPlVSSTwvY29kZT4gZXF1YWwgdG8gdGhpcyBvbmU7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkVxdWFsaXR5IGlzIGRldGVybWluZWQgc3RyaWN0bHkgYnkgY29tcGFyaW5nIGNvbXBvbmVudHMsIG5vdCBieQotICAgKiBhdHRlbXB0aW5nIHRvIGludGVycHJldCB3aGF0IHJlc291cmNlIGlzIGJlaW5nIGlkZW50aWZpZWQuICBUaGUKLSAgICogY29tcGFyaXNvbiBvZiBzY2hlbWVzIGlzIGNhc2UtaW5zZW5zaXRpdmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKLSAgewotICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0gICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVVJJKSkgcmV0dXJuIGZhbHNlOwotICAgIFVSSSB1cmkgPSAoVVJJKSBvYmo7Ci0KLSAgICByZXR1cm4gaGFzaENvZGUgPT0gdXJpLmhhc2hDb2RlKCkgJiYKLSAgICAgIGhpZXJhcmNoaWNhbCA9PSB1cmkuaXNIaWVyYXJjaGljYWwoKSAmJgotICAgICAgYWJzb2x1dGVQYXRoID09IHVyaS5oYXNBYnNvbHV0ZVBhdGgoKSAmJgotICAgICAgZXF1YWxzKHNjaGVtZSwgdXJpLnNjaGVtZSgpLCB0cnVlKSAmJgotICAgICAgZXF1YWxzKGF1dGhvcml0eSwgaGllcmFyY2hpY2FsID8gdXJpLmF1dGhvcml0eSgpIDogdXJpLm9wYXF1ZVBhcnQoKSkgJiYKLSAgICAgIGVxdWFscyhkZXZpY2UsIHVyaS5kZXZpY2UoKSkgJiYKLSAgICAgIGVxdWFscyhxdWVyeSwgdXJpLnF1ZXJ5KCkpICYmIAotICAgICAgZXF1YWxzKGZyYWdtZW50LCB1cmkuZnJhZ21lbnQoKSkgJiYKLSAgICAgIHNlZ21lbnRzRXF1YWwodXJpKTsKLSAgfQotCi0gIC8vIFRlc3RzIHdoZXRoZXIgdGhpcyBVUkkncyBwYXRoIHNlZ21lbnQgYXJyYXkgaXMgZXF1YWwgdG8gdGhhdCBvZiB0aGUKLSAgLy8gZ2l2ZW4gdXJpLgotICBwcml2YXRlIGJvb2xlYW4gc2VnbWVudHNFcXVhbChVUkkgdXJpKQotICB7Ci0gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPSB1cmkuc2VnbWVudENvdW50KCkpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKCFzZWdtZW50c1tpXS5lcXVhbHModXJpLnNlZ21lbnQoaSkpKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0b2xlcmF0aW5nIG51bGxzOyBudWxsIGlzIGNvbnNpZGVyZWQKLSAgLy8gdG8gYmUgYSB2YWxpZCB2YWx1ZSB0aGF0IGlzIG9ubHkgZXF1YWwgdG8gaXRzZWxmLgotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgewotICAgIHJldHVybiBvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMik7Ci0gIH0KLQotICAvLyBUZXN0cyB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHksIHRvbGVyYXRpbmcgbnVsbHMgYW5kIG9wdGlvbmFsbHkKLSAgLy8gaWdub3JpbmcgY2FzZS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIHMxLCBTdHJpbmcgczIsIGJvb2xlYW4gaWdub3JlQ2FzZSkKLSAgewotICAgIHJldHVybiBzMSA9PSBudWxsID8gczIgPT0gbnVsbCA6Ci0gICAgICBpZ25vcmVDYXNlID8gczEuZXF1YWxzSWdub3JlQ2FzZShzMikgOiBzMS5lcXVhbHMoczIpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYW4gYWJzb2x1dGUgVVJJLCByZXR1cm5zIHRoZSBzY2hlbWUgY29tcG9uZW50OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBub24taGllcmFyY2hpY2FsIFVSSSwgcmV0dXJucyB0aGUgb3BhcXVlIHBhcnQgY29tcG9uZW50OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIG9wYXF1ZVBhcnQoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgPyBudWxsIDogYXV0aG9yaXR5OwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgcmV0dXJucyBpdDsKLSAgICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBhdXRob3JpdHkoKQotICB7Ci0gICAgcmV0dXJuIGlzSGllcmFyY2hpY2FsKCkgPyBhdXRob3JpdHkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCB0aGF0IGhhcyBhCi0gICAqIHVzZXIgaW5mbyBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHVzZXJJbmZvKCkKLSAgeyAKLSAgICBpZiAoIWhhc0F1dGhvcml0eSgpKSByZXR1cm4gbnVsbDsKLSAgIAotICAgIGludCBpID0gYXV0aG9yaXR5LmluZGV4T2YoVVNFUl9JTkZPX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGF1dGhvcml0eS5zdWJzdHJpbmcoMCwgaSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgd2l0aCBhbiBhdXRob3JpdHkgY29tcG9uZW50IHRoYXQgaGFzIGEKLSAgICogaG9zdCBwb3J0aW9uLCByZXR1cm5zIGl0OyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGhvc3QoKQotICB7Ci0gICAgaWYgKCFoYXNBdXRob3JpdHkoKSkgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihVU0VSX0lORk9fU0VQQVJBVE9SKTsKLSAgICBpbnQgaiA9IGF1dGhvcml0eS5pbmRleE9mKFBPUlRfU0VQQVJBVE9SKTsKLSAgICByZXR1cm4gaiA8IDAgPyBhdXRob3JpdHkuc3Vic3RyaW5nKGkgKyAxKSA6IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEsIGopOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYW4gYXV0aG9yaXR5IGNvbXBvbmVudCB0aGF0IGhhcyBhCi0gICAqIHBvcnQgcG9ydGlvbiwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBwb3J0KCkKLSAgewotICAgIGlmICghaGFzQXV0aG9yaXR5KCkpIHJldHVybiBudWxsOwotCi0gICAgaW50IGkgPSBhdXRob3JpdHkuaW5kZXhPZihQT1JUX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGF1dGhvcml0eS5zdWJzdHJpbmcoaSArIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBkZXZpY2UgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGRldmljZSgpCi0gIHsKLSAgICByZXR1cm4gZGV2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcKLSAgICogdGhlIHNlZ21lbnRzIG9mIHRoZSBwYXRoOyBhbiBlbXB0eSBhcnJheSBvdGhlcndpc2UuICBUaGUgbGVhZGluZwotICAgKiBzZXBhcmF0b3IgaW4gYW4gYWJzb2x1dGUgcGF0aCBpcyBub3QgcmVwcmVzZW50ZWQgaW4gdGhpcyBhcnJheSwgYnV0IGEKLSAgICogdHJhaWxpbmcgc2VwYXJhdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5LXN0cmluZyBzZWdtZW50IGFzIHRoZQotICAgKiBmaW5hbCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHNlZ21lbnRzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pc2VnbWVudHMuY2xvbmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgc2VnbWVudHMgYXMgdGhlIGFycmF5Ci0gICAqIHJldHVybmVkIGJ5IHtAbGluayAjc2VnbWVudHMgc2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIExpc3Qgc2VnbWVudHNMaXN0KCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3Qoc2VnbWVudHMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNlZ21lbnQgYXJyYXkgdGhhdCB3b3VsZCBiZQotICAgKiByZXR1cm5lZCBieSB7QGxpbmsgI3NlZ21lbnRzIHNlZ21lbnRzfS4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2VnbWVudENvdW50KCkKLSAgewotICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGg7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgZmFzdCwgaW5kZXhlZCBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBzZWdtZW50cyBpbiB0aGUgcGF0aAotICAgKiBzZWdtZW50IGFycmF5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIDxjb2RlPmkgPCAwPC9jb2RlPiBvcgotICAgKiA8Y29kZT5pID49IHNlZ21lbnRDb3VudCgpPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2VnbWVudChpbnQgaSkKLSAgewotICAgIHJldHVybiBzZWdtZW50c1tpXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsYXN0IHNlZ21lbnQgaW4gdGhlIHNlZ21lbnQgYXJyYXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBsYXN0U2VnbWVudCgpCi0gIHsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIHNlZ21lbnRzW2xlbiAtIDFdOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdpdGggYSBwYXRoLCByZXR1cm5zIGEgc3RyaW5nCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoOyA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuICBUaGUgcGF0aAotICAgKiBjb25zaXN0cyBvZiBhIGxlYWRpbmcgc2VnbWVudCBzZXBhcmF0b3IgY2hhcmFjdGVyIChhIHNsYXNoKSwgaWYgdGhlCi0gICAqIHBhdGggaXMgYWJzb2x1dGUsIGZvbGxvd2VkIGJ5IHRoZSBzbGFzaC1zZXBhcmF0ZWQgcGF0aCBzZWdtZW50cy4gIElmCi0gICAqIHRoaXMgVVJJIGhhcyBhIHNlcGFyYXRlIDxhIGhyZWY9IiNkZXZpY2VfZXhwbGFuYXRpb24iPmRldmljZQotICAgKiBjb21wb25lbnQ8L2E+LCBpdCBpcyA8ZW0+bm90PC9lbT4gaW5jbHVkZWQgaW4gdGhlIHBhdGguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHBhdGgoKQotICB7Ci0gICAgaWYgKCFoYXNQYXRoKCkpIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcGF0aCwgcmV0dXJucyBhIHN0cmluZwotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBhdXRob3JpdHkgYW5kIHRoZSAKLSAgICogPGEgaHJlZj0iI2RldmljZV9leHBsYW5hdGlvbiI+ZGV2aWNlIGNvbXBvbmVudDwvYT47IAotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuICAKLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5LCB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzOgotICAgKiA8cHJlPgotICAgKiAgIGRldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgaXQgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgLy9hdXRob3JpdHkvZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICoKLSAgICogPHA+Rm9yIGFuIDxhIGhyZWY9IiNhcmNoaXZlX2V4cGxhbmF0aW9uIj5hcmNoaXZlIFVSSTwvYT4sIGl0J3MganVzdDoKLSAgICogPHByZT4KLSAgICogICBhdXRob3JpdHkvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLjwvcHJlPgotICAgKi8KLSAgcHVibGljIFN0cmluZyBkZXZpY2VQYXRoKCkKLSAgewotICAgIGlmICghaGFzUGF0aCgpKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgewotICAgICAgaWYgKCFpc0FyY2hpdmUoKSkgcmVzdWx0LmFwcGVuZChBVVRIT1JJVFlfU0VQQVJBVE9SKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLQotICAgICAgaWYgKGhhc0RldmljZSgpKSByZXN1bHQuYXBwZW5kKFNFR01FTlRfU0VQQVJBVE9SKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB3aXRoIGEgcXVlcnkgY29tcG9uZW50LCByZXR1cm5zIGl0OwotICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHF1ZXJ5KCkKLSAgewotICAgIHJldHVybiBxdWVyeTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgZnJvbSB0aGlzIFVSSSBhbmQgdGhlIGdpdmVuIHF1ZXJ5LgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKLSAgICogPGNvZGU+cXVlcnk8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHF1ZXJ5IChwb3J0aW9uKSBhY2NvcmRpbmcKLSAgICogdG8ge0BsaW5rICN2YWxpZFF1ZXJ5IHZhbGlkUXVlcnl9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRRdWVyeShTdHJpbmcgcXVlcnkpCi0gIHsKLSAgICBpZiAoIXZhbGlkUXVlcnkocXVlcnkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJpbnZhbGlkIHF1ZXJ5IHBvcnRpb246ICIgKyBxdWVyeSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVVJJKGhpZXJhcmNoaWNhbCwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgYWJzb2x1dGVQYXRoLCBzZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsgCi0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBVUkkgaGFzIGEgbm9uLW51bGwge0BsaW5rICNxdWVyeSBxdWVyeX0sIHJldHVybnMgdGhlIFVSSQotICAgKiBmb3JtZWQgYnkgcmVtb3ZpbmcgaXQ7IHRoaXMgVVJJIHVuY2hhbmdlZCwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFVSSSB0cmltUXVlcnkoKQotICB7Ci0gICAgaWYgKHF1ZXJ5ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIG51bGwsIGZyYWdtZW50KTsgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIGZyYWdtZW50IGNvbXBvbmVudCwgcmV0dXJucyBpdDsgPGNvZGU+bnVsbDwvY29kZT4KLSAgICogb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBmcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBmcm9tIHRoaXMgVVJJIGFuZCB0aGUgZ2l2ZW4gZnJhZ21lbnQuCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgKiA8Y29kZT5mcmFnbWVudDwvY29kZT4gaXMgbm90IGEgdmFsaWQgZnJhZ21lbnQgKHBvcnRpb24pIGFjY29yZGluZwotICAgKiB0byB7QGxpbmsgI3ZhbGlkRnJhZ21lbnQgdmFsaWRGcmFnbWVudH0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZEZyYWdtZW50KFN0cmluZyBmcmFnbWVudCkKLSAgewotICAgIGlmICghdmFsaWRGcmFnbWVudChmcmFnbWVudCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImludmFsaWQgZnJhZ21lbnQgcG9ydGlvbjogIiArIGZyYWdtZW50KTsKLSAgICB9Ci0gICAgVVJJIHJlc3VsdCA9IG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsIHNlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOyAKLQotICAgIGlmICghaGFzRnJhZ21lbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQuY2FjaGVkVHJpbUZyYWdtZW50ID0gdGhpczsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBoYXMgYSBub24tbnVsbCB7QGxpbmsgI2ZyYWdtZW50IGZyYWdtZW50fSwgcmV0dXJucyB0aGUgVVJJCi0gICAqIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1GcmFnbWVudCgpCi0gIHsKLSAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2FjaGVkVHJpbUZyYWdtZW50ID09IG51bGwpCi0gICAgewotICAgICAgY2FjaGVkVHJpbUZyYWdtZW50ID0gbmV3IFVSSShoaWVyYXJjaGljYWwsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIGFic29sdXRlUGF0aCwgc2VnbWVudHMsIHF1ZXJ5LCBudWxsKTsgCi0gICAgfQotCi0gICAgcmV0dXJuIGNhY2hlZFRyaW1GcmFnbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlcyB0aGlzIFVSSSByZWZlcmVuY2UgYWdhaW5zdCBhIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlCi0gICAqIGhpZXJhcmNoaWNhbCBVUkksIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIGFic29sdXRlIFVSSS4gIElmIGFscmVhZHkKLSAgICogYWJzb2x1dGUsIHRoZSBVUkkgaXRzZWxmIGlzIHJldHVybmVkLiAgVVJJIHJlc29sdXRpb24gaXMgZGVzY3JpYmVkIGluCi0gICAqIGRldGFpbCBpbiBzZWN0aW9uIDUuMiBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDCi0gICAqIDIzOTY8L2E+LCAiUmVzb2x2aW5nIFJlbGF0aXZlIFJlZmVyZW5jZXMgdG8gQWJzb2x1dGUgRm9ybS4iCi0gICAqCi0gICAqIDxwPkR1cmluZyByZXNvbHV0aW9uLCBlbXB0eSBzZWdtZW50cywgc2VsZiByZWZlcmVuY2VzICgiLiIpLCBhbmQgcGFyZW50Ci0gICAqIHJlZmVyZW5jZXMgKCIuLiIpIGFyZSBpbnRlcnByZXRlZCwgc28gdGhhdCB0aGV5IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlCi0gICAqIHBhdGguICBTdGVwIDYoZykgZ2l2ZXMgYSBjaG9pY2Ugb2YgaG93IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyBwb2ludCB0byBhIHBhdGggYWJvdmUgdGhlIHJvb3Q6IHRoZSBvZmZlbmRpbmcgc2VnbWVudHMgY2FuCi0gICAqIGJlIHByZXNlcnZlZCBvciBkaXNjYXJkZWQuICBUaGlzIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlbS4gIFRvIGhhdmUgdGhlbQotICAgKiBkaXNjYXJkZWQsIHBsZWFzZSB1c2UgdGhlIHR3by1wYXJhbWV0ZXIgZm9ybSBvZiB7QGxpbmsKLSAgICogI3Jlc29sdmUoVVJJLCBib29sZWFuKSByZXNvbHZlfS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqLwotICBwdWJsaWMgVVJJIHJlc29sdmUoVVJJIGJhc2UpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZShiYXNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlcyB0aGlzIFVSSSByZWZlcmVuY2UgYWdhaW5zdCBhIDxjb2RlPmJhc2U8L2NvZGU+IGFic29sdXRlCi0gICAqIGhpZXJhcmNoaWNhbCBVUkksIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIGFic29sdXRlIFVSSS4gIElmIGFscmVhZHkKLSAgICogYWJzb2x1dGUsIHRoZSBVUkkgaXRzZWxmIGlzIHJldHVybmVkLiAgVVJJIHJlc29sdXRpb24gaXMgZGVzY3JpYmVkIGluCi0gICAqIGRldGFpbCBpbiBzZWN0aW9uIDUuMiBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+UkZDCi0gICAqIDIzOTY8L2E+LCAiUmVzb2x2aW5nIFJlbGF0aXZlIFJlZmVyZW5jZXMgdG8gQWJzb2x1dGUgRm9ybS4iCi0gICAqCi0gICAqIDxwPkR1cmluZyByZXN1bHRpb24sIGVtcHR5IHNlZ21lbnRzLCBzZWxmIHJlZmVyZW5jZXMgKCIuIiksIGFuZCBwYXJlbnQKLSAgICogcmVmZXJlbmNlcyAoIi4uIikgYXJlIGludGVycHJldGVkLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUKLSAgICogcGF0aC4gIFN0ZXAgNihnKSBnaXZlcyBhIGNob2ljZSBvZiBob3cgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHBhcmVudAotICAgKiByZWZlcmVuY2VzIHBvaW50IHRvIGEgcGF0aCBhYm92ZSB0aGUgcm9vdDogdGhlIG9mZmVuZGluZyBzZWdtZW50cyBjYW4KLSAgICogYmUgcHJlc2VydmVkIG9yIGRpc2NhcmRlZC4gIFRoaXMgbWV0aG9kIGNhbiBkbyBlaXRoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwcmVzZXJ2ZVJvb3RQYXJlbnRzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNlZ21lbnRzIHJlZmVyaW5nIHRvIHRoZQotICAgKiBwYXJlbnQgb2YgdGhlIHJvb3QgcGF0aCBhcmUgdG8gYmUgcHJlc2VydmVkOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhleQotICAgKiBhcmUgdG8gYmUgZGlzY2FyZGVkLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKCFiYXNlLmlzSGllcmFyY2hpY2FsKCkgfHwgYmFzZS5pc1JlbGF0aXZlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgInJlc29sdmUgYWdhaW5zdCBub24taGllcmFyY2hpY2FsIG9yIHJlbGF0aXZlIGJhc2UiKTsKLSAgICB9Ci0KLSAgICAvLyBhbiBhYnNvbHV0ZSBVUkkgbmVlZHMgbm8gcmVzb2x2aW5nCi0gICAgaWYgKCFpc1JlbGF0aXZlKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gbm90ZTogaXNSZWxhdGl2ZSgpIC0+IGhpZXJhcmNoaWNhbAotCi0gICAgU3RyaW5nIG5ld0F1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlOwotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgU3RyaW5nIG5ld1F1ZXJ5ID0gcXVlcnk7Ci0gICAgLy8gbm90ZTogaXQncyBva2F5IGZvciB0d28gVVJJcyB0byBzaGFyZSBhIHNlZ21lbnRzIGFycmF5LCBzaW5jZQotICAgIC8vIG5laXRoZXIgd2lsbCBldmVyIG1vZGlmeSBpdAotICAgIAotICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBubyBhdXRob3JpdHk6IHVzZSBiYXNlJ3MKLSAgICAgIG5ld0F1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5KCk7Ci0KLSAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gZGV2aWNlOiB1c2UgYmFzZSdzCi0gICAgICAgIG5ld0RldmljZSA9IGJhc2UuZGV2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGhhc0VtcHR5UGF0aCgpICYmIHF1ZXJ5ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZTogdXNlIGJhc2UgcGF0aCBhbmQgcXVlcnkKLSAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGggPSBiYXNlLmhhc0Fic29sdXRlUGF0aCgpOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gYmFzZS5zZWdtZW50cygpOwotICAgICAgICAgIG5ld1F1ZXJ5ID0gYmFzZS5xdWVyeSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGhhc1JlbGF0aXZlUGF0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aDogbWVyZ2Ugd2l0aCBiYXNlIGFuZCBrZWVwIHF1ZXJ5IChub3RlOiBpZiB0aGUKLSAgICAgICAgICAvLyBiYXNlIGhhcyBubyBwYXRoIGFuZCB0aGlzIGEgbm9uLWVtcHR5IHJlbGF0aXZlIHBhdGgsIHRoZXJlIGlzCi0gICAgICAgICAgLy8gYW4gaW1wbGllZCByb290IGluIHRoZSByZXN1bHRpbmcgcGF0aCkgCi0gICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gYmFzZS5oYXNBYnNvbHV0ZVBhdGgoKSB8fCAhaGFzRW1wdHlQYXRoKCk7Ci0gICAgICAgICAgbmV3U2VnbWVudHMgPSBuZXdBYnNvbHV0ZVBhdGggPyBtZXJnZVBhdGgoYmFzZSwgcHJlc2VydmVSb290UGFyZW50cykKLSAgICAgICAgICAgIDogTk9fU0VHTUVOVFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBhYnNvbHV0ZSBwYXRoOiBrZWVwIGl0IGFuZCBxdWVyeQotICAgICAgfQotICAgICAgLy8gZWxzZSBrZWVwIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0gICAgfQotICAgIC8vIGVsc2Uga2VlcCBhdXRob3JpdHksIGRldmljZSwgcGF0aCwgYW5kIHF1ZXJ5Ci0gICAgCi0gICAgLy8gYWx3YXlzIGtlZXAgZnJhZ21lbnQsIGV2ZW4gaWYgbnVsbCwgYW5kIHVzZSBzY2hlbWUgZnJvbSBiYXNlOwotICAgIC8vIG5vIHZhbGlkYXRpb24gbmVlZGVkIHNpbmNlIGFsbCBjb21wb25lbnRzIGFyZSBmcm9tIGV4aXN0aW5nIFVSSXMKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBiYXNlLnNjaGVtZSgpLCBuZXdBdXRob3JpdHksIG5ld0RldmljZSwKLSAgICAgICAgICAgICAgICAgICBuZXdBYnNvbHV0ZVBhdGgsIG5ld1NlZ21lbnRzLCBuZXdRdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLy8gTWVyZ2VzIHRoaXMgVVJJJ3MgcmVsYXRpdmUgcGF0aCB3aXRoIHRoZSBiYXNlIG5vbi1yZWxhdGl2ZSBwYXRoLiAgSWYKLSAgLy8gYmFzZSBoYXMgbm8gcGF0aCwgdHJlYXQgaXQgYXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aCwgdW5sZXNzIHRoaXMgaGFzCi0gIC8vIG5vIHBhdGggZWl0aGVyLgotICBwcml2YXRlIFN0cmluZ1tdIG1lcmdlUGF0aChVUkkgYmFzZSwgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKGJhc2UuaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVyZ2UgYWdhaW5zdCByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotICAgIGlmICghaGFzUmVsYXRpdmVQYXRoKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWVyZ2Ugbm9uLXJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBpbnQgYmFzZVNlZ21lbnRDb3VudCA9IGJhc2Uuc2VnbWVudENvdW50KCk7Ci0gICAgaW50IHNlZ21lbnRDb3VudCA9IHNlZ21lbnRzLmxlbmd0aDsKLSAgICBTdHJpbmdbXSBzdGFjayA9IG5ldyBTdHJpbmdbYmFzZVNlZ21lbnRDb3VudCArIHNlZ21lbnRDb3VudF07Ci0gICAgaW50IHNwID0gMDsKLQotICAgIC8vIHVzZSBhIHN0YWNrIHRvIGFjY3VtdWxhdGUgc2VnbWVudHMgb2YgYmFzZSwgZXhjZXB0IGZvciB0aGUgbGFzdAotICAgIC8vIChpLmUuIHNraXAgdHJhaWxpbmcgc2VwYXJhdG9yIGFuZCBhbnl0aGluZyBmb2xsb3dpbmcgaXQpLCBhbmQgb2YKLSAgICAvLyByZWxhdGl2ZSBwYXRoCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlU2VnbWVudENvdW50IC0gMTsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIGJhc2Uuc2VnbWVudChpKSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcCA9IGFjY3VtdWxhdGUoc3RhY2ssIHNwLCBzZWdtZW50c1tpXSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIHJlbGF0aXZlIHBhdGggaXMgZW1wdHkgb3IgZW5kcyBpbiBhbiBlbXB0eSBzZWdtZW50LCBhIHBhcmVudCAKLSAgICAvLyByZWZlcmVuY2UsIG9yIGEgc2VsZiByZWZlcmVuZmNlLCBhZGQgYSB0cmFpbGluZyBzZXBhcmF0b3IgdG8gYQotICAgIC8vIG5vbi1lbXB0eSBwYXRoCi0gICAgaWYgKHNwID4gMCAmJiAgKHNlZ21lbnRDb3VudCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1BBUkVOVC5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNFR01FTlRfU0VMRi5lcXVhbHMoc2VnbWVudHNbc2VnbWVudENvdW50IC0gMV0pKSkKLSAgICB7Ci0gICAgICBzdGFja1tzcCsrXSA9IFNFR01FTlRfRU1QVFk7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIGEgY29ycmVjdGx5IHNpemVkIHJlc3VsdAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbc3BdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc3RhY2ssIDAsIHJlc3VsdCwgMCwgc3ApOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBBZGRzIGEgc2VnbWVudCB0byBhIHN0YWNrLCBza2lwcGluZyBlbXB0eSBzZWdtZW50cyBhbmQgc2VsZiByZWZlcmVuY2VzLAotICAvLyBhbmQgaW50ZXJwcmV0aW5nIHBhcmVudCByZWZlcmVuY2VzLgotICBwcml2YXRlIHN0YXRpYyBpbnQgYWNjdW11bGF0ZShTdHJpbmdbXSBzdGFjaywgaW50IHNwLCBTdHJpbmcgc2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZVJvb3RQYXJlbnRzKQotICB7Ci0gICAgaWYgKFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50KSkKLSAgICB7Ci0gICAgICBpZiAoc3AgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gc3BlY2lhbCBjYXJlIG11c3QgYmUgdGFrZW4gZm9yIGEgcm9vdCdzIHBhcmVudCByZWZlcmVuY2U6IGl0IGlzCi0gICAgICAgIC8vIGVpdGhlciBpZ25vcmVkIG9yIHRoZSBzeW1ib2xpYyByZWZlcmVuY2UgaXRzZWxmIGlzIHB1c2hlZAotICAgICAgICBpZiAocHJlc2VydmVSb290UGFyZW50cykgc3RhY2tbc3ArK10gPSBzZWdtZW50OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSBhY2N1bXVsYXRpbmcgcm9vdCBwYXJlbnQgcmVmZXJlbmNlcywKLSAgICAgICAgLy8gcGFyZW50IHJlZmVyZW5jZXMgc2ltcGx5IHBvcCB0aGUgbGFzdCBzZWdtZW50IGRlc2NlbmRlZAotICAgICAgICBpZiAoU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHN0YWNrW3NwIC0gMV0pKSBzdGFja1tzcCsrXSA9IHNlZ21lbnQ7Ci0gICAgICAgIGVsc2Ugc3AtLTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIVNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnQpICYmICFTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnQpKQotICAgIHsKLSAgICAgIC8vIHNraXAgZW1wdHkgc2VnbWVudHMgYW5kIHNlbGYgcmVmZXJlbmNlczsgcHVzaCBldmVyeXRoaW5nIGVsc2UKLSAgICAgIHN0YWNrW3NwKytdID0gc2VnbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIHNwOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBzaG9ydGVzdCByZWxhdGl2ZSBvciwgaWYgbmVjZXNzYXJ5LCB0aGUgYWJzb2x1dGUgVVJJIHRoYXQsCi0gICAqIHdoZW4gcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZ2l2ZW4gPGNvZGU+YmFzZTwvY29kZT4gYWJzb2x1dGUgaGllcmFyY2hpY2FsCi0gICAqIFVSSSB1c2luZyB7QGxpbmsgI3Jlc29sdmUoVVJJKSByZXNvbHZlfSwgd2lsbCB5aWVsZCB0aGlzIGFic29sdXRlIFVSSS4gIAotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMKLSAgICogbm9uLWhpZXJhcmNoaWNhbCBvciBpcyByZWxhdGl2ZS4KLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPnRoaXM8L2NvZGU+IGlzCi0gICAqIHJlbGF0aXZlLgotICAgKi8KLSAgcHVibGljIFVSSSBkZXJlc29sdmUoVVJJIGJhc2UpCi0gIHsKLSAgICByZXR1cm4gZGVyZXNvbHZlKGJhc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyBhbiBhYnNvbHV0ZSBVUkkgdGhhdCwgd2hlbiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBnaXZlbgotICAgKiA8Y29kZT5iYXNlPC9jb2RlPiBhYnNvbHV0ZSBoaWVyYXJjaGljYWwgVVJJIHVzaW5nIHtAbGluawotICAgKiAjcmVzb2x2ZShVUkksIGJvb2xlYW4pIHJlc29sdmV9LCB3aWxsIHlpZWxkIHRoaXMgYWJzb2x1dGUgVVJJLgotICAgKgotICAgKiBAcGFyYW0gcHJlc2VydmVSb290UGFyZW50cyB0aGUgYm9vbGVhbiBhcmd1bWVudCB0byA8Y29kZT5yZXNvbHZlKFVSSSwKLSAgICogYm9vbGVhbik8L2NvZGU+IGZvciB3aGljaCB0aGUgcmV0dXJuZWQgVVJJIHNob3VsZCByZXNvbHZlIHRvIHRoaXMgVVJJLgotICAgKiBAcGFyYW0gYW55UmVsUGF0aCBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJldHVybmVkIFVSSSdzIHBhdGggKGlmCi0gICAqIGFueSkgd2lsbCBiZSByZWxhdGl2ZSwgaWYgcG9zc2libGUuICBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBmb3JtIG9mCi0gICAqIHRoZSByZXN1bHQncyBwYXRoIHdpbGwgZGVwZW5kIHVwb24gdGhlIG5leHQgcGFyYW1ldGVyLgotICAgKiBAcGFyYW0gc2hvcnRlclJlbFBhdGggaWYgPGNvZGU+YW55UmVsUGF0aDwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gICAqIGFuZCB0aGlzIHBhcmFtZXRlciBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJldHVybmVkIFVSSSdzIHBhdGggKGlmCi0gICAqIGFueSkgd2lsbCBiZSByZWxhdGl2ZSwgaWYgb25lIGNhbiBiZSBmb3VuZCB0aGF0IGlzIG5vIGxvbmdlciAoYnkgbnVtYmVyCi0gICAqIG9mIHNlZ21lbnRzKSB0aGFuIHRoZSBhYnNvbHV0ZSBwYXRoLiAgSWYgYm90aCA8Y29kZT5hbnlSZWxQYXRoPC9jb2RlPgotICAgKiBhbmQgdGhpcyBwYXJhbWV0ZXIgYXJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBiZSBhYnNvbHV0ZS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmJhc2U8L2NvZGU+IGlzCi0gICAqIG5vbi1oaWVyYXJjaGljYWwgb3IgaXMgcmVsYXRpdmUuCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT50aGlzPC9jb2RlPiBpcwotICAgKiByZWxhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgZGVyZXNvbHZlKFVSSSBiYXNlLCBib29sZWFuIHByZXNlcnZlUm9vdFBhcmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYW55UmVsUGF0aCwgYm9vbGVhbiBzaG9ydGVyUmVsUGF0aCkKLSAgewotICAgIGlmICghYmFzZS5pc0hpZXJhcmNoaWNhbCgpIHx8IGJhc2UuaXNSZWxhdGl2ZSgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJkZXJlc29sdmUgYWdhaW5zdCBub24taGllcmFyY2hpY2FsIG9yIHJlbGF0aXZlIGJhc2UiKTsKLSAgICB9Ci0gICAgaWYgKGlzUmVsYXRpdmUoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkZXJlc29sdmUgcmVsYXRpdmUgVVJJIik7Ci0gICAgfQotCi0gICAgLy8gbm90ZTogdGhlc2UgYXNzZXJ0aW9ucyBpbXBseSB0aGF0IG5laXRoZXIgdGhpcyBub3IgdGhlIGJhc2UgVVJJIGhhcyBhCi0gICAgLy8gcmVsYXRpdmUgcGF0aDsgdGh1cywgYm90aCBoYXZlIGVpdGhlciBhbiBhYnNvbHV0ZSBwYXRoIG9yIG5vIHBhdGgKLSAgICAKLSAgICAvLyBkaWZmZXJlbnQgc2NoZW1lOiBuZWVkIGNvbXBsZXRlLCBhYnNvbHV0ZSBVUkkKLSAgICBpZiAoIXNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKGJhc2Uuc2NoZW1lKCkpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIHNpbmNlIGJhc2UgbXVzdCBiZSBoaWVyYXJjaGljYWwsIGFuZCBzaW5jZSBhIG5vbi1oaWVyYXJjaGljYWwgVVJJCi0gICAgLy8gbXVzdCBoYXZlIGJvdGggc2NoZW1lIGFuZCBvcGFxdWUgcGFydCwgdGhlIGNvbXBsZXRlIGFic29sdXRlIFVSSSBpcwotICAgIC8vIG5lZWRlZCB0byByZXNvbHZlIHRvIGEgbm9uLWhpZXJhcmNoaWNhbCBVUkkKLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIG5ld0F1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlOwotICAgIGJvb2xlYW4gbmV3QWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gc2VnbWVudHM7Ci0gICAgU3RyaW5nIG5ld1F1ZXJ5ID0gcXVlcnk7Ci0KLSAgICBpZiAoZXF1YWxzKGF1dGhvcml0eSwgYmFzZS5hdXRob3JpdHkoKSkgJiYKLSAgICAgICAgKGhhc0RldmljZSgpIHx8IGhhc1BhdGgoKSB8fCAoIWJhc2UuaGFzRGV2aWNlKCkgJiYgIWJhc2UuaGFzUGF0aCgpKSkpCi0gICAgewotICAgICAgLy8gbWF0Y2hpbmcgYXV0aG9yaXRpZXMgYW5kIG5vIGRldmljZSBvciBwYXRoIHJlbW92YWwKLSAgICAgIG5ld0F1dGhvcml0eSA9IG51bGw7Ci0KLSAgICAgIGlmIChlcXVhbHMoZGV2aWNlLCBiYXNlLmRldmljZSgpKSAmJiAoaGFzUGF0aCgpIHx8ICFiYXNlLmhhc1BhdGgoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIG1hdGNoaW5nIGRldmljZXMgYW5kIG5vIHBhdGggcmVtb3ZhbAotICAgICAgICBuZXdEZXZpY2UgPSBudWxsOwotCi0gICAgICAgIC8vIGV4Y2VwdGlvbiBpZiAoIWhhc1BhdGgoKSAmJiBiYXNlLmhhc1BhdGgoKSkKLQotICAgICAgICBpZiAoIWFueVJlbFBhdGggJiYgIXNob3J0ZXJSZWxQYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdXNlciByZWplY3RzIGEgcmVsYXRpdmUgcGF0aDoga2VlcCBhYnNvbHV0ZSBvciBubyBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFzUGF0aCgpID09IGJhc2UuaGFzUGF0aCgpICYmIHNlZ21lbnRzRXF1YWwoYmFzZSkgJiYKLSAgICAgICAgICAgICAgICAgZXF1YWxzKHF1ZXJ5LCBiYXNlLnF1ZXJ5KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY3VycmVudCBkb2N1bWVudCByZWZlcmVuY2U6IGtlZXAgbm8gcGF0aCBvciBxdWVyeQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGZhbHNlOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgICAgICAgbmV3UXVlcnkgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFoYXNQYXRoKCkgJiYgIWJhc2UuaGFzUGF0aCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbm8gcGF0aHM6IGtlZXAgcXVlcnkgb25seQotICAgICAgICAgIG5ld0Fic29sdXRlUGF0aCA9IGZhbHNlOwotICAgICAgICAgIG5ld1NlZ21lbnRzID0gTk9fU0VHTUVOVFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZXhjZXB0aW9uIGlmICghaGFzQWJzb2x1dGVQYXRoKCkpCi0gICAgICAgIGVsc2UgaWYgKGhhc0NvbGxhcHNhYmxlU2VnbWVudHMocHJlc2VydmVSb290UGFyZW50cykpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwYXRoIGZvcm0gZGVtYW5kcyBhbiBhYnNvbHV0ZSBwYXRoOiBrZWVwIGl0IGFuZCBxdWVyeQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGtlZXAgcXVlcnkgYW5kIHNlbGVjdCByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGxlbmd0aAotICAgICAgICAgIFN0cmluZ1tdIHJlbCA9IGZpbmRSZWxhdGl2ZVBhdGgoYmFzZSwgcHJlc2VydmVSb290UGFyZW50cyk7Ci0gICAgICAgICAgaWYgKGFueVJlbFBhdGggfHwgc2VnbWVudHMubGVuZ3RoID4gcmVsLmxlbmd0aCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB1c2VyIGRlbWFuZHMgYSByZWxhdGl2ZSBwYXRoIG9yIHRoZSBhYnNvbHV0ZSBwYXRoIGlzIGxvbmdlcgotICAgICAgICAgICAgbmV3QWJzb2x1dGVQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgICBuZXdTZWdtZW50cyA9IHJlbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZWxzZSBrZWVwIHNob3J0ZXIgYWJzb2x1dGUgcGF0aAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBlbHNlIGtlZXAgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLSAgICB9Ci0gICAgLy8gZWxzZSBrZWVwIGF1dGhvcml0eSwgZGV2aWNlLCBwYXRoLCBhbmQgcXVlcnkKLQotICAgIC8vIGFsd2F5cyBpbmNsdWRlIGZyYWdtZW50LCBldmVuIGlmIG51bGw7Ci0gICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbXBvbmVudHMgYXJlIGZyb20gZXhpc3RpbmcgVVJJcwotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIG51bGwsIG5ld0F1dGhvcml0eSwgbmV3RGV2aWNlLCBuZXdBYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIG5ld1F1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5vbi1yZWxhdGl2ZSBwYXRoIGluY2x1ZGVzIHNlZ21lbnRzIHRoYXQgd291bGQgYmUKLSAgLy8gY29sbGFwc2VkIHdoZW4gcmVzb2x2aW5nOyBmYWxzZSBvdGhlcndpc2UuICBJZiBwcmVzZXJ2ZVJvb3RQYXJlbnRzIGlzCi0gIC8vIHRydWUsIGNvbGxhcHNhYmxlIHNlZ21lbnRzIGluY2x1ZGUgYW55IGVtcHR5IHNlZ21lbnRzLCBleGNlcHQgZm9yIHRoZQotICAvLyBsYXN0IHNlZ21lbnQsIGFzIHdlbGwgYXMgYW5kIHBhcmVudCBhbmQgc2VsZiByZWZlcmVuY2VzLiAgSWYKLSAgLy8gcHJlc2VydmVSb290c1BhcmVudHMgaXMgZmFsc2UsIHBhcmVudCByZWZlcmVuY2VzIGFyZSBub3QgY29sbGFwc2FibGUgaWYKLSAgLy8gdGhleSBhcmUgdGhlIGZpcnN0IHNlZ21lbnQgb3IgcHJlY2VlZGVkIG9ubHkgYnkgb3RoZXIgcGFyZW50Ci0gIC8vIHJlZmVyZW5jZXMuCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNDb2xsYXBzYWJsZVNlZ21lbnRzKGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZXN0IGNvbGxhcHNhYmlsaXR5IG9mIHJlbGF0aXZlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMCwgbGVuID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50c1tpXTsKLSAgICAgIGlmICgoaSA8IGxlbiAtIDEgJiYgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudCkpIHx8Ci0gICAgICAgICAgU0VHTUVOVF9TRUxGLmVxdWFscyhzZWdtZW50KSB8fAotICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50KSAmJiAoCi0gICAgICAgICAgICAhcHJlc2VydmVSb290UGFyZW50cyB8fCAoCi0gICAgICAgICAgICAgIGkgIT0gMCAmJiAhU0VHTUVOVF9QQVJFTlQuZXF1YWxzKHNlZ21lbnRzW2kgLSAxXSkpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJldHVybnMgdGhlIHNob3J0ZXN0IHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aGUgdGhlIG5vbi1yZWxhdGl2ZSBwYXRoIG9mCi0gIC8vIHRoZSBnaXZlbiBiYXNlIGFuZCB0aGlzIGFic29sdXRlIHBhdGguICBJZiB0aGUgYmFzZSBoYXMgbm8gcGF0aCwgaXQgaXMKLSAgLy8gdHJlYXRlZCBhcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLgotICBwcml2YXRlIFN0cmluZ1tdIGZpbmRSZWxhdGl2ZVBhdGgoVVJJIGJhc2UsIGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChiYXNlLmhhc1JlbGF0aXZlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJmaW5kIHJlbGF0aXZlIHBhdGggYWdhaW5zdCBiYXNlIHdpdGggcmVsYXRpdmUgcGF0aCIpOwotICAgIH0KLSAgICBpZiAoIWhhc0Fic29sdXRlUGF0aCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJmaW5kIHJlbGF0aXZlIHBhdGggb2Ygbm9uLWFic29sdXRlIHBhdGgiKTsKLSAgICB9Ci0KLSAgICAvLyB0cmVhdCBhbiBlbXB0eSBiYXNlIHBhdGggYXMgdGhlIHJvb3QgYWJzb2x1dGUgcGF0aAotICAgIFN0cmluZ1tdIHN0YXJ0UGF0aCA9IGJhc2UuY29sbGFwc2VTZWdtZW50cyhwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICBTdHJpbmdbXSBlbmRQYXRoID0gc2VnbWVudHM7Ci0KLSAgICAvLyBkcm9wIGxhc3Qgc2VnbWVudCBmcm9tIGJhc2UsIGFzIGluIHJlc29sdmluZwotICAgIGludCBzdGFydENvdW50ID0gc3RhcnRQYXRoLmxlbmd0aCA+IDAgPyBzdGFydFBhdGgubGVuZ3RoIC0gMSA6IDA7Ci0gICAgaW50IGVuZENvdW50ID0gZW5kUGF0aC5sZW5ndGg7Ci0KLSAgICAvLyBpbmRleCBvZiBmaXJzdCBzZWdtZW50IHRoYXQgaXMgZGlmZmVyZW50IGJldHdlZW4gZW5kUGF0aCBhbmQgc3RhcnRQYXRoCi0gICAgaW50IGRpZmYgPSAwOwotCi0gICAgLy8gaWYgZW5kUGF0aCBpcyBzaG9ydGVyIHRoYW4gc3RhcnRQYXRoLCB0aGUgbGFzdCBzZWdtZW50IG9mIGVuZFBhdGggbWF5Ci0gICAgLy8gbm90IGJlIGNvbXBhcmVkOiBiZWNhdXNlIHN0YXJ0UGF0aCBoYXMgYmVlbiBjb2xsYXBzZWQgYW5kIGhhZCBpdHMKLSAgICAvLyBsYXN0IHNlZ21lbnQgcmVtb3ZlZCwgYWxsIHByZWNlZWRpbmcgc2VnbWVudHMgY2FuIGJlIGNvbnNpZGVyZWQgbm9uLQotICAgIC8vIGVtcHR5IGFuZCBmb2xsb3dlZCBieSBhIHNlcGFyYXRvciwgd2hpbGUgdGhlIGxhc3Qgc2VnbWVudCBvZiBlbmRQYXRoCi0gICAgLy8gd2lsbCBlaXRoZXIgYmUgbm9uLWVtcHR5IGFuZCBub3QgZm9sbG93ZWQgYnkgYSBzZXBhcmF0b3IsIG9yIGp1c3QgZW1wdHkKLSAgICBmb3IgKGludCBjb3VudCA9IHN0YXJ0Q291bnQgPCBlbmRDb3VudCA/IHN0YXJ0Q291bnQgOiBlbmRDb3VudCAtIDE7Ci0gICAgICAgICBkaWZmIDwgY291bnQgJiYgc3RhcnRQYXRoW2RpZmZdLmVxdWFscyhlbmRQYXRoW2RpZmZdKTsgZGlmZisrKTsKLQotICAgIGludCB1cENvdW50ID0gc3RhcnRDb3VudCAtIGRpZmY7Ci0gICAgaW50IGRvd25Db3VudCA9IGVuZENvdW50IC0gZGlmZjsKLQotICAgIC8vIGEgc2luZ2xlIHNlcGFyYXRvciwgcG9zc2libHkgcHJlY2VlZGVkIGJ5IHNvbWUgcGFyZW50IHJlZmVyZW5jZQotICAgIC8vIHNlZ21lbnRzLCBpcyByZWR1bmRhbnQKLSAgICBpZiAoZG93bkNvdW50ID09IDEgJiYgU0VHTUVOVF9FTVBUWS5lcXVhbHMoZW5kUGF0aFtlbmRDb3VudCAtIDFdKSkKLSAgICB7Ci0gICAgICBkb3duQ291bnQgPSAwOwotICAgIH0KLQotICAgIC8vIGFuIGVtcHR5IHBhdGggbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgIi4iIGlmIHRoZXJlIGlzIG5vCi0gICAgLy8gcXVlcnksIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gYSBjdXJyZW50IGRvY3VtZW50IHJlZmVyZW5jZQotICAgIGlmICh1cENvdW50ICsgZG93bkNvdW50ID09IDApCi0gICAgewotICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nW10geyBTRUdNRU5UX1NFTEYgfTsKLSAgICAgIHJldHVybiBOT19TRUdNRU5UUzsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t1cENvdW50ICsgZG93bkNvdW50XTsKLSAgICBBcnJheXMuZmlsbChyZXN1bHQsIDAsIHVwQ291bnQsIFNFR01FTlRfUEFSRU5UKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGVuZFBhdGgsIGRpZmYsIHJlc3VsdCwgdXBDb3VudCwgZG93bkNvdW50KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gQ29sbGFwc2VzIG5vbi1lbmRpbmcgZW1wdHkgc2VnbWVudHMsIHBhcmVudCByZWZlcmVuY2VzLCBhbmQgc2VsZgotICAvLyByZWZlcmVuY2VzIGluIGEgbm9uLXJlbGF0aXZlIHBhdGgsIHJldHVybmluZyB0aGUgc2FtZSBwYXRoIHRoYXQgd291bGQKLSAgLy8gYmUgcHJvZHVjZWQgZnJvbSB0aGUgYmFzZSBoaWVyYXJjaGljYWwgVVJJIGFzIHBhcnQgb2YgYSByZXNvbHZlLgotICBTdHJpbmdbXSBjb2xsYXBzZVNlZ21lbnRzKGJvb2xlYW4gcHJlc2VydmVSb290UGFyZW50cykKLSAgewotICAgIGlmIChoYXNSZWxhdGl2ZVBhdGgoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb2xsYXBzZSByZWxhdGl2ZSBwYXRoIik7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNDb2xsYXBzYWJsZVNlZ21lbnRzKHByZXNlcnZlUm9vdFBhcmVudHMpKSByZXR1cm4gc2VnbWVudHMoKTsKLQotICAgIC8vIHVzZSBhIHN0YWNrIHRvIGFjY3VtdWxhdGUgc2VnbWVudHMKLSAgICBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIHN0YWNrID0gbmV3IFN0cmluZ1tzZWdtZW50Q291bnRdOwotICAgIGludCBzcCA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHNwID0gYWNjdW11bGF0ZShzdGFjaywgc3AsIHNlZ21lbnRzW2ldLCBwcmVzZXJ2ZVJvb3RQYXJlbnRzKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgcGF0aCBpcyBub24tZW1wdHkgYW5kIG9yaWdpbmFsbHkgZW5kZWQgaW4gYW4gZW1wdHkgc2VnbWVudCwgYQotICAgIC8vIHBhcmVudCByZWZlcmVuY2UsIG9yIGEgc2VsZiByZWZlcmVuY2UsIGFkZCBhIHRyYWlsaW5nIHNlcGFyYXRvcgotICAgIGlmIChzcCA+IDAgJiYgKFNFR01FTlRfRU1QVFkuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSB8fAotICAgICAgICAgICAgICAgICAgIFNFR01FTlRfUEFSRU5ULmVxdWFscyhzZWdtZW50c1tzZWdtZW50Q291bnQgLSAxXSkgfHwKLSAgICAgICAgICAgICAgICAgICBTRUdNRU5UX1NFTEYuZXF1YWxzKHNlZ21lbnRzW3NlZ21lbnRDb3VudCAtIDFdKSkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN0YWNrW3NwKytdID0gU0VHTUVOVF9FTVBUWTsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gYSBjb3JyZWN0bHkgc2l6ZWQgcmVzdWx0Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tzcF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzdGFjaywgMCwgcmVzdWx0LCAwLCBzcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBVUkkuICBGb3IgYSBnZW5lcmljLAotICAgKiBub24taGllcmFyY2hpY2FsIFVSSSwgdGhpcyBsb29rcyBsaWtlOgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTpvcGFxdWVQYXJ0I2ZyYWdtZW50PC9wcmU+Ci0gICAqIAotICAgKiA8cD5Gb3IgYSBoaWVyYXJjaGljYWwgVVJJLCBpdCBsb29rcyBsaWtlOgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTovL2F1dGhvcml0eS9kZXZpY2UvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLj9xdWVyeSNmcmFnbWVudDwvcHJlPgotICAgKgotICAgKiA8cD5Gb3IgYW4gPGEgaHJlZj0iI2FyY2hpdmVfZXhwbGFuYXRpb24iPmFyY2hpdmUgVVJJPC9hPiwgaXQncyBqdXN0OgotICAgKiA8cHJlPgotICAgKiAgIHNjaGVtZTphdXRob3JpdHkvcGF0aFNlZ21lbnQxL3BhdGhTZWdtZW50Mi4uLj9xdWVyeSNmcmFnbWVudDwvcHJlPgotICAgKiA8cD5PZiBjb3Vyc2UsIGFic2VudCBjb21wb25lbnRzIGFuZCB0aGVpciBzZXBhcmF0b3JzIHdpbGwgYmUgb21pdHRlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGNhY2hlZFRvU3RyaW5nID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGlmICghaXNSZWxhdGl2ZSgpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoU0NIRU1FX1NFUEFSQVRPUik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0hpZXJhcmNoaWNhbCgpKQotICAgICAgewotICAgICAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzQXJjaGl2ZSgpKSByZXN1bHQuYXBwZW5kKEFVVEhPUklUWV9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNEZXZpY2UoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU0VHTUVOVF9TRVBBUkFUT1IpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNBYnNvbHV0ZVBhdGgoKSkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0LmFwcGVuZChTRUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWdtZW50c1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzUXVlcnkoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoUVVFUllfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHF1ZXJ5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGF1dGhvcml0eSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChoYXNGcmFnbWVudCgpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotICAgICAgfQotICAgICAgY2FjaGVkVG9TdHJpbmcgPSByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlZFRvU3RyaW5nOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSSSBmb3IgZGVidWdnaW5nLCBleHBsaWNpdGx5Ci0gIC8vIHNob3dpbmcgZWFjaCBvZiB0aGUgY29tcG9uZW50cy4KLSAgU3RyaW5nIHRvU3RyaW5nKGJvb2xlYW4gaW5jbHVkZVNpbXBsZUZvcm0pCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpbmNsdWRlU2ltcGxlRm9ybSkgcmVzdWx0LmFwcGVuZCh0b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiBoaWVyYXJjaGljYWw6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoaGllcmFyY2hpY2FsKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICBzY2hlbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICBhdXRob3JpdHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoYXV0aG9yaXR5KTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgICBkZXZpY2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiBhYnNvbHV0ZVBhdGg6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoYWJzb2x1dGVQYXRoKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgc2VnbWVudHM6ICIpOwotICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT0gMCkgcmVzdWx0LmFwcGVuZCgiPGVtcHR5PiIpOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA+IDApIHJlc3VsdC5hcHBlbmQoIlxuICAgICAgICAgICAgICAgIik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4gICAgICAgIHF1ZXJ5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHF1ZXJ5KTsKLSAgICByZXN1bHQuYXBwZW5kKCJcbiAgICAgZnJhZ21lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJZiB0aGlzIFVSSSBtYXkgcmVmZXIgZGlyZWN0bHkgdG8gYSBsb2NhbGx5IGFjY2Vzc2libGUgZmlsZSwgYXMKLSAgICogZGV0ZXJtaW5lZCBieSB7QGxpbmsgI2lzRmlsZSBpc0ZpbGV9LCB7QGxpbmsgZGVjb2RlIGRlY29kZXN9IGFuZCBmb3JtYXRzICAKLSAgICogdGhlIFVSSSBhcyBhIHBhdGhuYW1lIHRvIHRoYXQgZmlsZTsgcmV0dXJucyBudWxsIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+SWYgdGhlcmUgaXMgbm8gYXV0aG9yaXR5LCB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nIGlzOgotICAgKiA8cHJlPgotICAgKiAgIGRldmljZS9wYXRoU2VnbWVudDEvcGF0aFNlZ21lbnQyLi4uPC9wcmU+Ci0gICAqCi0gICAqIDxwPklmIHRoZXJlIGlzIGFuIGF1dGhvcml0eSwgaXQgaXM6Ci0gICAqIDxwcmU+Ci0gICAqICAgLy9hdXRob3JpdHkvZGV2aWNlL3BhdGhTZWdtZW50MS9wYXRoU2VnbWVudDIuLi48L3ByZT4KLSAgICogCi0gICAqIDxwPkhvd2V2ZXIsIHRoZSBjaGFyYWN0ZXIgdXNlZCBhcyBhIHNlcGFyYXRvciBpcyBzeXN0ZW0tZGVwZW5kYW50IGFuZAotICAgKiBvYnRhaW5lZCBmcm9tIHtAbGluayBqYXZhLmlvLkZpbGUjc2VwYXJhdG9yQ2hhcn0uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvRmlsZVN0cmluZygpCi0gIHsKLSAgICBpZiAoIWlzRmlsZSgpKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgY2hhciBzZXBhcmF0b3IgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0KLSAgICBpZiAoaGFzQXV0aG9yaXR5KCkpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgcmVzdWx0LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgcmVzdWx0LmFwcGVuZChhdXRob3JpdHkpOwotCi0gICAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRGV2aWNlKCkpIHJlc3VsdC5hcHBlbmQoZGV2aWNlKTsKLSAgICBpZiAoaGFzQWJzb2x1dGVQYXRoKCkpIHJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHNlZ21lbnRzW2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVjb2RlKHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgb24gdG8gdGhlIGVuZAotICAgKiBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSSwgaWYgaGllcmFyY2hpY2FsOyB0aGlzIFVSSSB1bmNoYW5nZWQsCi0gICAqIG90aGVyd2lzZS4gIElmIHRoaXMgVVJJIGhhcyBhbiBhdXRob3JpdHkgYW5kL29yIGRldmljZSwgYnV0IG5vIHBhdGgsCi0gICAqIHRoZSBzZWdtZW50IGJlY29tZXMgdGhlIGZpcnN0IHVuZGVyIHRoZSByb290IGluIGFuIGFic29sdXRlIHBhdGguCi0gICAqCi0gICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5zZWdtZW50PC9jb2RlPgotICAgKiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudH0uCi0gICAqLwotICBwdWJsaWMgVVJJIGFwcGVuZFNlZ21lbnQoU3RyaW5nIHNlZ21lbnQpCi0gIHsKLSAgICBpZiAoIXZhbGlkU2VnbWVudChzZWdtZW50KSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBzZWdtZW50KTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkpIHJldHVybiB0aGlzOwotCi0gICAgLy8gYWJzb2x1dGUgcGF0aCBvciBubyBwYXRoIC0+IGFic29sdXRlIHBhdGgKLSAgICBib29sZWFuIG5ld0Fic29sdXRlUGF0aCA9ICFoYXNSZWxhdGl2ZVBhdGgoKTsKLQotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBuZXcgU3RyaW5nW2xlbiArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIG5ld1NlZ21lbnRzW2xlbl0gPSBzZWdtZW50OwotCi0gICAgcmV0dXJuIG5ldyBVUkkodHJ1ZSwgc2NoZW1lLCBhdXRob3JpdHksIGRldmljZSwgbmV3QWJzb2x1dGVQYXRoLAotICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLCBxdWVyeSwgZnJhZ21lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgc2VnbWVudHMgb24gdG8gdGhlCi0gICAqIGVuZCBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSSwgaWYgaGllcmFyY2hpY2FsOyB0aGlzIFVSSSB1bmNoYW5nZWQsCi0gICAqIG90aGVyd2lzZS4gIElmIHRoaXMgVVJJIGhhcyBhbiBhdXRob3JpdHkgYW5kL29yIGRldmljZSwgYnV0IG5vIHBhdGgsCi0gICAqIHRoZSBzZWdtZW50cyBhcmUgbWFkZSB0byBmb3JtIGFuIGFic29sdXRlIHBhdGguCi0gICAqCi0gICAqIEBwYXJhbSBzZWdtZW50cyBhbiBhcnJheSBvZiBub24tbnVsbCBzdHJpbmdzLCBlYWNoIHJlcHJlc2VudGluZyBvbmUKLSAgICogc2VnbWVudCBvZiB0aGUgcGF0aC4gIElmIGRlc2lyZWQsIGEgdHJhaWxpbmcgc2VwYXJhdG9yIHNob3VsZCBiZQotICAgKiByZXByZXNlbnRlZCBieSBhbiBlbXB0eS1zdHJpbmcgc2VnbWVudCBhcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZQotICAgKiBhcnJheS4KLSAgICoKLSAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPnNlZ21lbnRzPC9jb2RlPgotICAgKiBpcyBub3QgYSB2YWxpZCBzZWdtZW50IGFycmF5IGFjY29yZGluZyB0byB7QGxpbmsgI3ZhbGlkU2VnbWVudHN9LgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmRTZWdtZW50cyhTdHJpbmdbXSBzZWdtZW50cykKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50cyhzZWdtZW50cykpCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBzZWdtZW50cyA9PSBudWxsID8gImludmFsaWQgc2VnbWVudHM6ICIgKyBzZWdtZW50cyA6Ci0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQ6ICIgKyBmaXJzdEludmFsaWRTZWdtZW50KHNlZ21lbnRzKTsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocyk7Ci0gICAgfQotCi0gICAgaWYgKCFpc0hpZXJhcmNoaWNhbCgpKSByZXR1cm4gdGhpczsKLQotICAgIC8vIGFic29sdXRlIHBhdGggb3Igbm8gcGF0aCAtPiBhYnNvbHV0ZSBwYXRoCi0gICAgYm9vbGVhbiBuZXdBYnNvbHV0ZVBhdGggPSAhaGFzUmVsYXRpdmVQYXRoKCk7IAotCi0gICAgaW50IGxlbiA9IHRoaXMuc2VnbWVudHMubGVuZ3RoOwotICAgIGludCBzZWdtZW50c0NvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW4gKyBzZWdtZW50c0NvdW50XTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCBsZW4sIHNlZ21lbnRzQ291bnQpOwotICAgIAotICAgIHJldHVybiBuZXcgVVJJKHRydWUsIHNjaGVtZSwgYXV0aG9yaXR5LCBkZXZpY2UsIG5ld0Fic29sdXRlUGF0aCwKLSAgICAgICAgICAgICAgICAgICBuZXdTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9ybWVkIGJ5IHRyaW1taW5nIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlZ21lbnRzCi0gICAqIChpbmNsdWRpbmcgZW1wdHkgc2VnbWVudHMsIHN1Y2ggYXMgb25lIHJlcHJlc2VudGluZyBhIHRyYWlsaW5nCi0gICAqIHNlcGFyYXRvcikgZnJvbSB0aGUgZW5kIG9mIHRoZSBwYXRoIG9mIHRoaXMgVVJJLCBpZiBoaWVyYXJjaGljYWw7Ci0gICAqIG90aGVyd2lzZSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotICAgKgotICAgKiA8cD5Ob3RlIHRoYXQgaWYgYWxsIHNlZ21lbnRzIGFyZSB0cmltbWVkIGZyb20gYW4gYWJzb2x1dGUgcGF0aCwgdGhlCi0gICAqIHJvb3QgYWJzb2x1dGUgcGF0aCByZW1haW5zLgotICAgKiAKLSAgICogQHBhcmFtIGkgdGhlIG51bWJlciBvZiBzZWdtZW50cyB0byBiZSB0cmltbWVkIGluIHRoZSByZXR1cm5lZCBVUkkuICBJZgotICAgKiBsZXNzIHRoYW4gMSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkOyBpZiBlcXVhbCB0byBvciBncmVhdGVyCi0gICAqIHRoYW4gdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGlzIFVSSSdzIHBhdGgsIGFsbCBzZWdtZW50cyBhcmUKLSAgICogdHJpbW1lZC4gIAotICAgKi8KLSAgcHVibGljIFVSSSB0cmltU2VnbWVudHMoaW50IGkpCi0gIHsKLSAgICBpZiAoIWlzSGllcmFyY2hpY2FsKCkgfHwgaSA8IDEpIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nW10gbmV3U2VnbWVudHMgPSBOT19TRUdNRU5UUzsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoIC0gaTsKLSAgICBpZiAobGVuID4gMCkKLSAgICB7Ci0gICAgICBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbbGVuXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgaGllcmFyY2hpY2FsIFVSSSB0aGF0IGhhcyBhIHBhdGgKLSAgICogdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3I7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIDxwPkEgdHJhaWxpbmcgc2VwYXJhdG9yIGlzIHJlcHJlc2VudGVkIGFzIGFuIGVtcHR5IHNlZ21lbnQgYXMgdGhlCi0gICAqIGxhc3Qgc2VnbWVudCBpbiB0aGUgcGF0aDsgbm90ZSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPgotICAgKiBpbmNsdWRlIHRoZSBsb25lIHNlcGFyYXRvciBpbiB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdQYXRoU2VwYXJhdG9yKCkKLSAgewotICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPiAwICYmIAotICAgICAgU0VHTUVOVF9FTVBUWS5lcXVhbHMoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHdob3NlIHBhdGggaW5jbHVkZXMgYSBmaWxlIGV4dGVuc2lvbiwKLSAgICogdGhhdCBmaWxlIGV4dGVuc2lvbiBpcyByZXR1cm5lZDsgbnVsbCBvdGhlcndpc2UuICBXZSBkZWZpbmUgYSBmaWxlCi0gICAqIGV4dGVuc2lvbiBhcyBhbnkgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdCBwZXJpb2QgKCIuIikgaW4gdGhlIGZpbmFsCi0gICAqIHBhdGggc2VnbWVudC4gIElmIHRoZXJlIGlzIG5vIHBhdGgsIHRoZSBwYXRoIGVuZHMgaW4gYSB0cmFpbGluZwotICAgKiBzZXBhcmF0b3IsIG9yIHRoZSBmaW5hbCBzZWdtZW50IGNvbnRhaW5zIG5vIHBlcmlvZCwgdGhlbiB3ZSBjb25zaWRlcgotICAgKiB0aGVyZSB0byBiZSBubyBmaWxlIGV4dGVuc2lvbi4gIElmIHRoZSBmaW5hbCBzZWdtZW50IGVuZHMgaW4gYSBwZXJpb2QsCi0gICAqIHRoZW4gdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIGFuIGVtcHR5IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmlsZUV4dGVuc2lvbigpCi0gIHsKLSAgICBpbnQgbGVuID0gc2VnbWVudHMubGVuZ3RoOwotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBzZWdtZW50c1tsZW4gLSAxXTsKLSAgICBpbnQgaSA9IGxhc3RTZWdtZW50Lmxhc3RJbmRleE9mKEZJTEVfRVhURU5TSU9OX1NFUEFSQVRPUik7Ci0gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IGxhc3RTZWdtZW50LnN1YnN0cmluZyhpICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgYSBwZXJpb2QgKCIuIikgZm9sbG93ZWQgYnkgdGhlCi0gICAqIHNwZWNpZmllZCBmaWxlIGV4dGVuc2lvbiB0byB0aGUgbGFzdCBwYXRoIHNlZ21lbnQgb2YgdGhpcyBVUkksIGlmIGl0IGlzCi0gICAqIGhpZXJhcmNoaWNhbCB3aXRoIGEgbm9uLWVtcHR5IHBhdGggZW5kaW5nIGluIGEgbm9uLWVtcHR5IHNlZ21lbnQ7Ci0gICAqIG90aGVyd2lzZSwgdGhpcyBVUkkgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCi0gICAqIDxwPlRoZSBleHRlbnNpb24gaXMgYXBwZW5kZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzZWdtZW50IGFscmVhZHkKLSAgICogY29udGFpbnMgYW4gZXh0ZW5zaW9uLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKLSAgICogPGNvZGU+ZmlsZUV4dGVuc2lvbjwvY29kZT4gaXMgbm90IGEgdmFsaWQgc2VnbWVudCAocG9ydGlvbikgYWNjb3JkaW5nCi0gICAqIHRvIHtAbGluayAjdmFsaWRTZWdtZW50fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kRmlsZUV4dGVuc2lvbihTdHJpbmcgZmlsZUV4dGVuc2lvbikKLSAgewotICAgIGlmICghdmFsaWRTZWdtZW50KGZpbGVFeHRlbnNpb24pKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJpbnZhbGlkIHNlZ21lbnQgcG9ydGlvbjogIiArIGZpbGVFeHRlbnNpb24pOwotICAgIH0KLQotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGlmIChTRUdNRU5UX0VNUFRZLmVxdWFscyhsYXN0U2VnbWVudCkpIHJldHVybiB0aGlzOwotICAgIFN0cmluZ0J1ZmZlciBuZXdMYXN0U2VnbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIobGFzdFNlZ21lbnQpOwotICAgIG5ld0xhc3RTZWdtZW50LmFwcGVuZChGSUxFX0VYVEVOU0lPTl9TRVBBUkFUT1IpOwotICAgIG5ld0xhc3RTZWdtZW50LmFwcGVuZChmaWxlRXh0ZW5zaW9uKTsKLQotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4gLSAxKTsKLSAgICBuZXdTZWdtZW50c1tsZW4gLSAxXSA9IG5ld0xhc3RTZWdtZW50LnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgLy8gbm90ZTogc2VnbWVudHMubGVuZ3RoID4gMCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgVVJJIGhhcyBhIG5vbi1udWxsIHtAbGluayAjZmlsZUV4dGVuc2lvbiBmaWxlRXh0ZW5zaW9ufSwKLSAgICogcmV0dXJucyB0aGUgVVJJIGZvcm1lZCBieSByZW1vdmluZyBpdDsgdGhpcyBVUkkgdW5jaGFuZ2VkLCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgVVJJIHRyaW1GaWxlRXh0ZW5zaW9uKCkKLSAgewotICAgIGludCBsZW4gPSBzZWdtZW50cy5sZW5ndGg7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gdGhpczsKLQotICAgIFN0cmluZyBsYXN0U2VnbWVudCA9IHNlZ21lbnRzW2xlbiAtIDFdOwotICAgIGludCBpID0gbGFzdFNlZ21lbnQubGFzdEluZGV4T2YoRklMRV9FWFRFTlNJT05fU0VQQVJBVE9SKTsKLSAgICBpZiAoaSA8IDApIHJldHVybiB0aGlzOwotCi0gICAgU3RyaW5nIG5ld0xhc3RTZWdtZW50ID0gbGFzdFNlZ21lbnQuc3Vic3RyaW5nKDAsIGkpOwotICAgIFN0cmluZ1tdIG5ld1NlZ21lbnRzID0gbmV3IFN0cmluZ1tsZW5dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLCAwLCBsZW4gLSAxKTsKLSAgICBuZXdTZWdtZW50c1tsZW4gLSAxXSA9IG5ld0xhc3RTZWdtZW50OwotCi0gICAgLy8gbm90ZTogc2VnbWVudHMubGVuZ3RoID4gMCAtPiBoaWVyYXJjaGljYWwKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBzY2hlbWUsIGF1dGhvcml0eSwgZGV2aWNlLCBhYnNvbHV0ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgbmV3U2VnbWVudHMsIHF1ZXJ5LCBmcmFnbWVudCk7IAotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgdGhhdCBlbmRzIGluIGEKLSAgICogc2xhc2g7IHRoYXQgaXMsIGl0IGhhcyBhIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yIG9yIGlzIHRoZSByb290Ci0gICAqIGFic29sdXRlIHBhdGgsIGFuZCBoYXMgbm8gcXVlcnkgYW5kIG5vIGZyYWdtZW50OyA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICogaXMgcmV0dXJuZWQgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIGhpZXJhcmNoaWNhbCAmJiBxdWVyeSA9PSBudWxsICYmIGZyYWdtZW50ID09IG51bGwgJiYKLSAgICAgIChoYXNUcmFpbGluZ1BhdGhTZXBhcmF0b3IoKSB8fCAoYWJzb2x1dGVQYXRoICYmIHNlZ21lbnRzLmxlbmd0aCA9PSAwKSk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGFuZCA8Y29kZT5vbGRQcmVmaXg8L2NvZGU+IGlzIGEKLSAgICogcHJlZml4IG9mIGl0LCB0aGlzIHJldHVybnMgdGhlIFVSSSBmb3JtZWQgYnkgcmVwbGFjaW5nIGl0IGJ5Ci0gICAqIDxjb2RlPm5ld1ByZWZpeDwvY29kZT47IDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+SW4gb3JkZXIgdG8gYmUgYSBwcmVmaXgsIHRoZSA8Y29kZT5vbGRQcmVmaXg8L2NvZGU+J3MKLSAgICoge0BsaW5rICNpc1ByZWZpeCBpc1ByZWZpeH0gbXVzdCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sIGFuZCBpdCBtdXN0Ci0gICAqIG1hdGNoIHRoaXMgVVJJJ3Mgc2NoZW1lLCBhdXRob3JpdHksIGFuZCBkZXZpY2UuICBBbHNvLCB0aGUgcGF0aHMgbXVzdAotICAgKiBtYXRjaCwgdXAgdG8gcHJlZml4J3MgZW5kLgotICAgKgotICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZWl0aGVyCi0gICAqIDxjb2RlPm9sZFByZWZpeDwvY29kZT4gb3IgPGNvZGU+bmV3UHJlZml4PC9jb2RlPiBpcyBub3QgYSBwcmVmaXggVVJJCi0gICAqIGFjY29yZGluZyB0byB7QGxpbmsgI2lzUHJlZml4fS4KLSAgICovCi0gIHB1YmxpYyBVUkkgcmVwbGFjZVByZWZpeChVUkkgb2xkUHJlZml4LCBVUkkgbmV3UHJlZml4KQotICB7Ci0gICAgaWYgKCFvbGRQcmVmaXguaXNQcmVmaXgoKSB8fCAhbmV3UHJlZml4LmlzUHJlZml4KCkpCi0gICAgewotICAgICAgU3RyaW5nIHdoaWNoID0gb2xkUHJlZml4LmlzUHJlZml4KCkgPyAibmV3IiA6ICJvbGQiOwotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXByZWZpeCAiICsgd2hpY2ggKyAiIHZhbHVlIik7Ci0gICAgfQotCi0gICAgLy8gR2V0IHdoYXQncyBsZWZ0IG9mIHRoZSBzZWdtZW50cyBhZnRlciB0cmltbWluZyB0aGUgcHJlZml4LgotICAgIFN0cmluZ1tdIHRhaWxTZWdtZW50cyA9IGdldFRhaWxTZWdtZW50cyhvbGRQcmVmaXgpOwotICAgIGlmICh0YWlsU2VnbWVudHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAvLyBJZiB0aGUgbmV3IHByZWZpeCBoYXMgc2VnbWVudHMsIGl0IGlzIG5vdCB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLAotICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGRyb3AgdGhlIHRyYWlsaW5nIGVtcHR5IHNlZ21lbnQgYW5kIGFwcGVuZCB0aGUgdGFpbAotICAgIC8vIHNlZ21lbnRzLgotICAgIFN0cmluZ1tdIG1lcmdlZFNlZ21lbnRzID0gdGFpbFNlZ21lbnRzOwotICAgIGlmIChuZXdQcmVmaXguc2VnbWVudENvdW50KCkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgc2VnbWVudHNUb0tlZXAgPSBuZXdQcmVmaXguc2VnbWVudENvdW50KCkgLSAxOwotICAgICAgbWVyZ2VkU2VnbWVudHMgPSBuZXcgU3RyaW5nW3NlZ21lbnRzVG9LZWVwICsgdGFpbFNlZ21lbnRzLmxlbmd0aF07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KG5ld1ByZWZpeC5zZWdtZW50cygpLCAwLCBtZXJnZWRTZWdtZW50cywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHNUb0tlZXApOwotCi0gICAgICBpZiAodGFpbFNlZ21lbnRzLmxlbmd0aCAhPSAwKQotICAgICAgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRhaWxTZWdtZW50cywgMCwgbWVyZ2VkU2VnbWVudHMsIHNlZ21lbnRzVG9LZWVwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxTZWdtZW50cy5sZW5ndGgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vIHZhbGlkYXRpb24gbmVlZGVkIHNpbmNlIGFsbCBjb21wb25lbnRzIGFyZSBmcm9tIGV4aXN0aW5nIFVSSXMKLSAgICByZXR1cm4gbmV3IFVSSSh0cnVlLCBuZXdQcmVmaXguc2NoZW1lKCksIG5ld1ByZWZpeC5hdXRob3JpdHkoKSwKLSAgICAgICAgICAgICAgICAgICBuZXdQcmVmaXguZGV2aWNlKCksIG5ld1ByZWZpeC5oYXNBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICBtZXJnZWRTZWdtZW50cywgcXVlcnksIGZyYWdtZW50KTsKLSAgfQotCi0gIC8vIElmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgVVJJIHJlZmVyZW5jZSBhbmQgcHJlZml4IGlzIGEgcHJlZml4IG9mIGl0LAotICAvLyByZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHJlbWFpbmluZyBhZnRlciB0aGF0IHByZWZpeCBoYXMgYmVlbgotICAvLyB0cmltbWVkOyBudWxsIG90aGVyd2lzZS4KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRUYWlsU2VnbWVudHMoVVJJIHByZWZpeCkKLSAgewotICAgIGlmICghcHJlZml4LmlzUHJlZml4KCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9uLXByZWZpeCB0cmltIik7Ci0gICAgfQotCi0gICAgLy8gRG9uJ3QgZXZlbiBjb25zaWRlciBpdCB1bmxlc3MgdGhpcyBpcyBoaWVyYXJjaGljYWwgYW5kIGhhcyBzY2hlbWUsCi0gICAgLy8gYXV0aG9yaXR5LCBkZXZpY2UgYW5kIHBhdGggYWJzb2x1dGVuZXNzIGVxdWFsIHRvIHRob3NlIG9mIHRoZSBwcmVmaXguCi0gICAgaWYgKCFoaWVyYXJjaGljYWwgfHwKLSAgICAgICAgIWVxdWFscyhzY2hlbWUsIHByZWZpeC5zY2hlbWUoKSwgdHJ1ZSkgfHwKLSAgICAgICAgIWVxdWFscyhhdXRob3JpdHksIHByZWZpeC5hdXRob3JpdHkoKSkgfHwKLSAgICAgICAgIWVxdWFscyhkZXZpY2UsIHByZWZpeC5kZXZpY2UoKSkgfHwKLSAgICAgICAgYWJzb2x1dGVQYXRoICE9IHByZWZpeC5oYXNBYnNvbHV0ZVBhdGgoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgcHJlZml4IGhhcyBubyBzZWdtZW50cywgdGhlbiBpdCBpcyB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCBhbmQKLSAgICAvLyB3ZSBrbm93IHRoaXMgaXMgYW4gYWJzb2x1dGUgcGF0aCwgdG9vLgotICAgIGlmIChwcmVmaXguc2VnbWVudENvdW50KCkgPT0gMCkgcmV0dXJuIHNlZ21lbnRzOwotCi0gICAgLy8gVGhpcyBtdXN0IGhhdmUgbm8gZmV3ZXIgc2VnbWVudHMgdGhhbiB0aGUgcHJlZml4LiAgU2luY2UgdGhlIHByZWZpeAotICAgIC8vIGlzIG5vdCB0aGUgcm9vdCBhYnNvbHV0ZSBwYXRoLCBpdHMgbGFzdCBzZWdtZW50IGlzIGVtcHR5OyBhbGwgb3RoZXJzCi0gICAgLy8gbXVzdCBtYXRjaC4KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IHNlZ21lbnRzVG9Db21wYXJlID0gcHJlZml4LnNlZ21lbnRDb3VudCgpIC0gMTsKLSAgICBpZiAoc2VnbWVudHMubGVuZ3RoIDw9IHNlZ21lbnRzVG9Db21wYXJlKSByZXR1cm4gbnVsbDsKLQotICAgIGZvciAoOyBpIDwgc2VnbWVudHNUb0NvbXBhcmU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXNlZ21lbnRzW2ldLmVxdWFscyhwcmVmaXguc2VnbWVudChpKSkpIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIFRoZSBwcmVmaXggcmVhbGx5IGlzIGEgcHJlZml4IG9mIHRoaXMuICBJZiB0aGlzIGhhcyBqdXN0IG9uZSBtb3JlLAotICAgIC8vIGVtcHR5IHNlZ21lbnQsIHRoZSBwYXRocyBhcmUgdGhlIHNhbWUuCi0gICAgaWYgKGkgPT0gc2VnbWVudHMubGVuZ3RoIC0gMSAmJiBTRUdNRU5UX0VNUFRZLmVxdWFscyhzZWdtZW50c1tpXSkpCi0gICAgewotICAgICAgcmV0dXJuIE5PX1NFR01FTlRTOwotICAgIH0KLSAgICAKLSAgICAvLyBPdGhlcndpc2UsIHRoZSBwYXRoIG5lZWRzIG9ubHkgdGhlIHJlbWFpbmluZyBzZWdtZW50cy4KLSAgICBTdHJpbmdbXSBuZXdTZWdtZW50cyA9IG5ldyBTdHJpbmdbc2VnbWVudHMubGVuZ3RoIC0gaV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzZWdtZW50cywgaSwgbmV3U2VnbWVudHMsIDAsIG5ld1NlZ21lbnRzLmxlbmd0aCk7Ci0gICAgcmV0dXJuIG5ld1NlZ21lbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIG9wYXF1ZSBwYXJ0IHZhbHVlLCBhcyBkZWZpbmVkCi0gICAqIGJ5IHRoZSBSRkMuICBBbGwgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sCi0gICAqIGFyZSBlc2NhcGVkLCBhcyBpcyA8Y29kZT4vPC9jb2RlPiBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlT3BhcXVlUGFydChTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoKCkgPiAwICYmIHJlc3VsdC5jaGFyQXQoMCkgPT0gU0VHTUVOVF9TRVBBUkFUT1IgPwotICAgICAgIiUyRiIgKyByZXN1bHQuc3Vic3RyaW5nKDEpIDoKLSAgICAgIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBhdXRob3JpdHksIGFzIGRlZmluZWQgYnkgdGhlCi0gICAqIFJGQy4gIEFsbCBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwKLSAgICogYXJlIGVzY2FwZWQsIGFzIGFyZSA8Y29kZT4vPC9jb2RlPiBhbmQgPGNvZGU+PzwvY29kZT4KLSAgICogCi0gICAqIEBwYXJhbSBpZ25vcmVFc2NhcGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGxlYXZlIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMKLSAgICogdW5lc2NhcGVkIGlmIHRoZXkgYWxyZWFkeSBiZWdpbiBhIHZhbGlkIHRocmVlLWNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBlbmNvZGUgYWxsIDxjb2RlPiU8L2NvZGU+IGNoYXJhY3RlcnMuICBOb3RlIHRoYXQKLSAgICogaWYgYSA8Y29kZT4lPC9jb2RlPiBpcyBub3QgZm9sbG93ZWQgYnkgMiBoZXggZGlnaXRzLCBpdCB3aWxsIGFsd2F5cyBiZQotICAgKiBlc2NhcGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUF1dGhvcml0eShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFNFR01FTlRfQ0hBUl9ISSwgU0VHTUVOVF9DSEFSX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBzZWdtZW50LCBhcyBkZWZpbmVkIGJ5IHRoZQotICAgKiBSRkMuICBBbGwgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sCi0gICAqIGFyZSBlc2NhcGVkLCBhcyBhcmUgPGNvZGU+LzwvY29kZT4gYW5kIDxjb2RlPj88L2NvZGU+Ci0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVTZWdtZW50KFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpZ25vcmVFc2NhcGVkKQotICB7Ci0gICAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgU0VHTUVOVF9DSEFSX0hJLCBTRUdNRU5UX0NIQVJfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgYSBzdHJpbmcgc28gYXMgdG8gcHJvZHVjZSBhIHZhbGlkIHF1ZXJ5LCBhcyBkZWZpbmVkIGJ5IHRoZSBSRkMuCi0gICAqIE9ubHkgZXhjbHVkZWQgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZSBhbmQgPGNvZGU+IzwvY29kZT4sIGFyZSBlc2NhcGVkLgotICAgKiAKLSAgICogQHBhcmFtIGlnbm9yZUVzY2FwZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbGVhdmUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycwotICAgKiB1bmVzY2FwZWQgaWYgdGhleSBhbHJlYWR5IGJlZ2luIGEgdmFsaWQgdGhyZWUtY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZTsKLSAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGVuY29kZSBhbGwgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVycy4gIE5vdGUgdGhhdAotICAgKiBpZiBhIDxjb2RlPiU8L2NvZGU+IGlzIG5vdCBmb2xsb3dlZCBieSAyIGhleCBkaWdpdHMsIGl0IHdpbGwgYWx3YXlzIGJlCi0gICAqIGVzY2FwZWQuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlUXVlcnkoU3RyaW5nIHZhbHVlLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RlKHZhbHVlLCBVUklDX0hJLCBVUklDX0xPLCBpZ25vcmVFc2NhcGVkKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIGEgc3RyaW5nIHNvIGFzIHRvIHByb2R1Y2UgYSB2YWxpZCBmcmFnbWVudCwgYXMgZGVmaW5lZCBieSB0aGUKLSAgICogUkZDLiAgT25seSBleGNsdWRlZCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlIGFuZCA8Y29kZT4jPC9jb2RlPiwgYXJlCi0gICAqIGVzY2FwZWQuCi0gICAqIAotICAgKiBAcGFyYW0gaWdub3JlRXNjYXBlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBsZWF2ZSA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzCi0gICAqIHVuZXNjYXBlZCBpZiB0aGV5IGFscmVhZHkgYmVnaW4gYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOwotICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gZW5jb2RlIGFsbCA8Y29kZT4lPC9jb2RlPiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0Ci0gICAqIGlmIGEgPGNvZGU+JTwvY29kZT4gaXMgbm90IGZvbGxvd2VkIGJ5IDIgaGV4IGRpZ2l0cywgaXQgd2lsbCBhbHdheXMgYmUKLSAgICogZXNjYXBlZC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVGcmFnbWVudChTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIHJldHVybiBlbmNvZGUodmFsdWUsIFVSSUNfSEksIFVSSUNfTE8sIGlnbm9yZUVzY2FwZWQpOwotICB9Ci0KLSAgLy8gRW5jb2RlcyBhIGNvbXBsZXRlIFVSSSwgb3B0aW9uYWxseSBsZWF2aW5nICUgY2hhcmFjdGVycyB1bmVzY2FwZWQgd2hlbgotICAvLyBiZWdpbm5pbmcgYSB2YWxpZCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLiAgV2UgYXNzdW1lIHRoYXQgdGhlCi0gIC8vIGxhc3QgIyBiZWdpbnMgdGhlIGZyYWdtZW50LgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gaWdub3JlRXNjYXBlZCkKLSAgewotICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaW50IGkgPSB1cmkuaW5kZXhPZihTQ0hFTUVfU0VQQVJBVE9SKTsKLSAgICBpZiAoaSAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoc2NoZW1lKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoU0NIRU1FX1NFUEFSQVRPUik7Ci0gICAgfQotICAgIAotICAgIGludCBqID0gdXJpLmxhc3RJbmRleE9mKEZSQUdNRU5UX1NFUEFSQVRPUik7Ci0gICAgaWYgKGogIT0gLTEpCi0gICAgewotICAgICAgU3RyaW5nIHNzcGFydCA9IHVyaS5zdWJzdHJpbmcoKytpLCBqKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKHNzcGFydCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgICAgcmVzdWx0LmFwcGVuZChGUkFHTUVOVF9TRVBBUkFUT1IpOwotCi0gICAgICBTdHJpbmcgZnJhZ21lbnQgPSB1cmkuc3Vic3RyaW5nKCsraik7Ci0gICAgICByZXN1bHQuYXBwZW5kKGVuY29kZShmcmFnbWVudCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHNzcGFydCA9IHVyaS5zdWJzdHJpbmcoKytpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RlKHNzcGFydCwgVVJJQ19ISSwgVVJJQ19MTywgaWdub3JlRXNjYXBlZCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBFbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcsIHJlcGxhY2luZyBlYWNoIEFTQ0lJIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBpbgotICAvLyB0aGUgc2V0IHNwZWNpZmllZCBieSB0aGUgMTI4LWJpdCBiaXRtYXNrIGFuZCBlYWNoIG5vbi1BU0NJSSBjaGFyYWN0ZXIKLSAgLy8gYmVsb3cgMHhBMCBieSBhbiBlc2NhcGUgc2VxdWVuY2Ugb2YgJSBmb2xsb3dlZCBieSB0d28gaGV4IGRpZ2l0cy4gIElmCi0gIC8vICUgaXMgbm90IGluIHRoZSBzZXQgYnV0IGlnbm9yZUVzY2FwZWQgaXMgdHJ1ZSwgdGhlbiAlIHdpbGwgbm90IGJlIGVuY29kZWQKLSAgLy8gaWZmIGl0IGFscmVhZHkgYmVnaW5zIGEgdmFsaWQgZXNjYXBlIHNlcXVlbmNlLgotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSwgbG9uZyBoaWdoQml0bWFzaywgbG9uZyBsb3dCaXRtYXNrLCBib29sZWFuIGlnbm9yZUVzY2FwZWQpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKCFtYXRjaGVzKGMsIGhpZ2hCaXRtYXNrLCBsb3dCaXRtYXNrKSAmJiBjIDwgMTYwICYmCi0gICAgICAgICAgKCFpZ25vcmVFc2NhcGVkIHx8ICFpc0VzY2FwZWQodmFsdWUsIGkpKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIGFwcGVuZEVzY2FwZWQocmVzdWx0LCAoYnl0ZSljKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyB2YWx1ZSA6IHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gVGVzdHMgd2hldGhlciBhbiBlc2NhcGUgb2NjdXJzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHN0YXJ0aW5nIGF0IGluZGV4IGkuCi0gIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZSBpcyBhICUgZm9sbG93ZWQgYnkgdHdvIGhleCBkaWdpdHMuCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFc2NhcGVkKFN0cmluZyBzLCBpbnQgaSkKLSAgewotICAgIHJldHVybiBzLmNoYXJBdChpKSA9PSBFU0NBUEUgJiYgcy5sZW5ndGgoKSA+IGkgKyAyICYmCi0gICAgICBtYXRjaGVzKHMuY2hhckF0KGkgKyAxKSwgSEVYX0hJLCBIRVhfTE8pICYmCi0gICAgICBtYXRjaGVzKHMuY2hhckF0KGkgKyAyKSwgSEVYX0hJLCBIRVhfTE8pOwotICB9Ci0KLSAgLy8gQ29tcHV0ZXMgYSB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlIGZvciB0aGUgYnl0ZSwgYXBwZW5kaW5nCi0gIC8vIGl0IHRvIHRoZSBTdHJpbmdCdWZmZXIuICBPbmx5IGNoYXJhY3RlcnMgdXAgdG8gMHhGRiBzaG91bGQgYmUgZXNjYXBlZDsKLSAgLy8gYWxsIGJ1dCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSB3aWxsIGJlIGlnbm9yZWQuCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZChTdHJpbmdCdWZmZXIgcmVzdWx0LCBieXRlIGIpCi0gIHsKLSAgICByZXN1bHQuYXBwZW5kKEVTQ0FQRSk7Ci0KLSAgICAvLyBUaGUgYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IHdpZGVuZWQgaW50byBhbiBpbnQsIHdpdGggc2lnbiBleHRlbnNpb24sCi0gICAgLy8gZm9yIHNoaWZ0aW5nLiAgVGhpcyBjYW4gaW50cm9kdWNlIDEncyB0byB0aGUgbGVmdCBvZiB0aGUgYnl0ZSwgd2hpY2gKLSAgICAvLyBtdXN0IGJlIGNsZWFyZWQgYnkgbWFza2luZyBiZWZvcmUgbG9va2luZyB1cCB0aGUgaGV4IGRpZ2l0LgotICAgIC8vCi0gICAgcmVzdWx0LmFwcGVuZChIRVhfRElHSVRTWyhiID4+IDQpICYgMHgwRl0pOwotICAgIHJlc3VsdC5hcHBlbmQoSEVYX0RJR0lUU1tiICYgMHgwRl0pOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZXMgdGhlIGdpdmVuIHN0cmluZywgcmVwbGFjaW5nIGVhY2ggdGhyZWUtZGlnaXQgZXNjYXBlIHNlcXVlbmNlIGJ5Ci0gICAqIHRoZSBjaGFyYWN0ZXIgdGhhdCBpdCByZXByZXNlbnRzLiAgSW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2VzIGFyZQotICAgKiBpZ25vcmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKGlzRXNjYXBlZCh2YWx1ZSwgaSkpIAotICAgICAgewotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLnN1YnN0cmluZygwLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1bmVzY2FwZSh2YWx1ZS5jaGFyQXQoaSArIDEpLCB2YWx1ZS5jaGFyQXQoaSArIDIpKSk7Ci0gICAgICAgIGkgKz0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlLmNoYXJBdChpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZW5jb2RlZCBieSAlIGZvbGxvd2VkIGJ5IHRoZSB0d28gZ2l2ZW4gaGV4IGRpZ2l0cywKLSAgLy8gd2hpY2ggaXMgYWx3YXlzIDB4RkYgb3IgbGVzcywgc28gY2FuIHNhZmVseSBiZSBjYXN0ZWQgdG8gYSBieXRlLiAgSWYKLSAgLy8gZWl0aGVyIGNoYXJhY3RlciBpcyBub3QgYSBoZXggZGlnaXQsIGEgYm9ndXMgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQuCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgdW5lc2NhcGUoY2hhciBoaWdoSGV4RGlnaXQsIGNoYXIgbG93SGV4RGlnaXQpCi0gIHsKLSAgICByZXR1cm4gKGNoYXIpKCh2YWx1ZU9mKGhpZ2hIZXhEaWdpdCkgPDwgNCkgfCB2YWx1ZU9mKGxvd0hleERpZ2l0KSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGhleCBkaWdpdC4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbHVlT2YoY2hhciBoZXhEaWdpdCkKLSAgewotICAgIGlmIChoZXhEaWdpdCA+PSAnQScgJiYgaGV4RGlnaXQgPD0gJ0YnKQotICAgIHsKLSAgICAgIHJldHVybiBoZXhEaWdpdCAtICdBJyArIDEwOwotICAgIH0KLSAgICBpZiAoaGV4RGlnaXQgPj0gJ2EnICYmIGhleERpZ2l0IDw9ICdmJykKLSAgICB7Ci0gICAgICByZXR1cm4gaGV4RGlnaXQgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgaWYgKGhleERpZ2l0ID49ICcwJyAmJiBoZXhEaWdpdCA8PSAnOScpCi0gICAgewotICAgICAgcmV0dXJuIGhleERpZ2l0IC0gJzAnOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgdGFrZXMgdHdvIFVSSXMsIHRoZSBmaXJzdCBvbmUgcmVsYXRpdmUsIHRoZSBzZWNvbmQgYWJzb2x1dGUuIEl0Ci0gICAqIHRyaWVzIHRvIHJlc29sdmUgdGhlIGZpcnN0IFVSSSAobWFraW5nIGl0IGFic29sdXRlKSBieSB1c2luZyB0aGUgc2Vjb25kIG9uZS4KLSAgICogSWYgdGhlIFVSSSBjYW5ub3QgYmUgcmVzb2x2ZWQsIHRoZSByZWxhdGl2ZSBvbmUgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSByZWxhdGl2ZVVSSQotICAgKiBAcGFyYW0gYWJzb2x1dGVVUkkKLSAgICogQHJldHVybiByZWxhdGl2ZVVSSSByZXNvbHZlZCAoYWJzb2x1dGUpIG9yIHJlbGF0aXZlVVJJIHVubW9kaWZpZWQgaWYgaXQgY2Fubm90Ci0gICAqIGJlIHJlc29sdmVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVJlbGF0aXZlVVJJKFN0cmluZyByZWxhdGl2ZVVSSSwgU3RyaW5nIGFic29sdXRlVVJJKSB7Ci0KLQkgIFN0cmluZyByZXN1bHQgPSByZWxhdGl2ZVVSSTsKLQotCSAgdHJ5IHsKLSAgICAgIAlVUkkgcmVsYXRpdmUgPSBVUkkuY3JlYXRlVVJJKHJlbGF0aXZlVVJJKTsKLSAgICAgICAJVVJJIGFic29sdXRlID0gVVJJLmNyZWF0ZVVSSShhYnNvbHV0ZVVSSSk7Ci0gICAgICAgCVVSSSByZXNvbHZlZFJlbGF0aXZlID0gcmVsYXRpdmUucmVzb2x2ZShhYnNvbHV0ZSk7Ci0gICAgICAgCXJlc3VsdCA9IHJlc29sdmVkUmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgCi0gIC8qCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBVUkkgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnM7Ci0gICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqCi0gICAqIFRoaXMgdW51c2VkIGNvZGUgaXMgaW5jbHVkZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UuLi4gCi0gICAqLwotLyoKLSAgcHVibGljIGJvb2xlYW4gaXNJUkkoKQotICB7Ci0gICAgcmV0dXJuIGlyaTsgCi0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBjb250YWlucyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnM7Ci0gIC8vIGZhbHNlIG90aGVyd2lzZS4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc05vbkFTQ0lJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaSkgPiAxMjcpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSovCi0KLSAgLyoKLSAgICogSWYgdGhpcyBpcyBhbiB7QGxpbmsgI2lzSVJJIElSSX0sIGNvbnZlcnRzIGl0IHRvIGEgc3RyaWN0IEFTQ0lJIFVSSSwKLSAgICogdXNpbmcgdGhlIHByb2NlZHVyZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjEgb2YgdGhlCi0gICAqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0ludGVybmF0aW9uYWwvaXJpLWVkaXQvZHJhZnQtZHVlcnN0LWlyaS0wOS50eHQiPklSSQotICAgKiBEcmFmdCBSRkM8L2E+LiAgT3RoZXJ3aXNlLCB0aGlzIFVSSSwgaXRzZWxmLCBpcyByZXR1cm5lZC4KLSAgICoKLSAgICogVGhpcyB1bnVzZWQgY29kZSBpcyBpbmNsdWRlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZS4uLgotICAgKi8KLS8qCi0gIHB1YmxpYyBVUkkgdG9BU0NJSVVSSSgpCi0gIHsKLSAgICBpZiAoIWlyaSkgcmV0dXJuIHRoaXM7Ci0KLSAgICBpZiAoY2FjaGVkQVNDSUlVUkkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZUF1dGhvcml0eSA9IGVuY29kZUFzQVNDSUkoYXV0aG9yaXR5KTsKLSAgICAgIFN0cmluZyBlRGV2aWNlID0gZW5jb2RlQXNBU0NJSShkZXZpY2UpOwotICAgICAgU3RyaW5nIGVRdWVyeSA9IGVuY29kZUFzQVNDSUkocXVlcnkpOwotICAgICAgU3RyaW5nIGVGcmFnbWVudCA9IGVuY29kZUFzQVNDSUkoZnJhZ21lbnQpOwotICAgICAgU3RyaW5nW10gZVNlZ21lbnRzID0gbmV3IFN0cmluZ1tzZWdtZW50cy5sZW5ndGhdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgZVNlZ21lbnRzW2ldID0gZW5jb2RlQXNBU0NJSShzZWdtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgICBjYWNoZWRBU0NJSVVSSSA9IG5ldyBVUkkoaGllcmFyY2hpY2FsLCBzY2hlbWUsIGVBdXRob3JpdHksIGVEZXZpY2UsIGFic29sdXRlUGF0aCwgZVNlZ21lbnRzLCBlUXVlcnksIGVGcmFnbWVudCk7IAotCi0gICAgfQotICAgIHJldHVybiBjYWNoZWRBU0NJSVVSSTsKLSAgfQotCi0gIC8vIFJldHVybnMgYSBzdHJpY3QgQVNDSUkgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHZhbHVlLiAgRWFjaCBub24tQVNDSUkKLSAgLy8gY2hhcmFjdGVyIGlzIGNvbnZlcnRlZCB0byBieXRlcyB1c2luZyBVVEYtOCBlbmNvZGluZywgd2hpY2ggYXJlIHRoZW4KLSAgLy8gcmVwcmVzbnRlZCB1c2luZyAlIGVzY2FwaW5nLgotICBwcml2YXRlIFN0cmluZyBlbmNvZGVBc0FTQ0lJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBudWxsOwotCi0gICAgZm9yIChpbnQgaSA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aCgpOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCi0gICAgICBpZiAoYyA+PSAxMjgpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSAobmV3IFN0cmluZyhuZXcgY2hhcltdIHsgYyB9KSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDAsIGVuY0xlbiA9IGVuY29kZWQubGVuZ3RoOyBqIDwgZW5jTGVuOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgYXBwZW5kRXNjYXBlZChyZXN1bHQsIGVuY29kZWRbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IHZhbHVlIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQsIGNvbnNlY3V0aXZlLCB0aHJlZS1jaGFyYWN0ZXIgZXNjYXBlCi0gIC8vIHNlcXVlbmNlcyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLCBzdGFydGluZyBhdCBpbmRleCBpLgotICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRFc2NhcGVkKFN0cmluZyBzLCBpbnQgaSkKLSAgewotICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgZm9yIChpbnQgbGVuID0gcy5sZW5ndGgoKTsgaSA8IGxlbjsgaSArPSAzKQotICAgIHsKLSAgICAgIGlmIChpc0VzY2FwZWQocywgaSkpIHJlc3VsdCsrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdmYTM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQSBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dAotICogYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4gVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBhbGxvd3MgZm9yIHRoZQotICogZXh0ZW5zaW9uIHJlc29sdmVyIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgY2FsbGVkIGF0IHRoZSBjb3JyZWN0IHRpbWVzLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJFeHRlbnNpb25EZXNjcmlwdG9yCi17Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uIHJlc29sdmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlVHlwZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCi0JcHVibGljIExpc3QgcHJvamVjdE5hdHVyZUlkczsKLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VUeXBlOwotCi0JcHJvdGVjdGVkIGludCBzdGFnZSA9IFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkuU1RBR0VfUE9TVE5PUk1BTElaQVRJT047Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW9yaXR5ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5QUklPUklUWV9NRURJVU07Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklkOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3I7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyIGNsYXNzIG5hbWUuCi0JICogQHBhcmFtIHBsdWdpbklkIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgY2xhc3MuCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZHMgVGhlIHByb2plY3QgbmF0dXJlIElEcyBmb3Igd2hpY2ggdGhlIHJlc29sdmVyIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHJlc291cmNlVHlwZSBUaGUgdHlwZSBvZiByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIHJlc29sdmVyIHNob3VsZCBydW4uCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSBvZiB0aGUgcmVzb2x2ZXIuIEVpdGhlciBwcmVub3JtYWxpemF0aW9uIG9yIHBvc3Rub3JtYWxpemF0aW9uLgotCSAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcmVzb2x2ZXIncyBwcmlvcml0eS4gaGlnaCwgbWVkaXVtLCBvciBsb3cuCi0JICovCi0JcHVibGljIFVSSVJlc29sdmVyRXh0ZW5zaW9uRGVzY3JpcHRvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGx1Z2luSWQsCi0JCQlMaXN0IHByb2plY3ROYXR1cmVJZHMsIFN0cmluZyByZXNvdXJjZVR5cGUsIGludCBzdGFnZSwgU3RyaW5nIHByaW9yaXR5KQotCXsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5wcm9qZWN0TmF0dXJlSWRzID0gcHJvamVjdE5hdHVyZUlkczsKLQkJdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7Ci0JCXRoaXMuc3RhZ2UgPSBzdGFnZTsKLQkJdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotCSAqLwotCXB1YmxpYyBVUklSZXNvbHZlckV4dGVuc2lvbiBnZXRSZXNvbHZlcigpCi0JewotCi0JCWlmIChyZXNvbHZlciA9PSBudWxsICYmIGNsYXNzTmFtZSAhPSBudWxsICYmICFlcnJvcikKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy8gQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8KLQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlDbGFzcyB0aGVDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQlyZXNvbHZlciA9IChVUklSZXNvbHZlckV4dGVuc2lvbikgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWVycm9yID0gdHJ1ZTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSByZXNvbHZlciBzaG91bGQgcnVuIGluIHRoZSBjdXJyZW50IHNjZW5hcmlvIGdpdmVuCi0JICogdGhlIHByb2plY3QgbmF0dXJlIElELCByZXNvdXJjZSB0eXBlLCBhbmQgc3RhZ2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYXR1cmVJZCBUaGUgcHJvamVjdCBuYXR1cmUgSUQgdG8gY2hlY2sgYWdhaW5zdC4KLQkgKiBAcGFyYW0gcmVzb3VyY2VUeXBlIFRoZSByZXNvdXJjZSB0eXBlIHRvIGNoZWNrIGFnYWluc3QuCi0JICogQHBhcmFtIHN0YWdlIFRoZSBzdGFnZSB0byBjaGVjayBhZ2FpbnN0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb2x2ZXIgc2hvdWxkIHJ1biwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHByb2plY3ROYXR1cmVJZCwgU3RyaW5nIHJlc291cmNlVHlwZSwgaW50IHN0YWdlKQotCXsKLQkJaWYgKHByb2plY3ROYXR1cmVJZHMuY29udGFpbnMocHJvamVjdE5hdHVyZUlkKSkKLQkJewotCQkJcmV0dXJuIG1hdGNoZXModGhpcy5yZXNvdXJjZVR5cGUsIHJlc291cmNlVHlwZSkgJiYgdGhpcy5zdGFnZSA9PSBzdGFnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBzdHJpbmcgYSBtYXRjaGVzIHN0cmluZyBiLgotCSAqIFRPRE86IFdoeSBpcyB0aGlzIHJlcXVpcmVkIGluc3RlYWQgb2YganVzdCB1c2luZyBTdHJpbmcuZXF1YWxzPwotCSAqIAotCSAqIEBwYXJhbSBhIFN0cmluZyBmb3IgY29tcGFyaXNvbi4KLQkgKiBAcGFyYW0gYiBTdHJpbmcgZm9yIGNvbXBhcmlzb24uCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmdzIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGEsIFN0cmluZyBiKQotCXsKLQkJcmV0dXJuIChhICE9IG51bGwpID8gYS5lcXVhbHMoYikgOiBhID09IGI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9VUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzNmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL1VSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgVVJJIHJlc29sdmVyIGV4dGVuc2lvbiBwb2ludCBhbmQgcmVnaXN0ZXJzIGV4dGVuc2lvbgotICogcmVzb2x2ZXJzIHdpdGggdGhlIFVSSSByZXNvbHZlciByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJyZXNvbHZlckV4dGVuc2lvbnMiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicmVzb2x2ZXJFeHRlbnNpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFJPSkVDVF9OQVRVUkVfSUQgPSAicHJvamVjdE5hdHVyZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VfVFlQRSA9ICJyZXNvdXJjZVR5cGUiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TVEFHRSA9ICJzdGFnZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxfU1RBR0VfUFJFID0gInByZW5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BPU1QgPSAicG9zdG5vcm1hbGl6YXRpb24iOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX1NUQUdFX1BIWVNJQ0FMID0gInBoeXNpY2FsIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5KQotCXsKLQkJdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChVUklSZXNvbHZlclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkKLQkJewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCQl7Ci0JCQkJcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0JICogCi0JICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbnRlbnRtb2RlbC51dGlsX2ltcGxlbWVudGF0aW9uIj4KLQkgKiA8dXRpbF9pbXBsZW1lbnRhdGlvbiBjbGFzcyA9Ci0JICogb3JnLmVjbGlwc2Uud3N0LmJhc2V1dGlsLkNNVXRpbEltcGxlbWVudGF0aW9uSW1wbCAvPiA8L2V4dGVuc2lvbj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotCQl7Ci0JCQkvLyBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQkvLyBTdHJpbmcgcHJvamVjdE5hdHVyZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BST0pFQ1RfTkFUVVJFX0lEKTsKLQkJCVN0cmluZyByZXNvdXJjZVR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0VfVFlQRSk7Ci0JCQlTdHJpbmcgc3RhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1RBR0UpOwotCQkJU3RyaW5nIHByaW9yaXR5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKTsKLQkJCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5LmVxdWFscygiIikpCi0JCQl7Ci0JCQkJcHJpb3JpdHkgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlBSSU9SSVRZX01FRElVTTsKLQkJCX0KLQkJCUxpc3QgcHJvamVjdE5hdHVyZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGlkcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRUxFTV9QUk9KRUNUX05BVFVSRV9JRCk7Ci0JCQlpbnQgbnVtaWRzID0gaWRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtaWRzOyBpKyspCi0JCQl7Ci0JCQkJU3RyaW5nIHRlbXBpZCA9IGlkc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLQotCQkJCWlmICh0ZW1waWQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXByb2plY3ROYXR1cmVJZHMuYWRkKHRlbXBpZCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0KLQkJCQkJaW50IHN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QT1NUTk9STUFMSVpBVElPTjsKLQkJCQkJaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BSRSkpCi0JCQkJCXsKLQkJCQkJCXN0YWdlaW50ID0gVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeS5TVEFHRV9QUkVOT1JNQUxJWkFUSU9OOwotCQkJCQl9IGVsc2UgaWYgKHN0YWdlLmVxdWFsc0lnbm9yZUNhc2UoVkFMX1NUQUdFX1BIWVNJQ0FMKSkKLQkJCQkJewotCQkJCQkJc3RhZ2VpbnQgPSBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5LlNUQUdFX1BIWVNJQ0FMOwotCQkJCQl9Ci0JCQkJCXJlZ2lzdHJ5LnB1dChjbGFzc05hbWUsIHBsdWdpbklkLCBwcm9qZWN0TmF0dXJlSWRzLCByZXNvdXJjZVR5cGUsCi0JCQkJCQkJc3RhZ2VpbnQsIHByaW9yaXR5KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCS8vIFRPRE86IExvZyBleGNlcHRpb24gYXMgdGhpcyB3aWxsIGNhdXNlIGFuIGV4dGVuc2lvbiByZXNvbHZlcgotCQkJCQkvLyAgICAgICBmcm9tIGxvYWRpbmcuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYTRjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBBIFVSSVJlc29sdmVyIGlzIHVzZWQgdG8gcmVzb2x2ZSBVUkkgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHVyaSAKLQkgKiBAcGFyYW0gcHVibGljSWQgLSBhbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZQotCSAqIEBwYXJhbSBzeXN0ZW1JZCAtIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIFVSSSwgb3IgbnVsbCBpZiBub25lIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgVVJJIHJlcHJlc2VudGlvbiB0aGUgJ2xvZ2ljYWwnIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJhc2VMb2NhdGlvbiAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpIAotICAgICAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0gICAgICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0gICAgICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50aW9uIHRoZSAncGh5c2ljYWwnIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgbG9naWNhbExvY2F0aW9uKTsgICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ2MWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC9wcm92aXNpb25hbC9VUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLS8qKgotICogQW4gZXh0ZW5zaW9uIHRvIGF1Z21lbnQgdGhlIGJlaGF2aW91ciBvZiBhIFVSSVJlc29sdmVyLiAgRXh0ZW5zaW9ucyBhcmUgcHJvamVjdCBhd2FyZQotICogc28gdGhhdCB0aGV5IGNhbiBhcHBseSBzcGVjaWFsaXplZCBwcm9qZWN0IHNwZWNpZmljIHJlc29sdmluZyBydWxlcy4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXJFeHRlbnNpb24gewotCS8qKgotCSAqIEBwYXJhbSBmaWxlIHRoZSBpbi13b3Jrc3BhY2UgYmFzZSByZXNvdXJjZSwgaWYgb25lIGV4aXN0cwotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHVyaQotCSAqIEBwYXJhbSBwdWJsaWNJZCAtIGFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lCi0JICogQHBhcmFtIHN5c3RlbUlkIC0gYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUgCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBVUkkgb3IgbnVsbCBpZiB0aGlzIGV4dGVuc2lvbiBjYW4gbm90IHJlc29sdmUgdGhpcyByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VSSVJlc29sdmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2MzY4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVVJJUmVzb2x2ZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuRXh0ZW5zaWJsZVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb25SZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByb3RlY3RlZCBzdGF0aWMgVVJJUmVzb2x2ZXJQbHVnaW4gaW5zdGFuY2U7CQotCXByb3RlY3RlZCBVUklSZXNvbHZlckV4dGVuc2lvblJlZ2lzdHJ5IHhtbFJlc29sdmVyRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyUGx1Z2luIGdldEluc3RhbmNlKCkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIFVSSVJlc29sdmVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQkKLQkKLQkJCQkJCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBjcmVhdGVSZXNvbHZlcigpCi0JewotCQlyZXR1cm4gY3JlYXRlUmVzb2x2ZXIobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgY3JlYXRlUmVzb2x2ZXIoTWFwIHByb3BlcnRpZXMpCi0JewotCQkvLyBUT0RPLi4uIHV0aWxpemUgcHJvcGVydGllcwotCQlyZXR1cm4gbmV3IEV4dGVuc2libGVVUklSZXNvbHZlcigpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdXJpcmVzb2x2ZXIvaW50ZXJuYWwvdXRpbC9VUklFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzdjOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotCi0vKioKLSAqICBUaGlzIGNsYXNzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBqYXZhLmxhbmcuVVJMRW5jb2Rlci4KLSAqLwotcHVibGljIGNsYXNzIFVSSUVuY29kZXIgCi17Ci0gIHN0YXRpYyBCaXRTZXQgZG9udE5lZWRFbmNvZGluZzsKLSAgc3RhdGljIGZpbmFsIGludCBjYXNlRGlmZiA9ICgnYScgLSAnQScpOwotICBzdGF0aWMgU3RyaW5nIGRmbHRFbmNOYW1lID0gbnVsbDsKLSAgCi0KLSAgc3RhdGljIAotICB7ICAgICAgICAgICAgCi0JICBkb250TmVlZEVuY29kaW5nID0gbmV3IEJpdFNldCgyNTYpOwotCSAgaW50IGk7Ci0JICBmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0JICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0JICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyBpKyspIAotICAgIHsKLQkgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0JICB9Ci0KLQkgIC8vZG9udE5lZWRFbmNvZGluZy5zZXQoJyAnKTsgLy8gY3MuLiByZW1vdmVkIHNvIHRoYXQgc3BhY2UgY2hhcmFjdGVyIHdpbGwgYmUgcmVwbGFjZWQgYnkgJTIwCi0JICBkb250TmVlZEVuY29kaW5nLnNldCgnLScpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJ18nKTsKLQkgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcuJyk7Ci0JICBkb250TmVlZEVuY29kaW5nLnNldCgnKicpOwotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJzonKTsgICAvLyBjcy4uIGFkZGVkIAotCSAgZG9udE5lZWRFbmNvZGluZy5zZXQoJy8nKTsgICAvLyBjcy4uIGFkZGVkIHNvIHRoYXQgc2xhc2hlcyBkb24ndCBnZXQgZW5jb2RlZCBhcyAlMkYKLQotICAJLy8gZGZsdEVuY05hbWUgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiZmlsZS5lbmNvZGluZyIpKTsKLSAgCS8vIEFzIGRpc2N1c3NlZCB3aXRoIFNhbmR5LCB3ZSBzaG91bGQgZW5jb2RlIFVSSXMgd2l0aCBVVEY4Ci0gICBkZmx0RW5jTmFtZSA9ICJVVEY4IjsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZGZsdEVuY05hbWUgIiArIGRmbHRFbmNOYW1lKTsKLSAgIH0KLQotICAvKioKLSAgICogWW91IGNhbid0IGNhbGwgdGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBVUklFbmNvZGVyKCkgeyB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbGF0ZXMgYSBzdHJpbmcgaW50byA8Y29kZT54LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+Ci0gICAqIGZvcm1hdC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGVuY29kaW5nCi0gICAqIGFzIHRoZSBlbmNvZGluZyBzY2hlbWUgdG8gb2J0YWluIHRoZSBieXRlcyBmb3IgdW5zYWZlIGNoYXJhY3RlcnMuCi0gICAqCi0gICAqIEBwYXJhbSAgIHMgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHRyYW5zbGF0ZWQuCi0gICAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgc3RyaW5nIG1heSB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0ncwotICAgKiAgICAgICAgICAgICBkZWZhdWx0IGVuY29kaW5nLiBJbnN0ZWFkLCB1c2UgdGhlIGVuY29kZShTdHJpbmcsU3RyaW5nKQotICAgKiAgICAgICAgICAgICBtZXRob2QgdG8gc3BlY2lmeSB0aGUgZW5jb2RpbmcuCi0gICAqIEByZXR1cm4gIHRoZSB0cmFuc2xhdGVkIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIAotICB7Ci0JICBTdHJpbmcgc3RyID0gbnVsbDsKLQkgIHRyeSAKLSAgICB7Ci0JICAgIHN0ciA9IGVuY29kZShzLCBkZmx0RW5jTmFtZSk7Ci0JICB9IAotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIAotICAgIHsKLQkgICAgLy8gVGhlIHN5c3RlbSBzaG91bGQgYWx3YXlzIGhhdmUgdGhlIHBsYXRmb3JtIGRlZmF1bHQKLQkgIH0KLQkgIHJldHVybiBzdHI7Ci0gIH0KLQotICAvKioKLSAgICogVHJhbnNsYXRlcyBhIHN0cmluZyBpbnRvIDxjb2RlPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4KLSAgICogZm9ybWF0IHVzaW5nIGEgc3BlY2lmaWMgZW5jb2Rpbmcgc2NoZW1lLiBUaGlzIG1ldGhvZCB1c2VzIHRoZQotICAgKiBzdXBwbGllZCBlbmNvZGluZyBzY2hlbWUgdG8gb2J0YWluIHRoZSBieXRlcyBmb3IgdW5zYWZlCi0gICAqIGNoYXJhY3RlcnMuCi0gICAqIDxwPgotICAgKiA8ZW0+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgPGEgaHJlZj0KLSAgICogImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MC9hcHBlbmRpeC9ub3Rlcy5odG1sI25vbi1hc2NpaS1jaGFycyI+Ci0gICAqIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gUmVjb21tZW5kYXRpb248L2E+IHN0YXRlcyB0aGF0Ci0gICAqIFVURi04IHNob3VsZCBiZSB1c2VkLiBOb3QgZG9pbmcgc28gbWF5IGludHJvZHVjZQotICAgKiBpbmNvbXBhdGliaWxpdGVzLjwvZW0+Ci0gICAqCi0gICAqIEBwYXJhbSAgIHMgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHRyYW5zbGF0ZWQuCi0gICAqIEBwYXJhbSAgIGVuYyAgIFRoZSBuYW1lIG9mIGEgc3VwcG9ydGVkIAotICAgKiAgICA8YSBocmVmPSIuLi9sYW5nL3BhY2thZ2Utc3VtbWFyeS5odG1sI2NoYXJlbmMiPmNoYXJhY3RlcgotICAgKiAgICBlbmNvZGluZzwvYT4uCi0gICAqIEByZXR1cm4gIHRoZSB0cmFuc2xhdGVkIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAqIEBleGNlcHRpb24gIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgdGhlIG5hbWVkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICogQHNlZSBqYXZhLm5ldC5VUkxEZWNvZGVyI2RlY29kZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiAKLSAgewotCSAgYm9vbGVhbiBuZWVkVG9DaGFuZ2UgPSBmYWxzZTsKLQkgIGJvb2xlYW4gd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7IAotCSAgaW50IG1heEJ5dGVzUGVyQ2hhciA9IDEwOyAvLyByYXRoZXIgYXJiaXRyYXJ5IGxpbWl0LCBidXQgc2FmZSBmb3Igbm93Ci0gICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShtYXhCeXRlc1BlckNoYXIpOwotCSAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCBlbmMpKTsKLQotCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIAotICAgIHsKLQkgICAgaW50IGMgPSBzLmNoYXJBdChpKTsKLQkgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4YW1pbmluZyBjaGFyYWN0ZXI6ICIgKyBjKTsKLQkgICAgaWYgKGRvbnROZWVkRW5jb2RpbmcuZ2V0KGMpKQotICAgICAgewotCQkgICAvL2lmIChjID09ICcgJykKLSAgICAgICAvL3sKLQkJICAgLy8gIGMgPSAnKyc7Ci0JCSAgIC8vICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotCQkgICAvL30KLQkJICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN0b3Jpbmc6ICIgKyBjKTsKLQkJICAgb3V0LmFwcGVuZCgoY2hhciljKTsKLQkJICAgd3JvdGVVbmVuY29kZWRDaGFyID0gdHJ1ZTsKLQkgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KLQkJICAgIHRyeQotICAgICAgICB7Ci0JCSAgICAgIGlmICh3cm90ZVVuZW5jb2RlZENoYXIpIAotICAgICAgICAgIHsgLy8gRml4IGZvciA0NDA3NjEwCi0JCSAgICAJICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotCQkJICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICAgICAgd3JpdGVyLndyaXRlKGMpOwotCQkgICAgICAgIAotCQkgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhIFVuaWNvZGUKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXIsIHRoZW4gcGFzcyBpbiB0d28gY2hhcmFjdGVycy4gSXQncyBub3QKLQkJICAgICAgLy8gY2xlYXIgd2hhdCBzaG91bGQgYmUgZG9uZSBpZiBhIGJ5dGVzIHJlc2VydmVkIGluIHRoZSAKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXJzIHJhbmdlIG9jY3VycyBvdXRzaWRlIG9mIGEgbGVnYWwKLQkJICAgICAgLy8gc3Vycm9nYXRlIHBhaXIuIEZvciBub3csIGp1c3QgdHJlYXQgaXQgYXMgaWYgaXQgd2VyZSAKLQkJICAgICAgLy8gYW55IG90aGVyIGNoYXJhY3Rlci4KLQkJICAgICAgLy8gCi0JCSAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikgCi0gICAgICAgICAgewotCQkJICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpICsgIiBpcyBoaWdoIHN1cnJvZ2F0ZSIpOwkJCSAgICAgIAotCQkJICAgICAgaWYgKCAoaSsxKSA8IHMubGVuZ3RoKCkpIAotICAgICAgICAgICAgewotCQkJICAgICAgICBpbnQgZCA9IHMuY2hhckF0KGkrMSk7Ci0JCQkgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHRFeGFtaW5pbmcgIiArIEludGVnZXIudG9IZXhTdHJpbmcoZCkpOwkJCSAgICAgIAotCQkJICAgICAgICBpZiAoZCA+PSAweERDMDAgJiYgZCA8PSAweERGRkYpIAotICAgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIEludGVnZXIudG9IZXhTdHJpbmcoZCkgKyAiIGlzIGxvdyBzdXJyb2dhdGUiKTsJCQkJCi0JCQkJICAgICAgICB3cml0ZXIud3JpdGUoZCk7Ci0JCQkJICAgICAgICBpKys7Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgIH0KLQkJICAgICAgfQotCQkgICAgICB3cml0ZXIuZmx1c2goKTsKLQkJICAgIH0gCi0gICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpIAotICAgICAgICB7Ci0JCSAgICAgIGJ1Zi5yZXNldCgpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICAgIGJ5dGVbXSBiYSA9IGJ1Zi50b0J5dGVBcnJheSgpOwotCi0JCSAgICBmb3IgKGludCBqID0gMDsgaiA8IGJhLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotCQkgICAgICBvdXQuYXBwZW5kKCclJyk7Ci0JCSAgICAgIGNoYXIgY2ggPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGJhW2pdID4+IDQpICYgMHhGLCAxNik7Ci0JCSAgICAgIC8vIGNvbnZlcnRpbmcgdG8gdXNlIHVwcGVyY2FzZSBsZXR0ZXIgYXMgcGFydCBvZgotCQkgICAgICAvLyB0aGUgaGV4IHZhbHVlIGlmIGNoIGlzIGEgbGV0dGVyLgotCQkgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSkgCi0gICAgICAgICAgewotCQkJICAgICAgY2ggLT0gY2FzZURpZmY7Ci0JCSAgICAgIH0KLQkJICAgICAgb3V0LmFwcGVuZChjaCk7Ci0JCSAgICAgIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGJhW2pdICYgMHhGLCAxNik7Ci0JCSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBjaCAtPSBjYXNlRGlmZjsKLQkJICAgICAgfQotCQkgICAgICBvdXQuYXBwZW5kKGNoKTsKLQkJICAgIH0KLQkJICAgIGJ1Zi5yZXNldCgpOwotCQkgICAgbmVlZFRvQ2hhbmdlID0gdHJ1ZTsKLQkgICAgfQotCSAgfQotCSAgcmV0dXJuIChuZWVkVG9DaGFuZ2U/IG91dC50b1N0cmluZygpIDogcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91cmlyZXNvbHZlci9pbnRlcm5hbC91dGlsL1VSSUhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTQwYjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3VyaXJlc29sdmVyL2ludGVybmFsL3V0aWwvVVJJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBVUklIZWxwZXIKLXsgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgPSAicGxhdGZvcm06L3Jlc291cmNlLyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1BBVFRFUk4gPSAiOiI7IAotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuc3VyZVVSSVByb3RvY29sRm9ybWF0KFN0cmluZyB1cmkpIHsKLQkgIFN0cmluZyBwcm90b2NvbCA9IGdldFByb3RvY29sKHVyaSk7Ci0JICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgewotCQkgIGlmIChwcm90b2NvbC5lcXVhbHMoRklMRV9QUk9UT0NPTCkpIHsKLQkJCSAgcmV0dXJuIGVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdCh1cmkpOwotCQkgIH0KLQkgIH0KLQkgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBhIGZpbGUgVVJJIGluIFN0cmluZyBmb3JtYXQgYW5kIGVuc3VyZXMgdGhlIHByb3RvY29sIGlzIGZvbGxvd2VkIGJ5IHRocmVlIHNsYXNoZXMuCi0gICAqIEZvciBleGFtcGxlLCBmaWxlcyAiZmlsZTpEOi9YWFgiLCAiZmlsZTovRDovWFhYIiBhbmQgImZpbGU6Ly9EOi9YWFgiIGFyZSBjb3JyZWN0ZWQgdG86Ci0gICAqICJmaWxlOi8vL0Q6L1hYWCIuCi0gICAqIElmIHRoZSBpbnB1dCBpcyBub3QgYSBmaWxlIFVSSSAoZG9lcyBub3Qgc3RhcnQgd2l0aCAiZmlsZToiKSwgdGhlIFN0cmluZyBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5zdXJlRmlsZVVSSVByb3RvY29sRm9ybWF0KFN0cmluZyB1cmkpIHsKLSAgICAgIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCArICIvLy8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MICsgIi8vIikpIHsKLSAgICAgIAkJdXJpID0gRklMRV9QUk9UT0NPTCArICIvIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wgKyAiLyIpKSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLy8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCX0gZWxzZSB7Ci0gICAgICAJCXVyaSA9IEZJTEVfUFJPVE9DT0wgKyAiLy8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmkpOwotICAgICAgU3RyaW5nIGZpbGUgPSB1cmk7Ci0gICAgICAgICAgIAotICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgCi0gICAgICAgICAgLy8gCi0gICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsgCi0gICAgICAgICAgLy8gd2UgdXNlIGEgJ1BhdGgnIG9uIHRoZSAnZmlsZScgcGFydCBvZiB0aGUgdXJsIGluIG9yZGVyIHRvIG5vcm1hbGl6ZSB0aGUgJy4nIGFuZCAnLi4nIHNlZ21lbnRzCi0gICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVybC5nZXRGaWxlKCkpOyAKLSAgICAgICAgICBVUkwgdXJsMiA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgdXJpID0gdXJsMi50b1N0cmluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgIAotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgCi0gICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlKTsKLSAgICAgICAgdXJpID0gcGF0aC50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotICAvKioKLSAgICogYSAnbnVsbCcgcm9vdExvY2F0aW9uIGFyZ3VtZW50IHdpbGwgY2F1c2VzIHVyaSB0aGF0IGJlZ2lucyB3aXRoIGEgJy8nIHRvIGJlIHRyZWF0ZWQgYXMgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcmVzb3VyY2UKLSAgICogKGkuZS4gdGhlIHN0cmluZyAicGxhdGZvcm06L3Jlc291cmNlIiBpcyBwcmVwZW5kZWQgYW5kIHRoZSB1cmkgaXMgcmVzb2x2ZWQgdmlhIHRoZSBQbGF0Zm9ybSBvYmplY3QpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyByb290TG9jYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gaXMgdGhlIHVyaSBhIHVybAotICAgICAgaWYgKGhhc1Byb3RvY29sKHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpc1BsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcmVzb2x2ZVBsYXRmb3JtVXJsKHVyaSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdXJpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAKLSAgICAgIC8vIGlzIHVyaSBhYnNvbHV0ZQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI6IikgIT0gLTEgfHwgdXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB1cmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgCi0gICAgICAvLyBpZiB1cmkgaXMgcmVsYXRpdmUgdG8gdGhlIHJlc291cmNlTG9jYXRpb24KLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgcmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24uZW5kc1dpdGgoIi8iKSkKLSAgICAgICAgewotCQkJICAgIHJlc3VsdCA9IHJlc291cmNlTG9jYXRpb24gKyB1cmk7Ci0gICAgICAgIH0KLQkJICAgIGVsc2UKLSAgICAgICAgewotCQkJICAgIHJlc3VsdCA9IHJlc291cmNlTG9jYXRpb24gKyAiLy4uLyIgKyB1cmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB1cmk7Ci0gICAgICB9Ci0gIAotICAgICAgcmVzdWx0ID0gbm9ybWFsaXplKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5vcm1hbGl6ZSgiICsgdXJpICsgIiwgIiArIHJlc291cmNlTG9jYXRpb24gKyAiLCAiICsgcm9vdExvY2F0aW9uICsgIikgPSAiICsgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVUkwoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkuaW5kZXhPZigiOi8iKSA+IDI7IC8vIHRlc3QgdGhhdCB0aGUgaW5kZXggaXMgPiAyIHNvIHRoYXQgQzovIGlzIG5vdCBjb25zaWRlcmVkIGEgcHJvdG9jb2wKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFzdFNlZ21lbnQoU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7Ci0gICAgaW50IGluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGRvdEluZGV4ID0gZ2V0RXh0ZW5zaW9uRG90SW5kZXgodXJpKTsKLSAgICAgICAgICAgICAgIAotICAgIGlmIChkb3RJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRmlsZUV4dGVuc2lvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGRvdEluZGV4ID0gZ2V0RXh0ZW5zaW9uRG90SW5kZXgodXJpKTsKLQotICAgIGlmIChkb3RJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0gICAgICAgICAgICAgCi0KLSAgLy8gaGVyZSB3ZSB1c2UgdGhlIFBsYXRmb3JtIHRvIHJlc29sdmUgYSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCB0byBhbiBhY3R1YWwgdXJsCi0gIC8vCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlc29sdmVQbGF0Zm9ybVVybChTdHJpbmcgdXJsc3BlYykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHVybHNwZWMgPSB1cmxzcGVjLnJlcGxhY2UoJ1xcJywgJy8nKTsgCi0gICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxzcGVjKTsKLSAgICAgIFVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLSAgICAgIHJlc3VsdCA9IHJlc29sdmVkVVJMLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldEV4dGVuc2lvbkRvdEluZGV4KFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IGRvdEluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgaW50IHNsYXNoSW5kZXggPSBNYXRoLm1heCh1cmkubGFzdEluZGV4T2YoIi8iKSwgdXJpLmxhc3RJbmRleE9mKCJcXCIpKTsKLQotICAgIGlmIChkb3RJbmRleCAhPSAtMSAmJiBkb3RJbmRleCA+IHNsYXNoSW5kZXgpCi0gICAgewotICAgICAgcmVzdWx0ID0gZG90SW5kZXg7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaSAhPSBudWxsICYmIHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpKQotICAgIHsKLSAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wubGVuZ3RoKCkpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfSAgICAgICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChTdHJpbmcgdXJpKQotICB7ICAKLSAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCArIHVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiB1cmk7Ci0gIH0gCi0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXBlbmRGaWxlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSkKLSAgICB7Ci0gICAgICB1cmkgPSBGSUxFX1BST1RPQ09MICsgdXJpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfSAKLSAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnNvbHV0ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihQUk9UT0NPTF9QQVRURVJOKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSB8fCB1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbXBsaWVkRmlsZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsgIAotICAgIGlmICghaGFzUHJvdG9jb2wodXJpKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcHJlZml4ID0gRklMRV9QUk9UT0NPTDsKLSAgICAgIHByZWZpeCArPSB1cmkuc3RhcnRzV2l0aCgiLyIpID8gIi8vIiA6ICIvLy8iOwotICAgICAgdXJpID0gcHJlZml4ICsgdXJpOwotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0gICAgICAgICAgICAgCi0gIC8vIHRvZG8uLi4gbmVlZCB0byByZXZpc2l0IHRoaXMgYmVmb3JlIHdlIHB1YmxpY2l6ZSBpdAotICAvLyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgeyAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4ICsgUFJPVE9DT0xfUEFUVEVSTi5sZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAgICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoUFJPVE9DT0xfUEFUVEVSTik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgUFJPVE9DT0xfUEFUVEVSTi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1Byb3RvY29sRmlsZU9yTnVsbChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHByb3RvY29sID0gZ2V0UHJvdG9jb2wodXJpKTsgICAKLSAgICByZXR1cm4gcHJvdG9jb2wgPT0gbnVsbCB8fCBwcm90b2NvbC5lcXVhbHMoRklMRV9QUk9UT0NPTCk7Ci0gIH0gIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nUHJvdG9jb2woU3RyaW5nIHVyaTEsIFN0cmluZyB1cmkyKQotICB7IAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7ICAKLQotICAgIFN0cmluZyBwcm90b2NvbDEgPSBnZXRQcm90b2NvbCh1cmkxKTsKLSAgICBTdHJpbmcgcHJvdG9jb2wyID0gZ2V0UHJvdG9jb2wodXJpMik7Ci0KLSAgICBpZiAoaXNQcm90b2NvbEZpbGVPck51bGwocHJvdG9jb2wxKSAmJiBpc1Byb3RvY29sRmlsZU9yTnVsbChwcm90b2NvbDIpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByb3RvY29sMSAhPSBudWxsICYmIHByb3RvY29sMiAhPSBudWxsICYmIHByb3RvY29sMS5lcXVhbHMocHJvdG9jb2wyKTsKLSAgICB9ICAgICAgICAgICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiB3YXJuaW5nLi4uIHRoaXMgbWV0aG9kIG5vdCBmdWxseSB0ZXN0ZWQgeWV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IHVyaTsgIAotICAgIGlmIChpc01hdGNoaW5nUHJvdG9jb2wodXJpLCByZXNvdXJjZUxvY2F0aW9uKSkgCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0UmVsYXRpdmVVUkkobmV3IFBhdGgocmVtb3ZlUHJvdG9jb2wodXJpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGF0aChyZW1vdmVQcm90b2NvbChyZXNvdXJjZUxvY2F0aW9uKSkpOwotICAgIH0gICAgICAgICAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogd2FybmluZy4uLiB0aGlzIG1ldGhvZCBub3QgZnVsbHkgdGVzdGVkIHlldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVVUkkoSVBhdGggdXJpLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKQotICB7ICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IG5NYXRjaGluZ1NlZ21lbnRzID0gMDsgICAgICAgCi0gICAgcmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgIHdoaWxlICh0cnVlKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgYSA9IHVyaS5zZWdtZW50KG5NYXRjaGluZ1NlZ21lbnRzKTsgCi0gICAgICBTdHJpbmcgYiA9IHJlc291cmNlTG9jYXRpb24uc2VnbWVudChuTWF0Y2hpbmdTZWdtZW50cyk7IAotICAgICAgaWYgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpCi0gICAgICB7Ci0gICAgICAgIG5NYXRjaGluZ1NlZ21lbnRzKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgIAotCi0gICAgaWYgKG5NYXRjaGluZ1NlZ21lbnRzID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnRvT1NTdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSAiIjsgICAKLSAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7Ci0gICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHJlc291cmNlTG9jYXRpb24uc2VnbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSBuTWF0Y2hpbmdTZWdtZW50czsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCArPSBpc0ZpcnN0ID8gIi4uIiA6ICIvLi4iOyAgICAgCi0gICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICB7Ci0gICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIC8vIAotICAgICAgc2VnbWVudHMgPSB1cmkuc2VnbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSBuTWF0Y2hpbmdTZWdtZW50czsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ICs9IGlzRmlyc3QgPyBzZWdtZW50c1tpXSA6ICgiLyIgKyBzZWdtZW50c1tpXSk7ICAgICAKLSAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtVVJJKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgZnVsbFBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgaWYgKGZ1bGxQYXRoLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICB7Ci0gICAgICBmdWxsUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgcmV0dXJuIFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MICsgZnVsbFBhdGg7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kcyBpcyB1c2VkIGFzIGEgcXVpY2sgdGVzdCB0byBzZWUgaWYgYSB1cmkgY2FuIGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIHJlc291cmNlLiAgIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGFibGVVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiB0ZXN0UmVtb3RlVVJJKQotICB7ICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1cmkgPSBub3JtYWxpemUodXJpLCBudWxsLCBudWxsKTsKLSAgICAgICAgaWYgKGlzUHJvdG9jb2xGaWxlT3JOdWxsKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmkgPSByZW1vdmVQcm90b2NvbCh1cmkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSS5kZWNvZGUodXJpKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBOb3RlIC0gSWYgd2UgYXJlIGhlcmUsIHVyaSBoYXMgYmVlbiBmYWlsZWQgdG8gcmVzb2x2ZQotICAgICAgICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBQbGF0Zm9ybS4gU2VlIG5vcm1hbGl6ZSgpIHRvIGZpbmQgd2h5LgotICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlc3RSZW1vdGVVUkkpCi0gICAgICAgIHsKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgIC8vIHRoZSB1cmkgaXMgcmVhZGFibGUgaWYgd2UgcmVhY2ggaGVyZS4KLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8vIHVyaSBpcyBudWxsCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgdXJpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIHRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgewotICAgICAgbmV3IFVSSSh1cmkpOwotICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiByZXR1cm5zIGFuIGFjY2VwdGFibGUgVVJJIGZvciBhIGZpbGUgcGF0aAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJJRm9yRmlsZVBhdGgoU3RyaW5nIGZpbGVQYXRoKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGFkZEltcGxpZWRGaWxlUHJvdG9jb2woZmlsZVBhdGgpOwotICAgIGlmICghaXNWYWxpZFVSSShyZXN1bHQpKQotICAgIHsKLSAgICAJdHJ5Ci0gICAgCXsKLSAgICAgICAgcmVzdWx0ID0gVVJJRW5jb2Rlci5lbmNvZGUocmVzdWx0LCAiVVRGOCIpOwotICAgIAl9Ci0gICAgCWNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkJLy8gRG8gbm90aGluZyBhcyBsb25nIGFzIFVURjggaXMgdXNlZC4gVGhpcyBpcyBzdXBwb3J0ZWQuCi0gICAgCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxNTMwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWNhY2hlLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxODhmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDFhMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1dlZCBNYXIgMTUgMTc6Mjc6MzMgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAyNGIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTWFyIDE1IDE3OjI3OjMzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjA4NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlX1BMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVfUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDRmNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBleHNkLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvZXhzZC9jYWNoZXJlc291cmNlLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjYjI3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9leHNkL2NhY2hlcmVzb3VyY2UuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIG5hbWU9IkNhY2hlIFJlc291cmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBjYWNoZSByZXNvdXJjZSBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gc3BlY2lmeSByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIHRoYXQgcmVxdWlyZSBsaWNlbnNlcyB0byBiZSBhY2NlcHRlZCBwcmlvciB0byBjYWNoaW5nLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYWNoZXJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYWNoZXJlc291cmNlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpY2Vuc2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGxpY2Vuc2Ugb2YgdGhlIHJlc291cmNlIHRvIGNhY2hlLiBUaGUgbGljZW5zZSBpcyBzcGVjaWZpZWQgYXMgYSBVUkwgdGhhdCByZXNvbHZlcyB0byBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbGljZW5zZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNhY2hlIHJlc291cmNlIGNvbnRyaWJ1dGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuY2FjaGVyZXNvdXJjZSZxdW90OyZndDsKLSAgICAgICZsdDtjYWNoZXJlc291cmNlCi0gICAgICAgICAgICBsaWNlbnNlPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZS5odG1sJnF1b3Q7Ci0gICAgICAgICAgICB1cmw9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZyZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmNzJiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX1BMVUdJTl9QUk9WSURFUiAgICAgICAgICAgICAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoZSBVUkkgUmVzb2x2ZXIgUGx1Zy1pbgotCi1jYWNoZVJlc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhY2hlIFJlc291cmNlCi1fVUlfQ0FDSEVfUFJFRkVSRU5DRV9QQUdFX1RJVExFICAgICAgICA9IENhY2hlCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWMwNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlY2FjaGVSZXNvdXJjZSIgaWQ9ImNhY2hlcmVzb3VyY2UiIHNjaGVtYT0iZXhzZC9jYWNoZXJlc291cmNlLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJV9VSV9DQUNIRV9QUkVGRVJFTkNFX1BBR0VfVElUTEUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLkNhY2hlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeSA9ICJvcmcuZWNsaXBzZS5pbnRlcm5ldCI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICAgICA8L2luaXRpYWxpemVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIucmVzb2x2ZXJFeHRlbnNpb25zIj4KLSAgICAgIDxyZXNvbHZlckV4dGVuc2lvbgotICAgICAgICAgICAgc3RhZ2U9InBoeXNpY2FsIgotICAgICAgICAgICAgcHJpb3JpdHk9ImxvdyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbiI+Ci0gICAgICA8L3Jlc29sdmVyRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5ZjQyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBjYWNoZSBob2xkcyByZWZlcmVuY2VzIHRvIHJlbW90ZSByZXNvdXJjZXMuIFRoZSBjYWNoZSBjYW4gc3RvcmUgcmVzb3VyY2VzLAotICogcmV0cmlldmUgcmVzb3VyY2VzLCBhbmQgZGVsZXRlIHJlc291cmNlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZSAKLXsKLSAgLyoqCi0gICAqIFN0cmluZyBpbnN0YW5jZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gInVyaSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ImxvY2F0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVFJZID0gImVudHJ5IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFID0gImNhY2hlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAibGFzdE1vZGlmaWVkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSQVRJT05fVElNRSA9ICJleHBpcmF0aW9uVGltZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6Ly8vIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0ZJTEUgPSAiY2FjaGUueG1sIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYVEVOU0lPTiA9ICIuY2FjaGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfUFJFRklYID0gInd0cGNhY2hlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NVRkZJWCA9IG51bGw7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IGZvciBhIGNhY2hlIGVudHJ5IGlzIDEgZGF5LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gODY0MDAwMDA7Ci0JCi0gIC8qKgotICAgKiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIENhY2hlIGNhY2hlSW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFRoZSBjYWNoZSBpcyBzdG9yZWQgaW4gYSBoYXNodGFibGUuCi0gICAqLwotICBwcml2YXRlIEhhc2h0YWJsZSBjYWNoZTsKLSAgCi0gIC8qKgotICAgKiBBIHNldCBvZiB1bmNhY2hlZCByZXNvdXJjZXMuIFRoZSBjYWNoZSB3YXMgbm90IGFibGUgdG8gY2FjaGUgcmVzb3VyY2VzCi0gICAqIGluIHRoaXMgbGlzdC4gVGhpcyBsaXN0IGFsbG93cyBxdWlja2x5IHNraXBwaW5nIG92ZXIgdGhlc2UgcmVzb3VyY2VzIGluCi0gICAqIGZ1dHVyZSByZXF1ZXN0cy4gCi0gICAqLwotICBwcml2YXRlIFNldCB1bmNhY2hlZDsKLSAgCi0gIC8qKgotICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhY2hlCi0gICAqLwotICBwcml2YXRlIEZpbGUgY2FjaGVMb2NhdGlvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBDYWNoZShJUGF0aCBjYWNoZUxvY2F0aW9uKQotICB7Ci0JICB0aGlzLmNhY2hlTG9jYXRpb24gPSBjYWNoZUxvY2F0aW9uLnRvRmlsZSgpOy8vUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkpLnRvRmlsZSgpOwotICAgIGNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHVuY2FjaGVkID0gbmV3IEhhc2hTZXQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBjYWNoZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgY2FjaGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENhY2hlIGdldEluc3RhbmNlKCkKLSAgewotLy8JICBpZihjYWNoZUluc3RhbmNlID09IG51bGwpCi0vLwkgIHsKLS8vCQkgIGNhY2hlSW5zdGFuY2UgPSBuZXcgQ2FjaGUoY2FjaGVMb2NhdGlvbik7Ci0vLwkJICBjYWNoZUluc3RhbmNlLm9wZW4oY2FjaGVMb2NhdGlvbik7Ci0vLwkgIH0KLQkgIHJldHVybiBjYWNoZUluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsb2NhbCByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCB1cmkuIElmIHRoZXJlIGlzIG5vIHJlc291cmNlCi0gICAqIHRoZSBjYWNoZSB3aWxsIGF0dGVtcHQgdG8gZG93bmxvYWQgYW5kIGNhY2hlIHRoZSByZXNvdXJjZSBiZWZvcmUgcmV0dXJuaW5nLgotICAgKiBJZiBhIHJlbW90ZSByZXNvdXJjZSBjYW5ub3QgYmUgY2FjaGVkIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgZm9yIHdoaWNoIGEgcmVzb3VyY2UgaXMgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIFRoZSBsb2NhbCByZXNvdXJjZSBmb3IgdGhlIHNwZWNpZmllZCBVUkkgb3IgbnVsbCBpZiBhIHJlbW90ZSByZXNvdXJjZSBjYW5ub3QgYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZShTdHJpbmcgdXJpKQotICB7Ci0JICBpZih1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JICBDYWNoZUVudHJ5IHJlc3VsdCA9IChDYWNoZUVudHJ5KWNhY2hlLmdldCh1cmkpOwotCSAgCi0JICAvLyBJZiBubyByZXN1bHQgaXMgaW4gdGhlIGNhY2hlIGFuZCB0aGUgVVJJIGlzIG9mIGFuIGFsbG93ZWQgdHlwZQotCSAgLy8gcmV0cmlldmUgaXQgYW5kIHN0b3JlIGl0IGluIHRoZSBjYWNoZS4KLQkgIGlmKHJlc3VsdCA9PSBudWxsKQotCSAgewotICAgICAgCi0gICAgICAgIGlmKCF1bmNhY2hlZC5jb250YWlucyh1cmkpKQotCSAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2FjaGVSZXNvdXJjZSh1cmkpOyAKLSAgICAgICAgfQotCSAgfQotCSAgLy8gUmV0cmVpdmUgYSBmcmVzaCBjb3B5IG9mIHRoZSByZXN1bHQgaWYgaXQgaGFzIHRpbWVkIG91dC4KLQkgIGVsc2UgaWYocmVzdWx0Lmhhc0V4cGlyZWQoKSkKLQkgIHsKLQkJcmVzdWx0ID0gcmVmcmVzaENhY2hlRW50cnkocmVzdWx0KTsKLQkgIH0KLQkgIGlmKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRMb2NhbEZpbGUoKSA9PSBudWxsKQotCSAgewotCQlyZXR1cm4gbnVsbDsKLQkgIH0KLQkgIHJldHVybiBGSUxFX1BST1RPQ09MICsgY2FjaGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgcmVzdWx0LmdldExvY2FsRmlsZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdW5jYWNoZWQgcmVzb3VyY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFVuY2FjaGVkVVJJcygpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXVuY2FjaGVkLnRvQXJyYXkobmV3IFN0cmluZ1t1bmNhY2hlZC5zaXplKCldKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENsZWFyIHRoZSBsaXN0IG9mIHVuY2FjaGVkIHJlc291cmNlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyVW5jYWNoZWRVUklzKCkKLSAgewotICAgIHVuY2FjaGVkLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gdW5jYWNoZWQgcmVzb3VyY2UgdG8gdGhlIGxpc3QgYW5kIHN0YXJ0IHRoZSAKLSAgICogdW5jYWNoZWQgam9iIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRVbmNhY2hlZFVSSShTdHJpbmcgdXJpKQotICB7Ci0JQ2FjaGVKb2Iuc3RhcnRKb2IoKTsKLSAgICB1bmNhY2hlZC5hZGQodXJpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhY2hlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZQotICAgKiByZW1vdGUgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byB0aGUgY2FjaGUuIElmIHRoZSByZXNvdXJjZQotICAgKiBjYW5ub3QgYmUgYWNjZXNzZWQgaXQgaXMgbm90IGFkZGVkIGFuZCBudWxsIGlzIHJldHVybmVkLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgcmVtb3RlIFVSSSB0byBjYWNoZS4KLSAgICogQHJldHVybiBBIG5ldyBDYWNoZUVudHJ5IHJlcHJlc2VudGluZyB0aGUgY2FjaGVkIHJlc291cmNlIG9yIG51bGwgaWYgdGhlIHJlbW90ZQotICAgKiAgICAgICAgIHJlc291cmNlIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeSBjYWNoZVJlc291cmNlKFN0cmluZyB1cmkpCi0gIHsKLQkgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG51bGw7Ci0JICBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOwotCSAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCSAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkgIHRyeQotCSAgewotCQkgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCSAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkgIGNvbm4uY29ubmVjdCgpOwotCQkgIC8vIERldGVybWluZSBpZiB0aGlzIHJlc291cmNlIGNhbiBiZSBjYWNoZWQuCi0JCSAgaWYoY29ubi5nZXRVc2VDYWNoZXMoKSkKLQkJICB7Ci0JCSAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsvL3VybC5vcGVuU3RyZWFtKCk7Ci0JCSAgCi0JCSAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHJhbmQubmV4dEludCgpICsgQ0FDSEVfRVhURU5TSU9OOwotCQkgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoY2FjaGVMb2NhdGlvbiwgZmlsZU5hbWUpOwotCQkgICAgLy8gSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZS4KLQkJICAgIHdoaWxlKCFmaWxlLmNyZWF0ZU5ld0ZpbGUoKSkKLQkJICAgIHsKLQkJCSAgZmlsZU5hbWUgPSByYW5kLm5leHRJbnQoKSArIENBQ0hFX0VYVEVOU0lPTjsKLQkJCSAgZmlsZSA9IG5ldyBGaWxlKGNhY2hlTG9jYXRpb24sZmlsZU5hbWUpOwotCQkgICAgfQotCQkgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMjRdOwotCQkgICAgaW50IGJ5dGVsZW5ndGg7Ci0JCSAgICB3aGlsZSgoYnl0ZWxlbmd0aCA9IGlzLnJlYWQoYnl0ZXMpKSAhPSAtMSkKLQkJICAgIHsKLQkJCSAgb3Mud3JpdGUoYnl0ZXMsIDAsIGJ5dGVsZW5ndGgpOwotCQkgICAgfQotCQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOwotCQkgICAgbG9uZyBleHBpcmF0aW9uID0gY29ubi5nZXRFeHBpcmF0aW9uKCk7Ci0JCQlpZihleHBpcmF0aW9uID09IDApCi0JCQl7Ci0JCQkgIGV4cGlyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVQ7Ci0JCQl9Ci0JCSAgICBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkodXJpLCBmaWxlTmFtZSwgbGFzdE1vZGlmaWVkLCBleHBpcmF0aW9uKTsKLQkJICAgIGNhY2hlLnB1dCh1cmksY2FjaGVFbnRyeSk7Ci0JCSAgfQotCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gdCkKLQkgIHsKLQkJICAvLyBQdXQgdGhlIGVudHJ5IGluIHRoZSB1bmNhY2hlZCBsaXN0IHNvIHRoZSByZXNvbHV0aW9uIHdvcmsgd2lsbCBub3QgYmUgcGVyZm9ybWVkIGFnYWluLgotICAgICAgLy8gVE9ETzogQWRkIGluIGEgdGltZW91dCBmb3IgdGhlIG5vbi1sb2NhdGVkIHVyaXMuCi0gICAgICBhZGRVbmNhY2hlZFVSSSh1cmkpOwotCSAgfQotCSAgZmluYWxseQotCSAgewotCQkgIGlmKGlzICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIGlzLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLgotCQkJICB9Ci0JCSAgfQotCQkgIGlmKG9zICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIG9zLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJCS8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLiAKLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIHJldHVybiBjYWNoZUVudHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogUmVmcmVzaCB0aGUgY2FjaGUgZW50cnkgaWYgbmVjZXNzYXJ5LiBUaGUgY2FjaGUgZW50cnkgd2lsbCBiZSByZWZyZXNoZWQKLSAgICogaWYgdGhlIHJlbW90ZSByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlIGFuZCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIG9mIHRoZQotICAgKiByZW1vdGUgcmVzb3VyY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgdGhlIGNhY2hlZAotICAgKiByZXNvdXJjZS4KLSAgICogCi0gICAqIEBwYXJhbSBjYWNoZUVudHJ5IFRoZSBjYWNoZSBlbnRyeSB0byByZWZyZXNoLgotICAgKiBAcmV0dXJuIFRoZSByZWZyZXNoZWQgY2FjaGUgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2FjaGVFbnRyeSByZWZyZXNoQ2FjaGVFbnRyeShDYWNoZUVudHJ5IGNhY2hlRW50cnkpCi0gIHsKLQkgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JICBPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCSAgdHJ5Ci0JICB7Ci0JCSAgVVJMIHVybCA9IG5ldyBVUkwoY2FjaGVFbnRyeS5nZXRVUkkoKSk7Ci0JCSAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkgIGNvbm4uY29ubmVjdCgpOwotCQkgIAotCQkgIGxvbmcgbGFzdE1vZGlmaWVkID0gY29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkgICAgICBpZihsYXN0TW9kaWZpZWQgPiBjYWNoZUVudHJ5LmdldExhc3RNb2RpZmllZCgpKQotCQkgIHsKLQkJCWxvbmcgZXhwaXJhdGlvbiA9IGNvbm4uZ2V0RXhwaXJhdGlvbigpOwotCQkgICAgaWYoZXhwaXJhdGlvbiA9PSAwKQotCQkJewotCQkJICBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOwotCQkJfQotCQkJCi0JCSAgICBpcyA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQotCQkJU3RyaW5nIGxvY2FsRmlsZSA9IGNhY2hlRW50cnkuZ2V0TG9jYWxGaWxlKCk7Ci0gIAotCQkgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoQ0FDSEVfUFJFRklYLCBDQUNIRV9TVUZGSVgpOwotCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0KLQkJICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07Ci0JCSAgICBpbnQgYnl0ZWxlbmd0aDsKLQkJICAgIHdoaWxlKChieXRlbGVuZ3RoID0gaXMucmVhZChieXRlcykpICE9IC0xKQotCQkgICAgewotCQkJICBvcy53cml0ZShieXRlcywgMCwgYnl0ZWxlbmd0aCk7Ci0JCSAgICB9Ci0JCQlpcy5jbG9zZSgpOwotCQkJb3MuY2xvc2UoKTsKLQkJCWRlbGV0ZUZpbGUoY2FjaGVFbnRyeS5nZXRVUkkoKSk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShjYWNoZUxvY2F0aW9uLCBsb2NhbEZpbGUpOwotCQkJdGVtcEZpbGUucmVuYW1lVG8oZik7Ci0JCQljYWNoZUVudHJ5LnNldEV4cGlyYXRpb24oZXhwaXJhdGlvbik7Ci0JCQljYWNoZUVudHJ5LnNldExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpOwotCQkgIH0KLQkJICAvLyBUaGUgY2FjaGUgZW50cnkgaGFzbid0IGNoYW5nZWQuIEp1c3QgdXBkYXRlIHRoZSBleHBpcmF0aW9uIHRpbWUuCi0JICAgICAgZWxzZQotCQkgIHsKLQkJCWxvbmcgZXhwaXJhdGlvbiA9IGNvbm4uZ2V0RXhwaXJhdGlvbigpOwotCQkJaWYoZXhwaXJhdGlvbiA9PSAwKQotCQkJewotCQkJICBleHBpcmF0aW9uID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBUSU1FT1VUOwotCQkJfQotCQkJY2FjaGVFbnRyeS5zZXRFeHBpcmF0aW9uKGV4cGlyYXRpb24pOwotCQkgIH0KLQotCSAgfQotCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JICB7Ci0gICAgICAvLyBEbyBub3RoaW5nLgotCSAgfQotCSAgZmluYWxseQotCSAgewotCQkgIGlmKGlzICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIGlzLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLgotCQkJICB9Ci0JCSAgfQotCQkgIGlmKG9zICE9IG51bGwpCi0JCSAgewotCQkJICB0cnkKLQkJCSAgewotCQkJICAgIG9zLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLQkJCSAgewotCQkJCS8vIERvIG5vdGhpbmcgaWYgdGhlIHN0cmVhbSBjYW5ub3QgYmUgY2xvc2VkLiAKLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIHJldHVybiBjYWNoZUVudHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBjYWNoZWQgVVJJcy4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdGhlIGNhY2hlZCBVUklzLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldENhY2hlZFVSSXMoKQotICB7Ci0JU2V0IGtleXNldCA9IGNhY2hlLmtleVNldCgpOwotCXJldHVybiAoU3RyaW5nW10pa2V5c2V0LnRvQXJyYXkobmV3IFN0cmluZ1trZXlzZXQuc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgY2FjaGUuIENsb3NpbmcgdGhlIGNhY2hlIGludm9sdmVzIHNlcmlhbGl6aW5nIHRoZSBkYXRhIHRvIGFuIFhNTCBmaWxlCi0gICAqIGluIHRoZSBwbHVnaW4gc3RhdGUgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpCi0gIHsKLQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgY2FjaGVkb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0JCUVsZW1lbnQgcm9vdGVsZW0gPSBjYWNoZWRvYy5jcmVhdGVFbGVtZW50KENBQ0hFKTsKLQkJY2FjaGVkb2MuYXBwZW5kQ2hpbGQocm9vdGVsZW0pOwotCQkKLQkgIEVudW1lcmF0aW9uIHVyaXMgPSBjYWNoZS5rZXlzKCk7Ci0JICB3aGlsZSh1cmlzLmhhc01vcmVFbGVtZW50cygpKQotCSAgewotCQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKXVyaXMubmV4dEVsZW1lbnQoKTsKLQkJICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSAoQ2FjaGVFbnRyeSljYWNoZS5nZXQoa2V5KTsKLQkJICBpZihjYWNoZUVudHJ5ICE9IG51bGwpCi0JCSAgewotCQkJICBFbGVtZW50IGVudHJ5ID0gY2FjaGVkb2MuY3JlYXRlRWxlbWVudChFTlRSWSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShVUkksIGtleSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShMT0NBVElPTiwgY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKSk7Ci0JCQkgIGVudHJ5LnNldEF0dHJpYnV0ZShFWFBJUkFUSU9OX1RJTUUsIFN0cmluZy52YWx1ZU9mKGNhY2hlRW50cnkuZ2V0RXhwaXJhdGlvblRpbWUoKSkpOwotCQkJICBlbnRyeS5zZXRBdHRyaWJ1dGUoTEFTVF9NT0RJRklFRCwgU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5nZXRMYXN0TW9kaWZpZWQoKSkpOwotCQkJICByb290ZWxlbS5hcHBlbmRDaGlsZChlbnRyeSk7Ci0JCSAgfQotCSAgfQotCSAgCi0JICAvLyBXcml0ZSB0aGUgY2FjaGUgZW50cnkuCi0JICBUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBTb3VyY2UgaW5wdXQgPSBuZXcgRE9NU291cmNlKGNhY2hlZG9jKTsKLQkgIElQYXRoIHN0YXRlTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSk7Ci0gICAgICBSZXN1bHQgb3V0cHV0ID0gbmV3IFN0cmVhbVJlc3VsdChzdGF0ZUxvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBDQUNIRV9GSUxFKTsKLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShpbnB1dCwgb3V0cHV0KTsKLQotICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHN0b3JlIGludGVybmV0IGNhY2hlLiIpOwotCSAgfQotCSAgY2FjaGVJbnN0YW5jZSA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBPcGVuIHRoZSBjYWNoZS4gT3BlbmluZyB0aGUgY2FjaGUgaW52b2x2ZXMgcGFyc2luZyB0aGUgY2FjaGUgWE1MIGZpbGUgaW4KLSAgICogdGhlIHBsdWdpbiBzdGF0ZSBsb2NhdGlvbiBpZiBpdCBjYW4gYmUgcmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBvcGVuKElQYXRoIGNhY2hlTG9jYXRpb24pCi0gIHsKLSAgICBjYWNoZUluc3RhbmNlID0gbmV3IENhY2hlKGNhY2hlTG9jYXRpb24pOwotCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgdHJ5IHsKLQkJICAKLQkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IGNhY2hlTG9jYXRpb247Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgY2FjaGVkb2MgPSBidWlsZGVyLnBhcnNlKHN0YXRlTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIENBQ0hFX0ZJTEUpOwotCQlFbGVtZW50IHJvb3RlbGVtID0gY2FjaGVkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGVudHJpZXMgPSByb290ZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBudW1FbnRyaWVzID0gZW50cmllcy5nZXRMZW5ndGgoKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykKLQkJewotCQkJTm9kZSBlbnRyeSA9IGVudHJpZXMuaXRlbShpKTsKLQkJCWlmKGVudHJ5IGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCXsKLQkJCQlFbGVtZW50IGUgPSAoRWxlbWVudCllbnRyeTsKLQkJCQlpZihlLmdldE5vZGVOYW1lKCkuZXF1YWxzKEVOVFJZKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB1cmkgPSBlLmdldEF0dHJpYnV0ZShVUkkpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBlLmdldEF0dHJpYnV0ZShMT0NBVElPTik7Ci0JCQkJCVN0cmluZyBsbSA9IGUuZ2V0QXR0cmlidXRlKExBU1RfTU9ESUZJRUQpOwotCQkJCQlTdHJpbmcgZXQgPSBlLmdldEF0dHJpYnV0ZShFWFBJUkFUSU9OX1RJTUUpOwotCQkJCQlsb25nIGxhc3RNb2RpZmllZCA9IC0xOwotCQkJCQlsb25nIGV4cGlyYXRpb25UaW1lID0gLTE7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlsYXN0TW9kaWZpZWQgPSBMb25nLnBhcnNlTG9uZyhsbSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLQkJCQkJewotCQkJCQl9Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlleHBpcmF0aW9uVGltZSA9IExvbmcucGFyc2VMb25nKGV0KTsKLQkJCQkJfQotCQkJCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQkJaWYodXJpICE9IG51bGwgJiYgbG9jYXRpb24gIT0gbnVsbCkKLQkJCQkJewotCQkJCQkgIGNhY2hlSW5zdGFuY2UuY2FjaGUucHV0KHVyaSwgbmV3IENhY2hlRW50cnkodXJpLCBsb2NhdGlvbiwgbGFzdE1vZGlmaWVkLCBleHBpcmF0aW9uVGltZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICB9Ci0JICBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLQkgIHsKLQkJLy8gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiB0aGVyZSBpcyBub3RoaW5nIHRvIGxvYWQuIERvIG5vdGhpbmcuCi0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZSkKLQkgIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBsb2FkIGNhY2hlLiIpOwotCSAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ2xlYXIgYWxsIG9mIHRoZSBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLiBUaGlzIG1ldGhvZCBhbHNvIGRlbGV0ZXMgdGhlIGNhY2hlIGZpbGVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0JRW51bWVyYXRpb24ga2V5cyA9IGNhY2hlLmtleXMoKTsKLQl3aGlsZShrZXlzLmhhc01vcmVFbGVtZW50cygpKQotCXsKLQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLQkgIAotCSAgZGVsZXRlRmlsZShrZXkpOwotCX0KLQljYWNoZS5jbGVhcigpOwotICB9Ci0gIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBjYWNoZSBlbnRyeSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIFVSSS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGVudHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgZGVsZXRlRW50cnkoU3RyaW5nIHVyaSkKLSAgewotCSAgaWYodXJpID09IG51bGwpIHJldHVybjsKLQkgIAotCSAgZGVsZXRlRmlsZSh1cmkpOwotCSAgY2FjaGUucmVtb3ZlKHVyaSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gZGVsZXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgdXJpKQotICB7Ci0JICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSAoQ2FjaGVFbnRyeSljYWNoZS5nZXQodXJpKTsKLQkgIGlmKGNhY2hlRW50cnkgIT0gbnVsbCkKLQkgIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gY2FjaGVMb2NhdGlvbi50b1N0cmluZygpICsgIi8iICsgY2FjaGVFbnRyeS5nZXRMb2NhbEZpbGUoKTsKLQkgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24pOwotCSAgICBpZighZmlsZS5kZWxldGUoKSkKLQkgICAgewotCSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSBmaWxlICIgKyBsb2NhdGlvbiArICIgZnJvbSBjYWNoZS4iKTsKLQkgICAgfSAKLQkgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxN2VjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIGNhY2hlIGVudHJ5IGNvbnRhaW5zIGEgVVJJLCBhIGxvY2FsIGZpbGUsIGFuZCBhIHRpbWVvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUVudHJ5IAotewotICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsRmlsZTsKLSAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsKLSAgcHJpdmF0ZSBsb25nIGV4cGlyYXRpb25UaW1lOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBjYWNoZSBlbnRyeS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlbW90ZSBVUkkgb2YgdGhlIGNhY2hlIGVudHJ5LgotICAgKiBAcGFyYW0gbG9jYWxGaWxlIFRoZSBsb2NhbCBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNhY2hlZCBlbnRyeS4KLSAgICogQHBhcmFtIGxhc3RNb2RpZmllIFRoZSB0aW1lIHRoaXMgcmVzb3VyY2Ugd2FzIGxhc3QgbW9kaWZpZWQuCi0gICAqIEBwYXJhbSBleHBpcmF0aW9uVGltZSBUaGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IHRoaXMgY2FjaGUgZW50cnkgd2lsbAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlLgotICAgKi8KLSAgcHVibGljIENhY2hlRW50cnkoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsRmlsZSwgbG9uZyBsYXN0TW9kaWZpZWQsIGxvbmcgZXhwaXJhdGlvblRpbWUpCi0gIHsKLQl0aGlzLnVyaSA9IHVyaTsKLQl0aGlzLmxvY2FsRmlsZSA9IGxvY2FsRmlsZTsKLQl0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLQl0aGlzLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgY2FjaGUgZW50cnkgaXMgZXhwaXJlZCBpZiBpdHMgZXhwaXJhdGlvbiB0aW1lIGlzIGxlc3MgdGhlbiB0aGUKLSAgICogY3VycmVudCBzeXN0ZW0gdGltZSBhbmQgbm90IGVxdWFsIHRvIC0xLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgY2FjaGVkIGVudHJ5IGhhcyBleHBpcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFeHBpcmVkKCkKLSAgewotCSBpZihleHBpcmF0aW9uVGltZSAhPSAtMSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA+IGV4cGlyYXRpb25UaW1lKQotCSB7Ci0JICAgcmV0dXJuIHRydWU7Ci0JIH0KLQkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogCi0gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogICAgICAgICAgICAgICAgLTEgaW5kaWNhdGVzIHRoYXQgdGhpcyBlbnRyeSB3aWxsIG5vdCBleHBpcmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uKGxvbmcgZXhwaXJhdGlvblRpbWUpCi0gIHsKLQl0aGlzLmV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHRpbWUgYXQgd2hpY2ggdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHRpbWUgYXQgd2hpY2ggdGhpcyBjYWNoZSBlbnRyeSB3aWxsIGV4cGlyZS4KLSAgICovCi0gIHB1YmxpYyBsb25nIGdldEV4cGlyYXRpb25UaW1lKCkKLSAgewotCXJldHVybiBleHBpcmF0aW9uVGltZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgcmVtb3RlIFVSSSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlbW90ZSBVUkkgZm9yIHRoaXMgY2FjaGUgZW50cnkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLQlyZXR1cm4gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhbCBmaWxlIGZvciB0aGlzIGNhY2hlIGVudHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbG9jYWwgZmlsZSBmb3IgdGhpcyBjYWNoZSBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxGaWxlKCkKLSAgewotCXJldHVybiBsb2NhbEZpbGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxhc3QgdGltZSB0aGlzIGNhY2hlIGVudHJ5IHdhcyBtb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpCi0gIHsKLQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBsYXN0IHRpbWUgdGhpcyBjYWNoZSBlbnRyeSB3YXMgbW9kaWZpZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyBsYXN0TW9kaWZpZWQpCi0gIHsKLQl0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGMzOTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLQotLyoqCi0gKiBBIGNhY2hlIGpvYiBydW5zIG9uY2UgYW4gaG91ciB0byBjYWNoZSBhbnkgcHJlc3BlY2lmaWVkIHJlc291cmNlcyB3aGljaAotICogc2hvdWxkIGJlIGNhY2hlZCBhbmQgYW55IHJlc291cmNlcyBmb3Igd2hpY2ggYW4gYXR0ZW1wdCB3YXMgcHJldmlvdXNseSAKLSAqIG1hZGUgdG8gY2FjaGUgdGhlbSBidXQgdGhleSB3ZXJlIHVuYWJsZSB0byBiZSBjYWNoZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZUpvYiBleHRlbmRzIEpvYgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNDSEVEVUxFX1RJTUUgPSAzNjAwMDAwOwotCi0gIHByaXZhdGUgc3RhdGljIENhY2hlSm9iIGpvYiA9IG51bGw7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZUpvYigpCi0gIHsKLSAgICBzdXBlcihDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9NT05JVE9SX05BTUUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICovCi0gIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLQlib29sZWFuIGFsbFN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgIENhY2hlIGNhY2hlID0gQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSB1bmNhY2hlZFVSSXMgPSBjYWNoZS5nZXRVbmNhY2hlZFVSSXMoKTsKLSAgICBpbnQgbnVtVW5jYWNoZWRVUklzID0gdW5jYWNoZWRVUklzLmxlbmd0aDsKLQotICAgIGNhY2hlLmNsZWFyVW5jYWNoZWRVUklzKCk7Ci0gICAgbW9uaXRvci5iZWdpblRhc2soQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfTU9OSVRPUl9OQU1FLCBudW1VbmNhY2hlZFVSSXMpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1VbmNhY2hlZFVSSXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yKGludCBqID0gaTsgaiA8IG51bVVuY2FjaGVkVVJJczsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhY2hlLmFkZFVuY2FjaGVkVVJJKHVuY2FjaGVkVVJJc1tqXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdXJpID0gdW5jYWNoZWRVUklzW2ldOwotICAgICAgICBtb25pdG9yLnNldFRhc2tOYW1lKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX1VJX0NBQ0hFX01PTklUT1JfQ0FDSElORywgbmV3IE9iamVjdFtde3VyaX0pKTsKLSAgICAgICAKLSAgICAgICAgU3RyaW5nIGNhY2hlZFVSSSA9IGNhY2hlLmdldFJlc291cmNlKHVyaSk7Ci0gICAgICAgIGlmKGNhY2hlZFVSSSA9PSBudWxsKQotICAgIAl7Ci0gICAgCSAgYWxsU3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgIAl9Ci0gICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgfQotICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9IAotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICAvLyBJZiBhbGwgdGhlIHVuY2FjaGVkIFVSSXMgY291bGQgbm90IGJlIGNhY2hlZCAKLSAgICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IHRpbWUgdGhlIGpvYiBzaG91bGQgcnVuLgotICAgICAgaWYoIWFsbFN1Y2Nlc3NmdWwpCi0gICAgICB7Ci0gICAgCSAgc3RhcnRKb2IoU0NIRURVTEVfVElNRSk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFN0YXJ0IHRoZSBjYWNoZSBqb2IuIFRoZSBjYWNoZSBqb2IgY2FjaGVzIHJlc291cmNlcyB0aGF0IHdlcmUgbm90IGFibGUgdG8gYmUgcHJldmlvdXNseQotICAgKiBkb3dubG9hZGVkLiBPbmx5IG9uZSBqb2IgaXMgcnVuIGF0IGEgdGltZS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdGFydEpvYigpIAotICB7Ci0JaWYoam9iID09IG51bGwpCi0JewotCSAgc3RhcnRKb2IoMCk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogU3RhcnQgYSBuZXcgY2FjaGUgam9iIHdpdGggdGhlIHNwZWNpZmllZCBkZWxheS4KLSAgICogCi0gICAqIEBwYXJhbSBkZWxheQotICAgKiAJCVRoZSBzdGFydCBkZWxheSBmb3IgdGhlIGNhY2hlIGpvYi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRKb2IobG9uZyBkZWxheSkKLSAgewotCWpvYiA9IG5ldyBDYWNoZUpvYigpOwotCWpvYi5zZXRQcmlvcml0eShDYWNoZUpvYi5ERUNPUkFURSk7Ci0Jam9iLnNjaGVkdWxlKGRlbGF5KTsgLy8gc3RhcnQgYXMgc29vbiBhcyBwb3NzaWJsZQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhlIGN1cnJlbnQgY2FjaGUgam9iLiBUaGUgY2FjaGUgam9iIGNhY2hlcyByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBhYmxlIHRvIGJlIHByZXZpb3VzbHkKLSAgICogZG93bmxvYWRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdG9wSm9iKCkgCi0gIHsKLQlpZiAoam9iICE9IG51bGwpIAotCXsKLQkgIGpvYi5jYW5jZWwoKTsKLQl9Ci0Jam9iID0gbnVsbDsKLSAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmZWUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgdGhlIGNhY2hlLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fQ0xFQVJfQ0FDSEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJFRl9DQUNIRV9DQUNIRV9PUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfQ0FDSEVfQUJPVVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BSRUZfUFJPTVBUX0ZPUl9ESVNBR1JFRURfTElDRU5TRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBQ0hFX01PTklUT1JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HOwotCi0JLy8gQ2FjaGUgbGljZW5zZSBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfQUdSRUVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQUNIRV9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xPQURJTkdfTElDRU5TRTsKLQotCS8vIENhY2hlIGxvZ2dpbmcgbWVzc2FnZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfTE9HX0lORk9fV1RQX05PX1VTRVJfSU5URVJBQ1RJT047Ci0KLQkvLyBXVFAgdGVzdCBubyB1c2VyIGludGVyYWN0aW9uIHN5c3RlbSBwcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QOyAgIAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENhY2hlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGYwZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIAotewotICAvKioKLSAgICogVGhlIElEIG9mIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSI7Ci0KLSAgLyoqCi0gICAqIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBDYWNoZVBsdWdpbiBwbHVnaW47Ci0KLSAgLyoqCi0gICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZVBsdWdpbigpIAotICB7Ci0Jc3VwZXIoKTsKLQlwbHVnaW4gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCVRvQ2FjaGVSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLnJlYWRSZWdpc3RyeSgpOwotCUNhY2hlLm9wZW4oUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihnZXRCdW5kbGUoKSkpOwotCWlmIChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmNvbnRhaW5zKFByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfRU5BQkxFRCkpIAotCXsKLQkgIHNldENhY2hlRW5hYmxlZChnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSk7Ci0JfSAKLQllbHNlIAotCXsKLQkgIC8vIFRoZSBjYWNoZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotCSAgc2V0Q2FjaGVFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLy8gUmVzdG9yZSBsaWNlbnNlIHByZWZlcmVuY2VzCi0JUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCUxpY2Vuc2VSZWdpc3RyeSByZWdpc3RyeSA9IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVN0cmluZ1tdIGxpY2Vuc2VzID0gcmVnaXN0cnkuZ2V0TGljZW5zZXMoKTsKLQlpbnQgbnVtTGljZW5zZXMgPSBsaWNlbnNlcy5sZW5ndGg7Ci0JZm9yKGludCBpID0gMDsgaSA8IG51bUxpY2Vuc2VzOyBpKyspCi0JewotCSAgaW50IHN0YXRlID0gcHJlZnMuZ2V0SW50KGxpY2Vuc2VzW2ldKTsKLQkgIGlmKHN0YXRlID09IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0FHUkVFLmludFZhbHVlKCkpCi0JICB7Ci0JCXJlZ2lzdHJ5LmFncmVlTGljZW5zZShsaWNlbnNlc1tpXSk7Ci0JICB9Ci0JICBlbHNlIGlmKHN0YXRlID09IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFLmludFZhbHVlKCkpCi0JICB7Ci0JCXJlZ2lzdHJ5LmRpc2FncmVlTGljZW5zZShsaWNlbnNlc1tpXSk7Ci0JICB9Ci0JfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkvLyBTYXZlIHRoZSBsaWNlbnNlIHN0YXRlIGluZm9ybWF0aW9uLgotCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQlMaWNlbnNlUmVnaXN0cnkgcmVnaXN0cnkgPSBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmdbXSBsaWNlbnNlcyA9IHJlZ2lzdHJ5LmdldExpY2Vuc2VzKCk7Ci0JaW50IG51bUxpY2Vuc2VzID0gbGljZW5zZXMubGVuZ3RoOwotCWZvcihpbnQgaSA9IDA7IGkgPCBudW1MaWNlbnNlczsgaSsrKQotCXsKLQkgIEludGVnZXIgc3RhdGUgPSByZWdpc3RyeS5nZXRMaWNlbnNlU3RhdGUobGljZW5zZXNbaV0pOwotICAgICAgLy8gRm9yIHN0YXRlcyB0aGF0IGhhdmUgYmVlbiBkaXNhZ3JlZWQgdG8gdGhpcyBzZXNzaW9uIHN0b3JlCi0JICAvLyB0aGVtIGFzIGRpc2FncmVlLgotCSAgaWYoc3RhdGUgPT0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKQotCSAgewotCQlzdGF0ZSA9IExpY2Vuc2VSZWdpc3RyeS5MSUNFTlNFX0RJU0FHUkVFOwotCSAgfQotCSAgcHJlZnMuc2V0VmFsdWUobGljZW5zZXNbaV0sIHN0YXRlLmludFZhbHVlKCkpOwotCX0KLQkKLQlDYWNoZS5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0JQ2FjaGVKb2Iuc3RvcEpvYigpOwotCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JcGx1Z2luID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENhY2hlUGx1Z2luIGdldERlZmF1bHQoKSAKLSAgewotCXJldHVybiBwbHVnaW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSBjYWNoZSBpcyBlbmFibGVkLgotICAgKiAKLSAgICogQHBhcmFtIGVuYWJsZWQgSWYgdHJ1ZSB0aGUgY2FjaGUgaXMgZW5hYmxlZCwgaWYgZmFsc2UgaXQgaXMgbm90IGVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDYWNoZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSAKLSAgewotCWdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVELCBlbmFibGVkKTsKLQlDYWNoZUpvYi5zdG9wSm9iKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWNoZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhY2hlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVFbmFibGVkKCkgCi0gIHsKLQlpZiAoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5jb250YWlucyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpKQotCSAgcmV0dXJuIGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQpOwotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBmb3IgbGljZW5zZXMgdG8gd2hpY2ggdGhleSAKLSAgICogaGF2ZSBwcmV2aW91c2x5IGRpc2FncmVlZC4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9tcHQgSWYgdHJ1ZSB0aGUgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkLCBpZiBmYWxzZSB0aGUgdXNlciBzaG91bGQgbm90IGJlIHByb21wdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvbXB0RGlzYWdyZWVkTGljZW5zZXMoYm9vbGVhbiBwcm9tcHQpIAotICB7Ci0JZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMsIHByb21wdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgZm9yIGxpY2Vuc2VzIHRvIHdoaWNoIHRoZXkKLSAgICogaGF2ZSBwcmV2aW91c2x5IGRpc2FncmVlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkUHJvbXB0KCkgCi0gIHsKLQlpZiAoZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5jb250YWlucyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpKQotCSAgcmV0dXJuIGdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBST01QVF9ESVNBR1JFRURfTElDRU5TRVMpOwotCXJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODUwZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENhY2hlIHByZWZlcmVuY2UgcGFnZSBzdHJpbmdzLgotX1VJX0NPTkZJUk1fQ0xFQVJfQ0FDSEVfRElBTE9HX1RJVExFICAgICAgICAgICAgID0gUmVtb3ZlIEFsbD8KLV9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19NRVNTQUdFICAgICAgICAgICA9IFJlbW92ZSBhbGwgY2FjaGUgZW50cmllcz8KLV9VSV9DT05GSVJNX0RFTEVURV9DQUNIRV9FTlRSWV9ESUFMT0dfVElUTEUgICAgICA9IFJlbW92ZSBFbnRyaWVzPwotX1VJX0NPTkZJUk1fREVMRVRFX0NBQ0hFX0VOVFJZX0RJQUxPR19NRVNTQUdFICAgID0gUmVtb3ZlIGFsbCBzZWxlY3RlZCBjYWNoZSBlbnRyaWVzPwotX1VJX0JVVFRPTl9DTEVBUl9DQUNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUmVtb3ZlICZBbGwKLV9VSV9CVVRUT05fREVMRVRFX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZSZW1vdmUKLV9VSV9QUkVGX0NBQ0hFX0VOVFJJRVNfVElUTEUgICAgICAgICAgICAgICAgICAgICA9ICZDYWNoZSBlbnRyaWVzOgotX1VJX1BSRUZfQ0FDSEVfQ0FDSEVfT1BUSU9OICAgICAgICAgICAgICAgICAgICAgID0gJkRpc2FibGUgY2FjaGluZwotX1VJX1BSRUZfQ0FDSEVfQUJPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTWFuYWdlIHRoZSBjYWNoZSBvZiByZW1vdGUgcmVzb3VyY2VzLCBzdWNoIGFzIHRob3NlIGRvd25sb2FkZWQgZnJvbSB0aGUgaW50ZXJuZXQuCi1fVUlfUFJFRl9QUk9NUFRfRk9SX0RJU0FHUkVFRF9MSUNFTlNFUyAgICAgICAgICAgPSAmUHJvbXB0IG1lIGZvciBhZ3JlZW1lbnQgZm9yIGxpY2Vuc2VzIGZvciB3aG9zZSB0ZXJtcyBJIGhhdmUgYWxyZWFkeSBkaXNhZ3JlZWQuCi0KLSMgQ2FjaGUgbW9uaXRvciBzdHJpbmdzLgotX1VJX0NBQ0hFX01PTklUT1JfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ2FjaGluZyBSZW1vdGUgUmVzb3VyY2VzCi1fVUlfQ0FDSEVfTU9OSVRPUl9DQUNISU5HICAgICAgICAgICAgICAgICAgICAgICAgPSBDYWNoaW5nIHswfQotCi0jIENhY2hlIGxpY2Vuc2UgZGlhbG9nCi1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMSAgICAgICAgICAgICAgPSBBIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSB0byBjYWNoZSB0aGUgcmVzb3VyY2U6Ci1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMiAgICAgICAgICAgICAgPSBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2UgYmVsb3c6Ci1fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTCAgPSBJbiBvcmRlciB0byBjYWNoZSB0aGUgcmVzb3VyY2UgeW91IG11c3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2Ugd2hpY2ggaGFzIGJlZW4gb3BlbmVkIGluIHlvdXIgYnJvd3Nlci4KLV9VSV9DQUNIRV9ESUFMT0dfTElDRU5TRV9TVEFURU1FTlQyX05PX0JST1dTRVIgICA9IFRoZSBsaWNlbnNlIGNhbm5vdCBiZSBkaXNwbGF5ZWQgaW4gdGhpcyBkaWFsb2cuIEluIG9yZGVyIHRvIGNhY2hlIHRoZSByZXNvdXJjZSB5b3UgbXVzdCBhZ3JlZSB0byB0aGUgbGljZW5zZSBsb2NhdGVkIGF0IHswfS4KLV9VSV9DQUNIRV9ESUFMT0dfQUdSRUVfQlVUVE9OICAgICAgICAgICAgICAgICAgICA9IEkgQWdyZWUKLV9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OICAgICAgICAgICAgICAgICA9IEkgRGlzYWdyZWUKLV9VSV9DQUNIRV9ESUFMT0dfVElUTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExpY2Vuc2UgQWdyZWVtZW50Ci1fVUlfTE9BRElOR19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMb2FkaW5nIGxpY2Vuc2UKLQotIyBDYWNoZSBsb2dnaW5nIG1lc3NhZ2VzCi1fTE9HX0lORk9fV1RQX05PX1VTRVJfSU5URVJBQ1RJT04gICAgICAgICAgICAgICAgPSB7MH0gaXMgc2V0LiBMaWNlbnNlcyBkaWFsb2dzIHdpbGwgbm90IGJlIGRpc3BsYXllZC4KLQotIyBXVFAgdGVzdCBubyB1c2VyIGludGVyYWN0aW9uIHN5c3RlbSBwcm9wZXJ0eQotIyBUaGlzIHByb3BlcnR5IGlzIGNoZWNrZWQgYnkgdGhlIGNhY2hlLiBUaGlzIHN0aW5nIGlzIG5vdCBzaG93biB0byB0aGUgdXNlci4KLVdUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QICAgICAgICAgICAgICA9IHd0cC5hdXRvdGVzdC5ub25pbnRlcmFjdGl2ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTE4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotCi0vKioKLSAqIEEgY2FjaGUgVVJJIHJlc29sdmVyLiBUaGlzIHJlc29sdmVyIHdpbGwgY2FjaGUgcmVtb3RlIHJlc291cmNlcyBhbmQgcmV0dXJuCi0gKiB0aGUgbG9jYWwgY29weSBpZiB0aGV5IGNhbiBiZSBjYWNoZWQuIElmIGEgcmVzb3VyY2UgY2Fubm90IGJlIGNhY2hlZCB0aGUKLSAqIHJlc291cmNlIHJldHVybnMgbnVsbC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbiAKLXsKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJFeHRlbnNpb24jcmVzb2x2ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JeyAKLSAgICAgIGlmKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5pc0NhY2hlRW5hYmxlZCgpKQotICAgICAgewotCQkgIFN0cmluZyByZXNvdXJjZSA9IG51bGw7Ci0JCSAgaWYoc3lzdGVtSWQgIT0gbnVsbCkKLQkJICB7Ci0JCSAgICByZXNvdXJjZSA9IFVSSUhlbHBlci5ub3JtYWxpemUoc3lzdGVtSWQsIGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCSAgfSAKLQkJICAKLQkJICBpZihyZXNvdXJjZSAhPSBudWxsICYmIChyZXNvdXJjZS5zdGFydHNXaXRoKCJodHRwOiIpIHx8IHJlc291cmNlLnN0YXJ0c1dpdGgoImZ0cDoiKSkpCi0JCSAgewotCQkgICAgLy8gSGFuZGxlIHJlc291cmNlcyBwcmVzcGVjaWZpZWQgdG8gY2FjaGUuCi0JCSAgICBUb0NhY2hlUmVzb3VyY2UgdG9DYWNoZVJlc291cmNlID0gVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VUb0NhY2hlKHJlc291cmNlKTsKLQkJICAgIGlmKHRvQ2FjaGVSZXNvdXJjZSA9PSBudWxsIHx8IExpY2Vuc2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmhhc0xpY2Vuc2VCZWVuQWNjZXB0ZWQocmVzb3VyY2UsIHRvQ2FjaGVSZXNvdXJjZS5nZXRMaWNlbnNlKCkpKQotCQkgICAgeyAJCi0JCSAgICAgIHJldHVybiBDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJICAgIH0KLQkJICB9Ci0gICAgICB9Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmMzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSBkaWFsb2cgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGFjY2VwdCBhIGxpY2Vuc2UgYWdyZWVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyAKLXsKLSAgLyoqCi0gICAqIEhvbGRzIGFsbCB0aGUgZGlhbG9ncyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGtleWVkIGJ5IHRoZSBsaWNlbnNlIFVSTC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBkaWFsb2dzSW5Vc2UgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KLSAgLyoqCi0gICAqIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsaWNlbnNlVVJMOwotICAKLSAgLyoqCi0gICAqIFRoZSBhZ3JlZSBidXR0b24gZm9yIHRoZSBkaWFsb2cuCi0gICAqLwotICBwcml2YXRlIEJ1dHRvbiBhZ3JlZUJ1dHRvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhpcyBkaWFsb2cuCi0gICAqIEBwYXJhbSB1cmwgVGhlIGxpY2Vuc2UgVVJMLgotICAgKi8KLSAgcHJvdGVjdGVkIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2VVUkwpIAotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmxpY2Vuc2VVUkwgPSBsaWNlbnNlVVJMOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIAotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX1RJVExFKTsKLSAgICBzaGVsbC5zZXRJbWFnZShudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbkJhcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLQlDb21wb3NpdGUgYnV0dG9uQmFyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAwOwotCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCWJ1dHRvbkJhci5zZXRMYXlvdXQobGF5b3V0KTsKLQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JYnV0dG9uQmFyLnNldExheW91dERhdGEoZ2QpOwotCQotCS8vIENyZWF0ZSB0aGUgYWdyZWUgYnV0dG9uLgotCWFncmVlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkJhciwgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuT0ssIAotCQkJQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0FHUkVFX0JVVFRPTiwgZmFsc2UpOwotCWFncmVlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQotCS8vIENyZWF0ZSB0aGUgZGlzYWdyZWUgYnV0dG9uLgotCWNyZWF0ZUJ1dHRvbihidXR0b25CYXIsIExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLkNBTkNFTCwgCi0JCQlDYWNoZU1lc3NhZ2VzLl9VSV9DQUNIRV9ESUFMT0dfRElTQUdSRUVfQlVUVE9OLCBmYWxzZSk7Ci0JCi0JcmV0dXJuIGJ1dHRvbkJhcjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMKTsKLQlnZC53aWR0aEhpbnQgPSA1MDA7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JLy8gRGlzcGxheSBhIHN0YXRlbWVudCBhYm91dCB0aGUgbGljZW5zZS4KLQlMYWJlbCBsaWNlbnNlVGV4dDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGljZW5zZVRleHQxLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMSk7Ci0JTGFiZWwgdXJsVGV4dCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpOwotCXVybFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0JbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOyAvLyBTcGFjaW5nIGxhYmVsLgotCUxhYmVsIGxpY2Vuc2VUZXh0MiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpOwotCWxpY2Vuc2VUZXh0Mi5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkvLyBEaXNwbGF5IHRoZSBsaWNlbnNlIGluIGEgYnJvd3Nlci4KLQl0cnkKLQl7Ci0JICBmaW5hbCBDb21wb3NpdGUgbGljZW5zZVRleHRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCSAgZmluYWwgU3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLnNldExheW91dChzdGFja0xheW91dCk7Ci0JICBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCSAgZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCSAgLy8gQ3JlYXRlIHRoZSBsb2FkaW5nIHByb2dyZXNzIG1vbml0b3IgY29tcG9zaXRlIGFuZCBwYXJ0LgotCSAgQ29tcG9zaXRlIG1vbml0b3JDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpY2Vuc2VUZXh0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JICBtb25pdG9yQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JICBnZC5oZWlnaHRIaW50ID0gNDAwOwotCSAgbW9uaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIGZpbmFsIFByb2dyZXNzTW9uaXRvclBhcnQgbW9uaXRvciA9IG5ldyBQcm9ncmVzc01vbml0b3JQYXJ0KG1vbml0b3JDb21wb3NpdGUsIG5ldyBHcmlkTGF5b3V0KCkpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CT1RUT00sIHRydWUsIHRydWUpOwotCSAgbW9uaXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkgIG1vbml0b3IuYmVnaW5UYXNrKENhY2hlTWVzc2FnZXMuX1VJX0xPQURJTkdfTElDRU5TRSwgMTAwKTsKLQkgIHN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBtb25pdG9yQ29tcG9zaXRlOwotCSAgLy8gQ3JlYXRlIHRoZSBicm93c2VyLgotCSAgZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIobGljZW5zZVRleHRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCSAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkgIC8vZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkgIAotCSAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbGljZW5zZSBVUkwgaXMgc2V0IGV2ZW4gaWYgd2UgcmVhZCAKLQkgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgbGljZW5zZSBmaWxlIG91cnNlbHZlcyAoc2VlIGJlbG93KSBhcwotCSAgLy8gb3RoZXJ3aXNlIHRoZSBwcm9ncmVzcyBtb25pdG9yIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBjZXJ0YWluCi0JICAvLyBsaW51eCBzeXN0ZW1zIHdpdGggY2VydGFpbiBicm93c2Vycy4KLQkgIGJyb3dzZXIuc2V0VXJsKGxpY2Vuc2VVUkwpOwotCSAgCi0JICAvLyBUaGUgYnJvd3NlciB3aWRnZXQgaGFzIHByb2JsZW1zIGxvYWRpbmcgZmlsZXMgc3RvcmVkIGluIGphcnMKLQkgIC8vIHNvIHdlIHJlYWQgZnJvbSB0aGUgamFyIGFuZCBzZXQgdGhlIGJyb3dzZXIgdGV4dCBvdXJzZWx2ZXMuCi0JICAvLyBTZWUgYnVnIDE1NDcyMS4KLQkgIGlmKGxpY2Vuc2VVUkwuc3RhcnRzV2l0aCgiamFyOiIpKQotCSAgewotCQkgIElucHV0U3RyZWFtIGxpY2Vuc2VTdHJlYW0gPSBudWxsOwotCQkgIElucHV0U3RyZWFtUmVhZGVyIGlzcmVhZGVyID0gbnVsbDsKLQkJICBCdWZmZXJlZFJlYWRlciBicmVhZGVyID0gbnVsbDsKLQkJICB0cnkKLQkJICB7Ci0JCSAgVVJMIGJyb3dzZXJVUkwgPSBuZXcgVVJMKGxpY2Vuc2VVUkwpOwotCQkgIGxpY2Vuc2VTdHJlYW0gPSBicm93c2VyVVJMLm9wZW5TdHJlYW0oKTsKLQkJICBpc3JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihsaWNlbnNlU3RyZWFtKTsKLQkJICBicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcmVhZGVyKTsKLQkJICBTdHJpbmcgc3RyOwotCQkgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJICB3aGlsZSgoc3RyID0gYnJlYWRlci5yZWFkTGluZSgpKSE9bnVsbCl7Ci0JCSAgICAgIHNiLmFwcGVuZChzdHIpOwotCQkgIH0KLQkJICBicm93c2VyLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0JCSAgfQotCQkgIGZpbmFsbHkKLQkJICB7Ci0JCQkgIGlmKGxpY2Vuc2VTdHJlYW0gIT0gbnVsbCkKLQkJCSAgewotCQkJCSAgbGljZW5zZVN0cmVhbS5jbG9zZSgpOwotCQkJICB9Ci0JCQkgIGlmKGlzcmVhZGVyICE9IG51bGwpCi0JCQkgIHsKLQkJCQkgIGlzcmVhZGVyLmNsb3NlKCk7Ci0JCQkgIH0KLQkJCSAgaWYoYnJlYWRlciAhPSBudWxsKQotCQkJICB7Ci0JCQkJICBicmVhZGVyLmNsb3NlKCk7Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICAKLQkgIGJyb3dzZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICBicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKXsKLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NMaXN0ZW5lciNjaGFuZ2VkKG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIAotCQl7Ci0JCSAgaWYgKGV2ZW50LnRvdGFsICE9IDApCi0JCSAgewotCQkgICAgbW9uaXRvci5pbnRlcm5hbFdvcmtlZChldmVudC5jdXJyZW50ICogMTAwIC8gZXZlbnQudG90YWwpOwotCQkgIH0KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0xpc3RlbmVyI2NvbXBsZXRlZChvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0V2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIAotCQl7Ci0JCSAgbW9uaXRvci5kb25lKCk7Ci0JCQkKLQkJICBzdGFja0xheW91dC50b3BDb250cm9sID0gYnJvd3NlcjsKLQkJICBhZ3JlZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkgIGxpY2Vuc2VUZXh0Q29tcG9zaXRlLmxheW91dCgpOwotCQl9Ci0JICB9KTsKLQkgIAotCSAgbGljZW5zZVRleHQyLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMik7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIC8vIFRoZSBicm93c2VyIHRocm93cyBhbiBleGNlcHRpb24gb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgaXQuIAotCSAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGV4dGVybmFsIGJyb3dzZXIuCi0JICB0cnkKLQkgIHsKLQkgICAgQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCkuZ2V0RXh0ZXJuYWxCcm93c2VyKCkub3BlblVSTChuZXcgVVJMKGxpY2Vuc2VVUkwpKTsKLQkgICAgbGljZW5zZVRleHQyLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19JTlRFUk5BTCk7Ci0JICB9Ci0JICBjYXRjaChFeGNlcHRpb24gZXgpCi0JICB7Ci0JCS8vIEluIHRoaXMgY2FzZSB0aGUgbGljZW5zZSBjYW5ub3QgYmUgZGlzcGxheS4gSW5mb3JtIHRoZSB1c2VyIG9mIHRoaXMgYW5kIGdpdmUgdGhlbSB0aGUgbGljZW5zZSBsb2NhdGlvbi4KLQkJbGljZW5zZVRleHQyLnNldFRleHQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ2FjaGVNZXNzYWdlcy5fVUlfQ0FDSEVfRElBTE9HX0xJQ0VOU0VfU1RBVEVNRU5UMl9OT19CUk9XU0VSLCBuZXcgT2JqZWN0W117bGljZW5zZVVSTH0pKTsKLQkgIH0KLQl9Ci0KLQljcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKLQkJCi0JcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgCi0gIHsKLQlyZXR1cm4gZ2V0SW5mb0ltYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvbXB0IHRoZSB1c2VyIHRvIGFjY2VwdCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlCi0gICAqIGRpYWxvZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgZGlhbG9nLgotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB0aGUgbGljZW5zZSBtdXN0IGJlIGFjY2VwdGVkLgotICAgKiBAcGFyYW0gbGljZW5zZVVSTCBUaGUgbGljZW5zZSBVUkwuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGljZW5zZSBpcyBhY2NlcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdEZvckxpY2Vuc2UoU2hlbGwgcGFyZW50LCBTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZVVSTCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlib29sZWFuIGFncmVlZFRvTGljZW5zZSA9IGZhbHNlOwotCWJvb2xlYW4gbmV3RGlhbG9nID0gdHJ1ZTsKLQlMaWNlbnNlQWNjZXB0YW5jZURpYWxvZyBkaWFsb2cgPSBudWxsOwotCS8vIElmIHRoZSBkaWFsb2cgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgZm9yIHRoaXMgbGljZW5zZSB1c2UgaXQgaW5zdGVhZCBvZiAKLQkvLyBkaXNwbGF5aW5nIGFub3RoZXIgZGlhbG9nLgotCWlmKGRpYWxvZ3NJblVzZS5jb250YWluc0tleShsaWNlbnNlVVJMKSkKLQl7Ci0JICBuZXdEaWFsb2cgPSBmYWxzZTsKLQkgIGRpYWxvZyA9IChMaWNlbnNlQWNjZXB0YW5jZURpYWxvZylkaWFsb2dzSW5Vc2UuZ2V0KGxpY2Vuc2VVUkwpOwotCX0KLQllbHNlCi0JewotCSAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCi0JICB0cnkKLQkgIHsKLQkgICAgVVJMIHVybE9iaiA9IG5ldyBVUkwobGljZW5zZVVSTCk7Ci0JICAgIGlzID0gdXJsT2JqLm9wZW5TdHJlYW0oKTsKLQotCSAgICBkaWFsb2cgPSBuZXcgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cocGFyZW50LCB1cmwsIGxpY2Vuc2VVUkwpOwotCSAgICBkaWFsb2dzSW5Vc2UucHV0KGxpY2Vuc2VVUkwsIGRpYWxvZyk7Ci0JICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkgIH0KLQkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCSAgewotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBsaWNlbnNlIGNhbm5vdCBiZSBvcGVuZWQuIik7Ci0JICB9Ci0JICBmaW5hbGx5Ci0JICB7Ci0JCWlmKGlzICE9IG51bGwpCi0JCXsKLQkJICB0cnkKLQkJICB7Ci0JCQlpcy5jbG9zZSgpOwotCQkgIH0KLQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkgIHsKLQkJICAgIC8vIERvIG5vdGhpbmcuCi0JCSAgfQotCQl9Ci0JICB9Ci0JfQotCWlmKGRpYWxvZyAhPSBudWxsKQotCXsKLQkgIGRpYWxvZy5vcGVuKCk7Ci0JICAKLQkgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IExpY2Vuc2VBY2NlcHRhbmNlRGlhbG9nLk9LKSAKLQkgIHsKLQkJYWdyZWVkVG9MaWNlbnNlID0gdHJ1ZTsKLSAgICAgIH0KLQkJCi0JICBpZihuZXdEaWFsb2cpCi0JICB7Ci0gICAgICAgZGlhbG9nc0luVXNlLnJlbW92ZShsaWNlbnNlVVJMKTsKLQkgIH0KLQl9Ci0JIAotCXJldHVybiBhZ3JlZWRUb0xpY2Vuc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2xvc2UoKSAKLSAgewotCWlmKGFncmVlQnV0dG9uICE9IG51bGwpCi0JewotCSAgYWdyZWVCdXR0b24uZGlzcG9zZSgpOwotCSAgYWdyZWVCdXR0b24gPSBudWxsOwotCX0KLQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiMjQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvTGljZW5zZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoZSBsaWNlbnNlIHJlZ2lzdHJ5IGhvbGRzIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBsaWNlbnNlcyBhbmQgd2hldGhlciBvciBub3QgdGhleQotICogaGF2ZSBiZWVuIGFjY2VwdGVkLgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZVJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9VTlNQRUNJRklFRCA9IG5ldyBJbnRlZ2VyKDApOyAvLyBUaGlzIG5lZWRzIHRvIGJlIDAgZm9yIHRoZSBwbHVnaW4gcHJlZnMuCi0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0FHUkVFID0gbmV3IEludGVnZXIoMSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0RJU0FHUkVFID0gbmV3IEludGVnZXIoMik7Ci0gIC8vIFNpZ25pZmllcyBhIGxpY2Vuc2UgdGhhdCBoYXMgYmVlbiBkaXNhZ3JlZWQgdG8gdGhpcyBzZXNzaW9uLgotICBwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04gPSBuZXcgSW50ZWdlcigzKTsKLSAgCi0gIC8qKgotICAgKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgTGljZW5zZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGRvIG5vdCBwcm9tcHQgZmxhZyB3aWxsIHByZXZlbnQgdXNlciBwcm9tcHRpbmcuIFVzZWQgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIERPX05PVF9QUk9NUFQgPSBmYWxzZTsKLSAgCi0gIC8qKgotICAgKiBUaGUgbGljZW5zZXMgaGFzaHRhYmxlIGNvbnRhaW5zIGxpY2Vuc2VzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGV5J3ZlIGJlZW4gYWNjZXB0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGxpY2Vuc2VzOwotICAKLSAgcHJvdGVjdGVkIExpY2Vuc2VSZWdpc3RyeSgpCi0gIHsKLQlsaWNlbnNlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkKLQkvLyBJZiB0aGUgd3RwIHF1aWV0IHN5c3RlbSBwcm9wZXJ0eSBpcyBzZXQgdGhlIERPX05PVF9QUk9NUFQgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4KLQkvLyBUaGlzIGlzIHVzZWQgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgotCWlmKFN5c3RlbS5nZXRQcm9wZXJ0eShDYWNoZU1lc3NhZ2VzLldUUF9OT19VU0VSX0lOVEVSQUNUSU9OX1NZU1RFTV9QUk9QLCAiZmFsc2UiKS5lcXVhbHMoInRydWUiKSkKLQl7Ci0JICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBDYWNoZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENhY2hlTWVzc2FnZXMuX0xPR19JTkZPX1dUUF9OT19VU0VSX0lOVEVSQUNUSU9OLCBuZXcgT2JqZWN0W117Q2FjaGVNZXNzYWdlcy5XVFBfTk9fVVNFUl9JTlRFUkFDVElPTl9TWVNURU1fUFJPUH0pLCBudWxsKSk7Ci0JICBET19OT1RfUFJPTVBUID0gdHJ1ZTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbGljZW5zZSByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGljZW5zZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotCWlmKGluc3RhbmNlID09IG51bGwpCi0JewotCSAgaW5zdGFuY2UgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5KCk7Ci0JfQotCXJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UgdG8gdGhlIGxpY2Vuc2UgcmVnaXN0cnkuIEEgbGljZW5zZSBjYW4gb25seSBiZSBhZGRlZCB0byB0aGUKLSAgICogcmVnaXN0cnkgb25jZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhZGQgdG8gdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYodXJsICE9IG51bGwgJiYgIWxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9VTlNQRUNJRklFRCk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogQWdyZWUgdG8gdGhlIHNwZWNpZmllZCBsaWNlbnNlLiBUaGUgbGljZW5zZSBpcyBhZ3JlZWQgdG8gb25seSBpZiBpdCBoYXMgYWxyZWFkeQotICAgKiBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2UgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpCi0gIHsKLQlpZihsaWNlbnNlcy5jb250YWluc0tleSh1cmwpKQotCXsKLQkgIGxpY2Vuc2VzLnB1dCh1cmwsIExJQ0VOU0VfQUdSRUUpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIERpc2FncmVlIHRvIHRoZSBzcGVjaWZpZWQgbGljZW5zZS4gVGhlIGxpY2Vuc2UgaXMgZGlzYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHRvIGFjY2VwdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRpc2FncmVlTGljZW5zZShTdHJpbmcgdXJsKQotICB7Ci0JaWYobGljZW5zZXMuY29udGFpbnNLZXkodXJsKSkKLQl7Ci0JICBsaWNlbnNlcy5wdXQodXJsLCBMSUNFTlNFX0RJU0FHUkVFKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEaXNhZ3JlZSB0byB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UgZm9yIHRoaXMgc2Vzc2lvbi4gVGhlIGxpY2Vuc2UgaXMgZGlzYWdyZWVkIHRvIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkKLSAgICogYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LiAKLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBhY2NlcHQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZGlzYWdyZWVMaWNlbnNlVGhpc1Nlc3Npb24oU3RyaW5nIHVybCkKLSAgewotCWlmKGxpY2Vuc2VzLmNvbnRhaW5zS2V5KHVybCkpCi0JewotCSAgbGljZW5zZXMucHV0KHVybCwgTElDRU5TRV9ESVNBR1JFRV9USElTX1NFU1NJT04pOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgbGljZW5zZSBoYXMgYmVlbiBhY2NlcHRlZC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgbGljZW5zZQotICAgKiBoYXMgYmVlbiBhY2NlcHRlZCBvciBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdpc3RyeSBhbmQgZmFsc2UgaWYgaXQgaGFzIG5vdCBiZWVuIGFjY2VwdGVkLiAKLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHdlIGFyZSBjaGVja2luZyB0aGUgbGljZW5zZS4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0aGF0IHNob3VsZCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCBoYXMgYmVlbiBhY2NlcHRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsaWNlbnNlIGhhcyBiZWVuIGFjY2VwdGVkIG9yIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIHJlZ2lzdHJ5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNMaWNlbnNlQmVlbkFjY2VwdGVkKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKQotICB7Ci0JaWYoRE9fTk9UX1BST01QVCkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JaWYobGljZW5zZXMuY29udGFpbnNLZXkobGljZW5zZVVSTCkpCi0JewotCSAgSW50ZWdlciBhZ3JlZWQgPSAoSW50ZWdlcilsaWNlbnNlcy5nZXQobGljZW5zZVVSTCk7Ci0JICBpZihhZ3JlZWQgPT0gTElDRU5TRV9BR1JFRSkKLQkgIHsKLQkJcmV0dXJuIHRydWU7Ci0JICB9Ci0JICBlbHNlIGlmKGFncmVlZCA9PSBMSUNFTlNFX0RJU0FHUkVFKQotCSAgewotCQlpZighQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNob3VsZFByb21wdCgpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJbGljZW5zZXMucHV0KGxpY2Vuc2VVUkwsIExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKTsKLQkgIH0KLQkgIC8vIFRoZSBsaWNlbnNlIGhhcyBhbHJlYWR5IGJlZW4gZGlzYWdyZWVkIHRvIHRoaXMgc2Vzc2lvbi4gRG8gbm90IHByb21wdC4KLQkgIGVsc2UgaWYoYWdyZWVkID09IExJQ0VOU0VfRElTQUdSRUVfVEhJU19TRVNTSU9OKQotCSAgewotCQlyZXR1cm4gZmFsc2U7Ci0JICB9Ci0JCSAgCi0JICAKLQkgIC8vIFByb21wdCB0aGUgdXNlciB0byBhY2NlcHQgdGhlIGxpY2Vuc2UuCi0JICBpbnQgbGljZW5zZUFjY2VwdGFuY2UgPSBwcm9tcHRUb0FjY2VwdExpY2Vuc2UodXJsLCBsaWNlbnNlVVJMKTsKLQkgIGlmKGxpY2Vuc2VBY2NlcHRhbmNlID09IEFjY2VwdGVkLkFDQ0VQVEVEKQotCSAgewotCQlhZ3JlZUxpY2Vuc2UobGljZW5zZVVSTCk7Ci0JCXJldHVybiB0cnVlOwotCSAgfQotCSAgZWxzZSBpZihsaWNlbnNlQWNjZXB0YW5jZSA9PSBBY2NlcHRlZC5OT1RfQUNDRVBURUQpCi0JICB7Ci0JICAgIGRpc2FncmVlTGljZW5zZVRoaXNTZXNzaW9uKGxpY2Vuc2VVUkwpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIFRoZSBsaWNlbnNlIGlzIG5vdCByZWdpc3RyZWQgd2l0aCB0aGUgcmVnaXN0cnkuCi0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm9tcHQgdGhlIHVzZXIgdG8gYWNjZXB0IHRoZSBsaWNlbnNlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgTGljZW5zZUFjY2VwdGFuY2VEaWFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIGZvciB3aGljaCB0aGUgbGljZW5zZSBuZWVkcyB0byBiZSBhY2NlcHRlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2VVUkwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZSB0byBiZSBhY2NlcHRlZC4gCi0gICAqIEByZXR1cm4gMCBpZiBhY2NlcHRlZCwgMSBpZiBub3QgYWNjZXB0ZWQsIDIgaWYgbm90IGFibGUgdG8gYWNjZXB0LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBwcm9tcHRUb0FjY2VwdExpY2Vuc2UoZmluYWwgU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIGxpY2Vuc2VVUkwpIAotICB7Ci0JZmluYWwgQWNjZXB0ZWQgYWNjZXB0ZWQgPSBuZXcgQWNjZXB0ZWQoKTsKLQkgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJICBpZihMaWNlbnNlQWNjZXB0YW5jZURpYWxvZy5wcm9tcHRGb3JMaWNlbnNlKG51bGwsIHVybCwgbGljZW5zZVVSTCkpCi0JCQkJICB7Ci0JCQkJCWFjY2VwdGVkLmFjY2VwdGVkID0gQWNjZXB0ZWQuQUNDRVBURUQ7Ci0JCQkJICB9Ci0JCQkJICBlbHNlCi0JCQkJICB7Ci0JCQkJCWFjY2VwdGVkLmFjY2VwdGVkID0gQWNjZXB0ZWQuTk9UX0FDQ0VQVEVEOwotCQkJCSAgfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJICBhY2NlcHRlZC5hY2NlcHRlZCA9IEFjY2VwdGVkLk5PVF9ERVRFUk1JTkVEOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JcmV0dXJuIGFjY2VwdGVkLmFjY2VwdGVkOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBsaWNlbnNlcyBpbiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIEFzIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBsaWNlbnNlcyBpbiB0aGUgcmVnaXN0cnkuIAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldExpY2Vuc2VzKCkKLSAgewotCXJldHVybiAoU3RyaW5nW10pbGljZW5zZXMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW2xpY2Vuc2VzLmtleVNldCgpLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgbGljZW5zZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgbGljZW5zZS4KLSAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgSW50ZWdlciBnZXRMaWNlbnNlU3RhdGUoU3RyaW5nIHVybCkKLSAgewotCXJldHVybiAoSW50ZWdlcilsaWNlbnNlcy5nZXQodXJsKTsKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBBIGNsYXNzIHRvIGhvbGQgYWNjZXB0YW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb21wdCBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIEFjY2VwdGVkCi0gIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFUFRFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0FDQ0VQVEVEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfREVURVJNSU5FRCA9IDI7Ci0JcHVibGljIGludCBhY2NlcHRlZCA9IE5PVF9BQ0NFUFRFRDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNjViMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIFRvQ2FjaGVSZWdpc3RyeVJlYWRlcnMgcmVhZHMgRWNsaXBzZSBleHRlbnNpb25zIHdoaWNoIHNwZWNpZnkKLSAqIHJlc291cmNlcyB0byBjYWNoZS4gQW4gZXh0ZW5zaW9uIHBvaW50IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZy4KLSAqIAotICogIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5jYWNoZXJlc291cmNlIj4KLSAqICAgIDxjYWNoZXJlc291cmNlIHVyaT0iVVJJX1RPX0NBQ0hFIiBsaWNlbnNlPSJVUklfT0ZfTElDRU5TRSIvPgotICogIDwvZXh0ZW5zaW9uPiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjYWNoZXJlc291cmNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSTCA9ICJ1cmwiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTElDRU5TRSA9ICJsaWNlbnNlIjsKLSAKLSAgcHJpdmF0ZSBzdGF0aWMgVG9DYWNoZVJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5UmVhZGVyID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlc1RvQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkgcmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYocmVnaXN0cnlSZWFkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWdpc3RyeVJlYWRlciA9IG5ldyBUb0NhY2hlUmVnaXN0cnlSZWFkZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5UmVhZGVyOwotICB9Ci0gIC8qKgotICAgKiBSZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBoYW5kbGUgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgdGhhdCBtYXRjaAotICAgKiB0aGUgc3BlZGlmaWVkIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBUb0NhY2hlUmVzb3VyY2UgdG9DYWNoZVJlc291cmNlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgICBpZih0b0NhY2hlUmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc291cmNlc1RvQ2FjaGUucHV0KHRvQ2FjaGVSZXNvdXJjZS5nZXRVUkwoKSwgdG9DYWNoZVJlc291cmNlKTsKLSAgICAgICAgICBMaWNlbnNlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5hZGRMaWNlbnNlKHRvQ2FjaGVSZXNvdXJjZS5nZXRMaWNlbnNlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGFuZCBkZWFsIHdpdGggdGhlIGV4dGVuc2lvbiBwb2ludHMuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZXh0ZW5zaW9uIHBvaW50IGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgVG9DYWNoZVJlc291cmNlIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0JCi0gICAgaWYoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVYVEVOU0lPTl9QT0lOVF9JRCkpCi0gICAgewotICAgICAgU3RyaW5nIHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9VUkwpOwotICAgICAgaWYodXJsICE9IG51bGwpCi0gICAgICB7Ci0gICAgCVN0cmluZyBsaWNlbnNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xJQ0VOU0UpOwotICAgIAkKLSAgICAJLy8gSWYgdGhlIGxpY2Vuc2UgaXMgcmVsYXRpdmUgcmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUKLSAgICAJLy8gcGx1Zy1pbiB0aGF0IGRlY2xhcmVzIGl0LgotICAgIAl0cnkKLSAgICAJewotICAgIAkgIFVSSSBsaWNlbnNlVVJJID0gbmV3IFVSSShsaWNlbnNlKTsKLSAgICAJICBpZighbGljZW5zZVVSSS5pc0Fic29sdXRlKCkpCi0gICAgCSAgewotICAgIAkJQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLSAgICAJCVVSTCBsaWNlbnNlVVJMID0gcGx1Z2luQnVuZGxlLmdldEVudHJ5KGxpY2Vuc2UpOwotICAgIAkJaWYobGljZW5zZVVSTCAhPSBudWxsKQotICAgIAkJewotICAgIAkgICAgICBsaWNlbnNlID0gRmlsZUxvY2F0b3IucmVzb2x2ZShsaWNlbnNlVVJMKS50b0V4dGVybmFsRm9ybSgpOyAgCi0gICAgCQl9Ci0gICAgCSAgfQotICAgIAl9Ci0gICAgCWNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCSAgLy8gVXNlIHRoZSBsaWNlbnNlIGFzIHNwZWNpZmllZC4KLSAgICAJfQotICAgIAljYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCSAgLy8gVXNlIHRoZSBsaWNlbnNlIGFzIHNwZWNpZmllZC4KLSAgICAJfQotICAgIAlyZXR1cm4gbmV3IFRvQ2FjaGVSZXNvdXJjZSh1cmwsIGxpY2Vuc2UpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBVUklzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgY2FjaGluZy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgVVJJcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIGNhY2hpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VVJJc1RvQ2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlyZXNvdXJjZXNUb0NhY2hlLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tyZXNvdXJjZXNUb0NhY2hlLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZXNvdXJjZSB0byBjYWNoZSBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBjYWNoZS4KLSAgICogQHJldHVybiBBIFRvQ2FjaGVSZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkwgb3IgbnVsbCBpZiBub25lIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBUb0NhY2hlUmVzb3VyY2UgZ2V0UmVzb3VyY2VUb0NhY2hlKFN0cmluZyB1cmwpCi0gIHsKLQlyZXR1cm4gKFRvQ2FjaGVSZXNvdXJjZSlyZXNvdXJjZXNUb0NhY2hlLmdldCh1cmwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9Ub0NhY2hlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2Nzc4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL1RvQ2FjaGVSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLS8qKgotICogQSByZXNvdXJjZSB0aGF0IGlzIHNwZWNpZmllZCB0byBiZSBjYWNoZWQuIFRoZSByZXNvdXJjZSBoYXMgYSBVUkwgYW5kIGFuIG9wdGlvbmFsCi0gKiBsaWNlbnNlLgotICovCi1wdWJsaWMgY2xhc3MgVG9DYWNoZVJlc291cmNlIAotewotICBwcml2YXRlIFN0cmluZyB1cmw7Ci0gIHByaXZhdGUgU3RyaW5nIGxpY2Vuc2U7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogQHBhcmFtIGxpY2Vuc2UgVGhlIFVSTCBvZiB0aGUgb3B0aW9uYWwgbGljZW5zZSBmb3IgdGhpcyByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBUb0NhY2hlUmVzb3VyY2UoU3RyaW5nIHVybCwgU3RyaW5nIGxpY2Vuc2UpCi0gIHsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmxpY2Vuc2UgPSBsaWNlbnNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY2FjaGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0JcmV0dXJuIHVybDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGljZW5zZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNhY2hlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpY2Vuc2UgVVJMIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjYWNoZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoKQotICB7Ci0JcmV0dXJuIGxpY2Vuc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ2FjaGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DYWNoZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzk2NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DYWNoZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuQ2FjaGVQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQgaXMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiBQcmVmZXJlbmNlcyBkaWFsb2cuIFRoaXMgcGFnZSBjb250YWlucyBvcHRpb25zIGZvciB0aGUgY2FjaGUuIFRoZSBjYWNoZSBjYW4KLSAqIGJlIGRpc2FibGVkLCB0aGUgbGlzdCBvZiBlbnRyaWVzIGluIHRoZSBjYWNoZSBjYW4gYmUgdmlld2VkLCBhbmQgaW5kaXZpZHVhbAotICogZW50cmllcyBvciB0aGUgZW50aXJlIGNhY2hlIGNhbiBiZSBkZWxldGVkLgotICovCi0KLXB1YmxpYyBjbGFzcyBDYWNoZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotICBwcm90ZWN0ZWQgQnV0dG9uIGNsZWFyQnV0dG9uOwotCi0gIHByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCi0gIHByb3RlY3RlZCBCdXR0b24gZW5hYmxlZEJ1dHRvbjsKLSAgCi0gIHByb3RlY3RlZCBCdXR0b24gZGlzYWdyZWVkTGljZW5zZXNCdXR0b247Ci0KLSAgcHJvdGVjdGVkIExpc3QgZW50cmllczsKLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBDYWNoZVByZWZlcmVuY2VQYWdlKCkKLSAgewotICAgIHNldFByZWZlcmVuY2VTdG9yZShDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIG5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLSAgICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0gICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgCi0gICAgTGFiZWwgYWJvdXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBhYm91dExhYmVsLnNldFRleHQoQ2FjaGVNZXNzYWdlcy5fVUlfUFJFRl9DQUNIRV9BQk9VVCk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBhYm91dExhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5Ob25lKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGVkIHRoZSBkaXNhYmxlIGNhY2hlIG9wdGlvbi4KLSAgICAgIGVuYWJsZWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZW5hYmxlZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGVuYWJsZWRCdXR0b24uc2V0VGV4dChDYWNoZU1lc3NhZ2VzLl9VSV9QUkVGX0NBQ0hFX0NBQ0hFX09QVElPTik7Ci0gICAgICBlbmFibGVkQnV0dG9uLnNldFNlbGVjdGlvbighQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0gICAgICAgICAgLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9FTkFCTEVEKSk7Ci0gICAgICBlbmFibGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSBlbmFibGVkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQoIWRpc2FibGVkKTsKLSAgICAgICAgfQotCi0gICAgICB9KTsKLSAgICAgIAotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfUFJPTVBUX0ZPUl9ESVNBR1JFRURfTElDRU5TRVMpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uc2V0U2VsZWN0aW9uKENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotICAgICAgICAgIC5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJPTVBUX0RJU0FHUkVFRF9MSUNFTlNFUykpOwotICAgICAgZGlzYWdyZWVkTGljZW5zZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBwcm9tcHQgPSBkaXNhZ3JlZWRMaWNlbnNlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0UHJvbXB0RGlzYWdyZWVkTGljZW5zZXMocHJvbXB0KTsKLSAgICAgICAgfQotCi0gICAgICB9KTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBlbnRpdGllcyBncm91cC4KLSAgICAgIExhYmVsIGVudHJpZXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgIGVudHJpZXNMYWJlbC5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX1BSRUZfQ0FDSEVfRU5UUklFU19USVRMRSk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICBlbnRyaWVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgIGVudHJpZXMgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlbnRyaWVzLAotICAgICAgICAgIENvbnRleHRJZHMuUFJFRl9FTlRSSUVTKTsKLSAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVkVVJJcygpOwotICAgICAgQXJyYXlzLnNvcnQoY2FjaGVFbnRyaWVzKTsKLSAgICAgIGVudHJpZXMuc2V0SXRlbXMoY2FjaGVFbnRyaWVzKTsKLSAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGVudHJpZXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBlbnRyaWVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0gICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBTV1QuVE9QKTsKLSAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIC8vIENyZWF0ZSB0aGUgRGVsZXRlIGJ1dHRvbgotICAgICAgZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0JVVFRPTl9ERUxFVEVfRU5UUlkpOwotICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZwotICAgICAgICAgICAgICAub3BlbkNvbmZpcm0oCi0gICAgICAgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9ERUxFVEVfQ0FDSEVfRU5UUllfRElBTE9HX01FU1NBR0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGVkRW50cmllcyA9IGVudHJpZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgbnVtU2VsZWN0ZWRFbnRyaWVzID0gc2VsZWN0ZWRFbnRyaWVzLmxlbmd0aDsKLQotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TZWxlY3RlZEVudHJpZXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlRW50cnkoc2VsZWN0ZWRFbnRyaWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IGNhY2hlLmdldENhY2hlZFVSSXMoKTsKLSAgICAgICAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgQ2xlYXIgQ2FjaGUgYnV0dG9uCi0gICAgICBjbGVhckJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICBjbGVhckJ1dHRvbi5zZXRUZXh0KENhY2hlTWVzc2FnZXMuX1VJX0JVVFRPTl9DTEVBUl9DQUNIRSk7Ci0gICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBjbGVhckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgIGNsZWFyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLAotICAgICAgICAgICAgICBDYWNoZU1lc3NhZ2VzLl9VSV9DT05GSVJNX0NMRUFSX0NBQ0hFX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgQ2FjaGVNZXNzYWdlcy5fVUlfQ09ORklSTV9DTEVBUl9DQUNIRV9ESUFMT0dfTUVTU0FHRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBDYWNoZS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNhY2hlRW50cmllcyA9IGNhY2hlLmdldENhY2hlZFVSSXMoKTsKLSAgICAgICAgICAgIEFycmF5cy5zb3J0KGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBlbnRyaWVzLnNldEl0ZW1zKGNhY2hlRW50cmllcyk7Ci0gICAgICAgICAgICBzZXRQcmVmZXJlbmNlV2lkZ2V0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAgIC8vVE9ETzogTG9nIGVycm9yCi0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHNldFByZWZlcmVuY2VXaWRnZXRzKCk7Ci0gICAgYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcHJlZmVyZW5jZSBwYWdlIHdpZGdldHMuIFRoZXJlIGFyZSBhIGZldyBydWxlcy4gMS4gSWYgZGlzYWJsZWQsIGFsbAotICAgKiBvZiB0aGUgd2lkZ2V0cyBhcmUgZGlhYmxlZCBleGNlcHQgZm9yIHRoZSBkaXNhYmxlZCBjaGVjayBib3guIDIuIElmCi0gICAqIGVuYWJsZWQsIGFsbCB3aWRnZXRzIGFyZSBlbmFibGVkIGV4Y2VwdCBhLiBUaGUgZGVsZXRlIGJ1dHRvbiBpcyBlbmFibGVkCi0gICAqIG9ubHkgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdGhlIGxpc3QuIGIuIFRoZSBjbGVhciBidXR0b24gaXMgZW5hYmxlZAotICAgKiBvbmx5IGlmIHRoZXJlIGFyZSBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VXaWRnZXRzKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCAmJiBjb21wb3NpdGUuZ2V0RW5hYmxlZCgpKQotICAgIHsKLSAgICAgIGlmIChlbnRyaWVzLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbnRyaWVzLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgY2xlYXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNsZWFyQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdldENvbnRyb2woKSwgQ29udGV4dElkcy5QUkVGKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5Y2FmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIENvbnN0YW50IGlkcyBmb3IgY29udGV4dCBoZWxwLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUYgPSBDYWNoZVBsdWdpbi5QTFVHSU5fSUQgKyAiLmNwcjAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRU5UUklFUyA9IENhY2hlUGx1Z2luLlBMVUdJTl9JRCArICIuY3ByMDAwMiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxYzRhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHBsdWctaW4gcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VOQUJMRUQgPSAiY2FjaGVFbmFibGVkIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01QVF9ESVNBR1JFRURfTElDRU5TRVMgPSAicHJvbXB0RGlzYWdyZWVkTGljZW5zZXMiOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjRhZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlUGx1Z2luOwotCi0vKioKLSAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgCi17Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSAKLSAgewotCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBDYWNoZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0VOQUJMRUQsIHRydWUpOwotICAgIHN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9NUFRfRElTQUdSRUVEX0xJQ0VOU0VTLCBmYWxzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNGJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZhbGlkYXRldWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlmOGY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1ydW50aW1lCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NzFmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwNmFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMDggMDk6MjQ6NTYgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1M2I4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSNGcmkgRmViIDIzIDAwOjA3OjUwIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWQ4M2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIE1hciAyOSAwNDowOToxMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4YzRkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zd3Q7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZGIzNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDM2YjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHZhbGlkYXRldWkvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM4ZjZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DT05UQUNUPXJ1dGhkYWx5QGNhLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT12YWxpZGF0aW9udWkKLUNvbXBvbmVudEZ1bGxOYW1lPVZhbGlkYXRpb24gRnJhbWV3b3JrIFVJCi1Db21wb25lbnRDb21wZXRlbmN5PVZhbGlkYXRpb24KLUphdmFDb21waWxlLjE9c3JjamFyCi1CdWlsZFZlcmlmaWNhdGlvbi4xPWRpcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWUwYzMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnVpIiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udWkiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS92YWxpZGF0ZXVpLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkL3NvdXJjZWphci50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkL3NvdXJjZWphci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmY0MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9idWlsZC9zb3VyY2VqYXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFsaWRhdGV1aQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9idWlsZC93c0J1aWxkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzBiODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSIke2RlZmF1bHRqYXJuYW1lfSIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofSIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkOWIwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL2ZhaWxfdGJsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmxfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibF9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzMzYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibF9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL29rX3RibC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWNiOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmxfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmxfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg5MDBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5ncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOTlhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5ncy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2ljb25zL3NldHRpbmdzX2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3NfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE2NmRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3NfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDEyZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBWZXJzaW9uIDEuMwotIwotVkJGX1RJVExFX1BST1BFUlRJRVM9VmFsaWRhdGlvbgotVkJGX1VJX1BPUFVQX1JVTlZBTElEQVRJT049VmFsaWRhdGUKLVZCRl9USVRMRV9QUkVGRVJFTkNFPVZhbGlkYXRpb24KLQotQnVuZGxlLU5hbWUuMCA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIFVJCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGE2NWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFBvcHVwIENvbnRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEJ5IHNheWluZyAiYWRhcHRhYmxlPXRydWUiLCB0aGlzIGl0ZW0gd2lsbCBhcHBlYXIgb24gYm90aCBJUHJvamVjdCBhbmQgSUphdmFQcm9qZWN0IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJWYWxpZGF0aW9uTWVudUFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVZCRl9VSV9QT1BVUF9SVU5WQUxJREFUSU9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLlZhbGlkYXRpb25NZW51QWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICAgICBpZD0iVmFsaWRhdGlvbkFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gIAotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIFZhbGlkYXRpb24gcHJlZmVyZW5jZSBwYWdlICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlVkJGX1RJVExFX1BSRUZFUkVOQ0UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgICAgICAgICBWYWxpZGF0aW9uIHByb3BlcnRpZXMgcGFnZSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBCeSBzYXlpbmcgImFkYXB0YWJsZT10cnVlIiwgdGhpcyBpdGVtIHdpbGwgYXBwZWFyIG9uIGJvdGggSVByb2plY3QgYW5kIElKYXZhUHJvamVjdCAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlVkJGX1RJVExFX1BST1BFUlRJRVMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlIgotICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSI+Ci0gICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0JICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0gICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2UyNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udWkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KLQkJCi0JCi0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KLQkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KLQkKLQkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KLQkJCi0JCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlcyIgPgotCQkJIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW5kaXJ9L3Byb3BlcnR5X2ZpbGVzIj4KLSAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gIAkJCSA8L2ZpbGVzZXQ+Ci0gIAkJPC9jb3B5PgotICAJCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV91aS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzJhN2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvdmFsaWRhdGVfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogQ29kZSBvcmllbnRlZCBpbnN0cnVjdGlvbnM6Ci0jICAgICAqCi0jICAgICAqIEluIHRoZSBzdHJpbmcsIHlvdSBtYXkgc2VlIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBzZXF1ZW5jZXM6Ci0jICAgICAqIGEpIHtufSAgd2hlcmUgbiBpcyBhIG51bWJlci4gVGhlc2UgYXJlIHJlcGxhY2VhYmxlIHBhcmFtZXRlcnMuCi0jICAgICAqIGIpICcnICBJbiAucHJvcGVydGllcyBmaWxlcywgaW4gb3JkZXIgdG8gc2VlIG9uZSBhcG9zdHJvcGhlICgnKSBpbiB0aGUgZmluYWwKLSMgICAgICogICAgc3RyaW5nLCBzb21ldGltZXMgdHdvIGFwb3N0cm9waGVzIG11c3QgYmUgZW50ZXJlZCBpbiB0aGUgc3RyaW5nLiBJbiB0aGUgdHJhbnNsYXRlZAotIyAgICAgKiAgICBzdHJpbmcsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB7bn0gaW4gdGhlIHN0cmluZywgdGhlbiB0byBzaG93IG9uZSBhcG9zdHJvcGhlCi0jICAgICAqICAgIHRvIHRoZSB1c2VyLCBwdXQgdHdvIGFwb3N0cm9waGVzIGluIHRoZSBzdHJpbmcuIElmIHRoZXJlIGFyZSBubyB7bn0gaW4gdGhlIHN0cmluZywKLSMgICAgICogICAgdGhlbiBwdXQgb25lIGFwb3N0cm9waGUuCi0jICAgICAqICAgIEZvciBleGFtcGxlLCBzYXkgdGhhdCB5b3Ugd2FudCB0aGUgdXNlciB0byByZWFkICJHZW9yZ2UncyBmaWxlIi4gCi0jICAgICAqICAgICAgICBHRU9SR0U9R2VvcmdlJ3MgZmlsZSB3YXMgb24gdGhlIGRlc2suCi0jICAgICAqICAgICAgICBHRU9SR0UyPUdlb3JnZScncyBmaWxlIGFuZCB7MH0gd2VyZSBvbiB0aGUgZGVzay4KLSMgICAgICogICAgR0VPUkdFIHVzZXMgb25lIGFwb3N0cm9waGUgYmVjYXVzZSB0aGVyZSBhcmUgbm8ge259IGFuZCBHRU9SR0UyCi0jICAgICAqICAgIHVzZXMgdHdvIGFwb3N0cm9waGVzIGJlY2F1c2UgdGhlcmUgaXMgYSB7bn0uCi0jICAgICAqIGMpICcnIHRleHQgJycgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGRvdWJsZQotIyAgICAgKiAgICBhcG9zdHJvcGhlcyBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuIAotIyAgICAgKiBkKSA8dGV4dD4gd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIGFuZ2xlCi0jICAgICAqICAgIGJyYWNrZXRzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogZSkgInRleHQiIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBxdW90YXRpb24gCi0jICAgICAqICAgIG1hcmtzIHNob3VsZCBOT1QgYmUgdHJhbnNsYXRlZC4KLSMgICAgICogICAgCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICAqIE90aGVyIGluc3RydWN0aW9ucwotIyAgICAgKiBhKSBEbyBub3QgdHJhbnNsYXRlIGFueSB0ZXh0IHRoYXQgaXMgb24gYSBsaW5lIHdoaWNoIGJlZ2lucyB3aXRoIGEgY29tbWVudCAKLSMgICAgICogICAgc3ltYm9sICgjKS4KLSMgICAgICogYikgRG8gbm90IHRyYW5zbGF0ZSB0aGVzZSB3b3JkczogCi0jICAgICAqICAgICAgICBzY2hlbWEsIEVKQiwgUkRCLCBKQVIsIFJNSSwgQk1QLCBDTVAsIE9PU1FMCi0jICAgICAqIGMpIFBsZWFzZSByZXR1cm4gdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHVzaW5nIHRoZSBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0jICAgICAqICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdHdvIG9mIHRoZSBmaWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUuCi0jICAgICAqCi0jICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIEFueSBvdGhlciBjb21tZW50cyB0byB0aGUgdHJhbnNsYXRvcnMgYXJlIG9uIGxpbmVzIHdoaWNoIHN0YXJ0IGxpa2UgdGhpczogICMgMlRDOgotIwotIyBWZXJzaW9uIDEuMTIKLSMKLSMKLSMgSUQ6Ci0jICAgIFZCRiAtIFZhbGlkYXRpb24gQnVpbGRlciBGcmFtZXdvcmsKLSMKLQotIyAKLSMgQmVnaW4gVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yayBVSSBTdHJpbmdzCi0jCi0jIElEczoKLSMgICAgVkJGX0VYQz1FeGNlcHRpb24gb3IgZXJyb3IgdGV4dAotIyAgICBWQkZfVUk9VUkgbGFiZWwKLSMKLVBSRUZfQlVUVE9OX09WRVJSSURFPUFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3MKLVBSRUZfQlVUVE9OX0ZVTEw9UnVuIHZhbGlkYXRpb24gd2hlbiB5b3UgbWFudWFsbHkgYnVpbGQgYSBwcm9qZWN0Ci1QUkVGX0JVVFRPTl9BVVRPPVJ1biB2YWxpZGF0aW9uIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZSBjaGFuZ2VzIHRvIGEgcmVzb3VyY2UKLVBSRUZfQlVUVE9OX0VOQUJMRUFMTD1FbmFibGUgQWxsCi1QUkVGX0JVVFRPTl9ESVNBQkxFQUxMPURpc2FibGUgQWxsCi1QUkVGX1ZBTExJU1RfVElUTEU9VGhlIHNlbGVjdGVkIHZhbGlkYXRvcnMgd2lsbCBydW4gd2hlbiB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZDoKLVBSRUZfTEJMX01BWE1TR1M9TWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcyBvbiBhIHByb2plY3QKLVBSRUZfRVJST1JfSU5UPUlXQUUwMDAxRSBUaGUgbnVtYmVyIG9mIHZhbGlkYXRpb24gbWVzc2FnZXMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1QUkVGX0JVVFRPTl9BU1lOQz1SdW4gdmFsaWRhdGlvbiBpbiBhIGJhY2tncm91bmQgdGhyZWFkCi1QUkVGX01OVV9NQU5VQUw9Jk1hbnVhbAotUFJFRl9NTlVfQlVJTEQ9JkJ1aWxkCi1QUkVGX01OVV9TRVRUSU5HUz0mU2V0dGluZ3MuLi4KLQotUFJPUF9CVVRUT05fT1ZFUlJJREU9T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotUFJPUF9CVVRUT05fRlVMTD1SdW4gdmFsaWRhdGlvbiB3aGVuIHlvdSBtYW51YWxseSBidWlsZCB7MH0KLVZCRl9VSV9MQkxfQVVUT19WQUxJREFURT1SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUgY2hhbmdlcyB0byB7MH0gcmVzb3VyY2VzLgotUFJPUF9CVVRUT05fU0VMRUNUQUxMPVNlbGVjdCBBbGwKLVBST1BfQlVUVE9OX0RFU0VMRUNUQUxMPURlc2VsZWN0IEFsbAotVkJGX1VJX0xCTF9ERVNDPVRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzIHdpbGwgcnVuIHdoZW4gezB9IGlzIHZhbGlkYXRlZDoKLVBST1BfTEJMX01BWE1TU0dTPU1heGltdW0gbnVtYmVyIG9mIHZhbGlkYXRpb24gbWVzc2FnZXMgb24gezB9Ci1QUk9QX0VSUk9SX0lOVD1JV0FFMDAwMkUgVGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotUFJPUF9MQkxfQ0FOTk9UT1ZFUlJJREU9VG8gZW5hYmxlIHRoZSAiT3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyIgY2hlY2tib3gsIHNlbGVjdCB0aGUgIkFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZXNlIHByZWZlcmVuY2Ugc2V0dGluZ3MiIGNoZWNrYm94IGluIHRoZSB3b3JrYmVuY2ggUHJlZmVyZW5jZXMgZGlhbG9nLgotUFJPUF9CVVRUT05fQVNZTkM9UnVuIHZhbGlkYXRpb24gaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBvbiB7MH0KLQotVkJGX0VYQ19JTlRFUk5BTD1JV0FFMDAwM0UgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdmFsaWRhdGlvbi4gUmVhZCB0aGUgbG9nIGZpbGUuCi1WQkZfRVhDX0lOVEVSTkFMX1BST0pFQ1Q9SVdBRTAwMDRFIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHZhbGlkYXRpb24gb2YgcHJvamVjdCB7MH0uIFJlYWQgdGhlIGxvZyBmaWxlLgotVkJGX0VYQ19JTlRFUk5BTF9USVRMRT1JV0FFMDAwNUUgSW50ZXJuYWwgZXJyb3IKLVZCRl9FWENfSU5URVJOQUxfUEFHRT1JV0FFMDAwNkUgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkOyBjbGljayBDYW5jZWwgdG8gY2xvc2UgdGhlIHdpemFyZC4KLQotVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSPUlXQUUwMDA3RSBWYWxpZGF0b3JzIGNhbiBydW4gb25seSBvbiBvcGVuIHJlc291cmNlcy4KLQotVkJGX1VJX05PX1ZBTElEQVRPUlNfSU5TVEFMTEVEPU5vIHZhbGlkYXRvcnMgYXJlIGluc3RhbGxlZC4KLQotVkJGX1VJX0xCTF9OT1ZBTElEQVRPUlNfREVTQz1JdCBpcyBub3QgcG9zc2libGUgdG8gcnVuIGFueSBWYWxpZGF0b3JzLCBhdCB0aGUgcHJvamVjdCBsZXZlbCwgZm9yIHRoaXMgdHlwZSBvZiBwcm9qZWN0LgotCi1WQkZfVUlfTk9fVkFMSURBVE9SU19FTkFCTEVEPUVuYWJsZSBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIG9uIHswfS4gVG8gc2VsZWN0IHRoZSB2YWxpZGF0b3JzIHRoYXQgeW91IHdhbnQgdG8gcnVuLCBvcGVuIHRoaXMgcHJvamVjdCcncyBQcm9wZXJ0aWVzIHdpemFyZCwgdHVybiB0byB0aGUgVmFsaWRhdGlvbiBzZWN0aW9uLCBhbmQgc2VsZWN0IG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgaW4gdGhlIGxpc3QuCi0KLVZCRl9VSV9DSEVDS0JPWEdST1VQX1RJVExFPVZhbGlkYXRvcnMKLQotVkJGX1VJX0NMT1NFRF9QUk9KRUNUPVZhbGlkYXRpb24gY2Fubm90IHJ1biBvbiBhIGNsb3NlZCBwcm9qZWN0LiBPcGVuIHByb2plY3QgezB9IGFuZCB0cnkgYWdhaW4uCi1WQkZfVUlfTVNTR0JPWF9USVRMRV9OT05JTkM9U29tZSBvZiB0aGUgVmFsaWRhdG9ycyBEbyBOb3QgU3VwcG9ydCBBdXRvbWF0aWMgVmFsaWRhdGlvbgotVkJGX1VJX0FVVE9fT05fTk9OSU5DPUFsdGhvdWdoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLCBzb21lIG9mIHRoZSB2YWxpZGF0b3JzIHdpbGwgbm90IGJlIGludm9rZWQgZHVyaW5nIHRoZSBhdXRvbWF0aWMgcHJvY2Vzc2luZy4gVGhlIGZvbGxvd2luZyB2YWxpZGF0b3JzIGRvIG5vdCBzdXBwb3J0IGF1dG9tYXRpYyB2YWxpZGF0aW9uOiB7MH0KLQotVkJGX1VJX1BSSk5FRURJTlBVVD1Qcm9qZWN0IHswfSBhbmQgaXRzIGNoaWxkcmVuIHdlcmUgbm90IHZhbGlkYXRlZCBiZWNhdXNlIG5vbmUgb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyB2YWxpZGF0ZXMgdGhhdCB0eXBlIG9mIHByb2plY3QuCi1WQkZfVUlfUkVTTkVFRElOUFVUPVJlc291cmNlIHswfSB3YXMgbm90IHZhbGlkYXRlZCBiZWNhdXNlIG5vbmUgb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyB2YWxpZGF0ZXMgdGhhdCB0eXBlIG9mIHJlc291cmNlLgotCi1WQkZfVUlfTUFYX1JFUE9SVEVEPVZhbGlkYXRpb24gd2FzIHRlcm1pbmF0ZWQgb24gezB9IGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHdlcmUgcmVwb3J0ZWQuCi1WQkZfVUlfUFJKVkFMSURBVEVEPVZhbGlkYXRpb24gb2YgcHJvamVjdCB7MH0gaXMgY29tcGxldGUuCi1WQkZfVUlfUkVTVkFMSURBVEVEPVZhbGlkYXRpb24gb2YgcmVzb3VyY2UgezB9IGlzIGNvbXBsZXRlLgotVkJGX1VJX0NBTkNFTExFRD1WYWxpZGF0aW9uIGNhbmNlbGxlZC4KLVZCRl9VSV9DT01QTEVURT1WYWxpZGF0aW9uIGNvbXBsZXRlZC4KLVZCRl9VSV9DTE9TRT1DbG9zZQotVkJGX1VJX1NUQVRVUz1TdGF0dXMKLVZCRl9VSV9SRVNDQU5DRUxMRUQ9VmFsaWRhdGlvbiB3YXMgY2FuY2VsbGVkIG9uIHswfS4KLURJU0FCTEVfVkFMSURBVElPTj1TdXNwZW5kIGFsbCB2YWxpZGF0b3JzCi1JTkZPPVRoaXMgcHJlZmVyZW5jZSBhcHBsaWVzIHRvIHRoZSBwcm9qZWN0cyB0aGF0IGhhdmUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdGlvbmJ1aWxkZXIgZGVmaW5lZC5WYWxpZGF0b3JzIGFyZSBydW4gb24gdGhlIHByb2plY3RzIGJhc2VkIG9uIHRoZSBmaWx0ZXJzIGRlZmluZWQgaW4gdGhlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciBleHRlbnNpb24gcG9pbnQuCi0KLURFTEVHQVRFU19ESUFMT0dfVElUTEU9VmFsaWRhdG9yIFByZWZlcmVuY2VzCi1ERUxFR0FURVNfQ09NQk9fTEFCRUw9SW1wbGVtZW50YXRpb246Ci1BRERfVkFMSURBVElPTl9CVUlMREVSPUFkZCBWYWxpZGF0aW9uIEJ1aWxkZXIgdG8gcHJvamVjdAotQ09ORklHX1dTX1NFVFRJTkdTPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KLVZBTElEQVRPUj1WYWxpZGF0b3IKLU1BTlVBTD1NYW51YWwKLUJVSUxEPUJ1aWxkCi1TRVRUSU5HUz1TZXR0aW5ncwotCi0jCi0jIEVuZCBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFVJIFN0cmluZ3MKLSMKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2U0ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gV1RQVUlQbHVnaW4uUExVR0lOX0lEOwotCi0JLy8gY29udGV4dCBpZHMgZm9yIHRoZSBWYWxpZGF0aW9uIFByb3BlcnRpZXMgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFID0gUFJFRklYICsgIi5qdnBwMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9PVkVSUklERSA9IFBSRUZJWCArICIuanZwcDAwMDEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQlVJTERfTk9WQUxTRUxFQ1RFRCA9IFBSRUZJWCArICIuanZwcDAwMDMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQVVUT19BVVRPQlVJTEQgPSBQUkVGSVggKyAiLmp2cHAwMDA0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX0FVVE9fTk9JTkNWQUxTRUxFQ1RFRCA9IFBSRUZJWCArICIuanZwcDAwMDUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQVVUT19OT0lOQ1ZBTENPTkZJRyA9IFBSRUZJWCArICIuanZwcDAwMDYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfQVVUT19FTkFCTEVEID0gUFJFRklYICsgIi5qdnBwMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEID0gUFJFRklYICsgIi5qdnBwMDAzMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEX0NBTk5PVF9IT05PVVJfQk9USCA9IFBSRUZJWCArICIuanZwcDAwMzEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfT1ZFUlJJREVfRU5BQkxFRF9DQU5OT1RfSE9OT1VSX0FVVE8gPSBQUkVGSVggKyAiLmp2cHAwMDMyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9NQU5VQUwgPSBQUkVGSVggKyAiLmp2cHAwMDMzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX1JFQlVJTERfRU5BQkxFRCA9IFBSRUZJWCArICIuanZwcDAwNDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfTUFYX01FU1NBR0VTID0gUFJFRklYICsgIi5qdnBwMDA1MCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFID0gUFJFRklYICsgIi5qdmdwMDAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9PVkVSUklERSA9IFBSRUZJWCArICIuanZncDAwMDUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfRElTQUJMRV9BTExfRU5BQkxFRCA9IFBSRUZJWCArICIuanZncDAwMTAiOyAvLyROT04tTkxTLTEkCi0JLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfUkVCVUlMRF9ESVNBQkxFRCA9IFBSRUZJWCArCi0JLy8gIi5qdmdwMDAxMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9BVVRPX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2Z3AwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRElTQUJMRURfQVVUT0JVSUxEID0gUFJFRklYICsKLQkvLyAiLmp2Z3AwMDIxIjsgLy8kTk9OLU5MUy0xJAotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRElTQUJMRURfTk9JTkNWQUxTRUxFQ1RFRCA9IFBSRUZJWAotCS8vICsgIi5qdmdwMDAyMiI7IC8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9BVVRPX0RJU0FCTEVEX05PSU5DVkFMQ09ORklHID0gUFJFRklYICsKLQkvLyAiLmp2Z3AwMDIzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX01BWF9NRVNTQUdFUyA9IFBSRUZJWCArICIuanZncDAwMzAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmNjZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0RlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotCi0vKioKLSAqIERpYWxvZyB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIHZhbGlkYXRvciBkZWxlZ2F0ZSBmcm9tIHRoZSBsaXN0IG9mCi0gKiByZWdpc3RlcmVkIGRlbGVnYXRlcyBmb3IgYSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotICAvKioKLSAgICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgZGVzY3JpcHRvci4KLSAgICovCi0gIHByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgZGVsZWdhdGluZ1ZhbGlkYXRvckRlc2NyaXB0b3I7Ci0KLSAgLyoqCi0gICAqIFRoZSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBkZWxlZ2F0ZUlEOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIHRoZSBkaWFsb2cgb24gdGhlIGdpdmVuIHNoZWxsLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgIHRoZSBkaWFsb2cncyBwYXJlbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBpZAotICAgKiAKLSAgICogQHBhcmFtIGRlbGVnYXRlSUQKLSAgICogICAgICAgICAgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgZGVsZWdhdGVJRCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLQotICAgIGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yID0gdm1kOwotICAgIHRoaXMuZGVsZWdhdGVJRCA9IGRlbGVnYXRlSUQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgZ2V0U2hlbGwoKS5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLkRFTEVHQVRFU19ESUFMT0dfVElUTEUpKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkRGF0YSBsYWJlbERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBsYWJlbERhdGEud2lkdGhIaW50ID0gMjUwOwotICAgIGxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLSAgICBTdHJpbmcgZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUgPSBkZWxlZ2F0aW5nVmFsaWRhdG9yRGVzY3JpcHRvci5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotICAgIGxhYmVsLnNldFRleHQoZGVsZWdhdGluZ1ZhbGlkYXRvck5hbWUpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBzZXBhcmF0b3JEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoc2VwYXJhdG9yRGF0YSk7Ci0KLSAgICBDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotICAgIEdyaWRMYXlvdXQgZ3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGdyb3VwTGF5b3V0KTsKLQotICAgIExhYmVsIGNvbWJvTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLSAgICBjb21ib0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgIGNvbWJvTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5ERUxFR0FURVNfQ09NQk9fTEFCRUwpKTsKLSAgICAKLSAgICBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhncm91cCwgU1dULlJFQURfT05MWSk7Ci0gICAgR3JpZERhdGEgY29tYm9HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgIGNvbWJvLnNldExheW91dERhdGEoY29tYm9HcmlkRGF0YSk7Ci0KLSAgICBmaW5hbCBDb21ib1ZpZXdlciBjb21ib1ZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21ibyk7Ci0gICAgY29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEZWxlZ2F0ZXNDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsZWdhdGVzTGFiZWxQcm92aWRlcigpKTsKLSAgICBTdHJpbmcgdGFyZ2V0SUQgPSBkZWxlZ2F0aW5nVmFsaWRhdG9yRGVzY3JpcHRvci5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0KLSAgICBjb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgIHsKLQotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgc2V0RGVsZWdhdGVJRCgoKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXRJZCgpKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGNvbWJvVmlld2VyLnNldElucHV0KHRhcmdldElEKTsKLQotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBzZWxlY3RlZCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcih0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0KLSAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgc2VsZWN0ZWQgfSkpOwotICAgIH0KLQotICAgIExhYmVsIGVuZFNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZW5kU2VwYXJhdG9yRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOyAKLSAgICBlbmRTZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShlbmRTZXBhcmF0b3JEYXRhKTsKLSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBjb250ZW50cyBmb3IgdGhlIGRlbGVnYXRlIHZhbGlkYXRvcnMgY29tYm8gYm94LgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBEZWxlZ2F0ZXNDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIFN0cmluZyB0YXJnZXRJRCA9IChTdHJpbmcpIGlucHV0RWxlbWVudDsKLSAgICAgIE1hcCBkZWxlZ2F0ZXNCeUlEID0gVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWxlZ2F0ZURlc2NyaXB0b3JzKHRhcmdldElEKTsKLSAgICAgIAotICAgICAgaWYgKGRlbGVnYXRlc0J5SUQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGRlbGVnYXRlc0J5SUQudmFsdWVzKCkudG9BcnJheSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGxhYmVscy9pbWFnZXMgZm9yIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IgY29tYm8gYm94Ci0gICAqIAotICAgKiBAYXV0aG9yIHZiYWNpdWwKLSAgICogCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGNsYXNzIERlbGVnYXRlc0xhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotICB7Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBQcm92aWRlcyB0aGUgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlbGVnYXRlSUQoKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlSUQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbGlkYXRvciBkZWxlZ2F0ZSBJRC4KLSAgICogCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlECi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0RGVsZWdhdGVJRChTdHJpbmcgZGVsZWdhdGVJRCkKLSAgewotICAgIHRoaXMuZGVsZWdhdGVJRCA9IGRlbGVnYXRlSUQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvTGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGI2ZDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9MaXN0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKiAKLSAqIEEgc3BlY2lhbGl6ZWQgY29udGVudCBwcm92aWRlciB0byBzaG93IGEgbGlzdCBvZiBlZGl0b3IgcGFydHMuCi0gKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5MaXN0Q29udGVudFByb3ZpZGVyCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgYSBnZW5lcmljIHNvbHV0aW9uIGlzIG1hZGUgYXZhaWxhYmxlLgotICovIAotcHVibGljIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JTGlzdCBmQ29udGVudHM7CQotCi0JcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dCkKLQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkgCi0JCQlmQ29udGVudHM9IChMaXN0KW5ld0lucHV0OwotCQllbHNlCi0JCQlmQ29udGVudHM9IG51bGw7Ci0JCS8vIHdlIHVzZSBhIGZpeGVkIHNldC4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZDb250ZW50cyAhPSBudWxsICYmICFmQ29udGVudHMuY29udGFpbnMobyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1Byb2dyZXNzQW5kVGV4dERpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1Byb2dyZXNzQW5kVGV4dERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FmNmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Qcm9ncmVzc0FuZFRleHREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlzcGxheSBib3RoIHByb2dyZXNzIHN0YXR1cyBhbmQgY3VtdWxhdGl2ZSBzdGF0dXMgKHRleHQpIHRvIHRoZSB1c2VyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NBbmRUZXh0RGlhbG9nIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFRleHQgdGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsUHJlc3NlZCA9IGZhbHNlOyAvLyBIYXMgdGhlICJDYW5jZWwiIGJ1dHRvbiBiZWVuIGNsaWNrZWQ/Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VQcmVzc2VkID0gZmFsc2U7IC8vIEhhcyB0aGUgIkNsb3NlIiBidXR0b24gYmVlbiBjbGlja2VkPwotCXByb3RlY3RlZCBib29sZWFuIG9wZXJhdGlvbkRvbmUgPSBmYWxzZTsgLy8gSGFzIHRoZSBvcGVyYXRpb24gY29tcGxldGVkPwotCXByb3RlY3RlZCBDdXJzb3IgYXJyb3dDdXJzb3I7IC8vIFRoZSBjdXJzb3IgdXNlZCBpbiB0aGUgY2FuY2VsIGJ1dHRvbi4KLQotCi0JcHVibGljIFByb2dyZXNzQW5kVGV4dERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuQk9SREVSIHwgU1dULlRJVExFIHwgU1dULlJFU0laRSk7IC8vIGRvIG5vdCBtYWtlIHRoaXMgZGlhbG9nIG1vZGFsCi0JCXNldEJsb2NrT25PcGVuKGZhbHNlKTsgLy8gZG8gbm90IGZvcmNlIHRoZSB1c2VyIHRvIGNsb3NlIHRoaXMgZGlhbG9nIGJlZm9yZSB1c2luZyBlY2xpcHNlCi0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlmaW5hbCBpbnQgaEhpbnQgPSAxMDA7Ci0JCWZpbmFsIGludCB3SGludCA9IDI1MDsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJTGFiZWwgdGV4dExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQgfCBTV1QuV1JBUCk7Ci0JCXRleHRMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9TVEFUVVMpKTsKLQkJR3JpZERhdGEgbGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRleHRMYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0KLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgLy8gdXNlIHRoZSBsYXlvdXQncyBkZWZhdWx0IHByZWZlcmVuY2VzCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaEhpbnQ7Ci0JCWRhdGEud2lkdGhIaW50ID0gd0hpbnQ7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGQpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVGV4dChmaW5hbCBTdHJpbmcgbWVzc2FnZVN0cmluZykgewotCQlpZiAoZ2V0U2hlbGwoKSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdGV4dC5hcHBlbmQobWVzc2FnZVN0cmluZyk7Ci0JCQkJCXRleHQuYXBwZW5kKE5FV0xJTkUpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG8gbm90IGRpc21pc3MgdGhlIGRpYWxvZyB1bnRpbCB0aGUgdXNlciBwcmVzc2VzIHRoZSBDbG9zZSBidXR0b24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmIChjbG9zZVByZXNzZWQpIHsKLQkJCS8vIENhbmNlbCBidXR0b24gY29udmVydGVkIHRvICJDbG9zZSIgYnV0dG9uLCBhbmQgdXNlciBjbGlja2VkIHRoZSAiQ2xvc2UiIGJ1dHRvbgotCQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JCX0KLQotCQkvLyBUdXJuIHRoZSAiY2FuY2VsIiBidXR0b24gaW50byBhICJDbG9zZSIgYnV0dG9uIGFuZCBrZWVwIHRoZSB3aW5kb3cgb3BlbiB1bnRpbAotCQkvLyB0aGUgdXNlciBjbGlja3MgdGhlICJDbG9zZSIgYnV0dG9uLgotCQlwcm9ncmVzc0luZGljYXRvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaWYgKGFycm93Q3Vyc29yID09IG51bGwpCi0JCQlhcnJvd0N1cnNvciA9IG5ldyBDdXJzb3IoY2FuY2VsLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9BUlJPVyk7Ci0JCWdldFNoZWxsKCkuc2V0Q3Vyc29yKGFycm93Q3Vyc29yKTsKLQkJaWYgKGNhbmNlbFByZXNzZWQpIHsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9DQU5DRUxMRUQpKTsKLQkJfSBlbHNlIHsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9DT01QTEVURSkpOwotCQl9Ci0JCWNhbmNlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9DTE9TRSkpOwotCQljYW5jZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsQ2FuY2VsUHJlc3NlZCgpIHsKLQkJLy8gSGFzIHRoaXMgbWV0aG9kIGJlZW4gY2FsbGVkIGJlY2F1c2UgIkNhbmNlbCIgaGFzIGJlZW4gY2xpY2tlZCBvcgotCQkvLyBiZWNhdXNlICJDbG9zZSIgaGFzIGJlZW4gY2xpY2tlZD8KLQkJaWYgKG9wZXJhdGlvbkRvbmUpIHsKLQkJCS8vICJDbG9zZSIgd2FzIGNsaWNrZWQuCi0JCQljbG9zZVByZXNzZWQgPSB0cnVlOwotCQkJY2xvc2UoKTsKLQkJfSBlbHNlIHsKLQkJCS8vICJDYW5jZWwiIHdhcyBjbGlja2VkLgotCQkJY2FuY2VsUHJlc3NlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0KLQkJLy8gQ2Fubm90IG92ZXJyaWRlIGNhbmNlbFByZXNzZWQoKSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhhdAotCQkvLyBQcm9ncmVzc01vbml0b3JEaWFsb2cgaXMgY29kZWQuCi0JCS8vIFRoZSBQcm9ncmVzc01vbml0b3JEaWFsb2cgcGFyZW50LCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcgdGhlCi0JCS8vIGNhbmNlbFByZXNzZWQoKSBtZXRob2QsIGFkZGVkIGFuIGFub255bW91cyBMaXN0ZW5lciB0byB0aGUKLQkJLy8gY2FuY2VsIGJ1dHRvbi4gV2hlbiB0aGUgYnV0dG9uJ3MgTGlzdGVuZXIgaXMgaW52b2tlZCwgaWYKLQkJLy8gY2xvc2UoKSBoYXMgYmVlbiBjYWxsZWQgYnkgY2FuY2VsUHJlc3NlZCgpLCB0aGVuIGFuCi0JCS8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gKFNXVEV4Y2VwdGlvbiAtICJXaWRnZXQgaXMgZGlzcG9zZWQnKS4KLQkJLy8gV29yayBhcm91bmQgdGhpcyBieSBhZGRpbmcgYW4gYW5vbnltb3VzCi0JCS8vIGNhbmNlbCBsaXN0ZW5lciwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHBhcmVudCdzCi0JCS8vIGNhbmNlbCBsaXN0ZW5lciwgYW5kIHRoaXMgY2xhc3MnIGxpc3RlbmVyIHdpbGwgY2FsbCBjbG9zZSgpLgotCQljYW5jZWwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludGVybmFsQ2FuY2VsUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0I3J1bihib29sZWFuLCBib29sZWFuLAotCSAqICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0cnkgewotCQkJc3VwZXIucnVuKGZvcmssIGNhbmNlbGFibGUsIHJ1bm5hYmxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW9wZXJhdGlvbkRvbmUgPSB0cnVlOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1Jlc291cmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvUmVzb3VyY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmMzg2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvUmVzb3VyY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBjb25zdGFudHMgdXNlZCBhcyBrZXlzIGludG8gdGhlIFJlc291cmNlQnVuZGxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlQ29uc3RhbnRzIHsKLQkvLyBJbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX0VYQ19JTlRFUk5BTCA9ICJWQkZfRVhDX0lOVEVSTkFMIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29uc3RydWN0aW5nIG9yIHJ1bm5pbmcgdGhlIFByb3BlcnRpZXMgb3IgUHJlZmVyZW5jZSBwYWdlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9FWENfSU5URVJOQUxfUEFHRSA9ICJWQkZfRVhDX0lOVEVSTkFMX1BBR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX0VYQ19JTlRFUk5BTF9QUk9KRUNUID0gIlZCRl9FWENfSU5URVJOQUxfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfRVhDX0lOVEVSTkFMX1RJVExFID0gIlZCRl9FWENfSU5URVJOQUxfVElUTEUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSBwbHVnaW4ueG1sIHNwZWNpZmllcyBhbiBJUHJvamVjdCBvYmplY3RDbGFzcyBmaWx0ZXIsIGJ1dCBpZiB0aGUKLQkvLyBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UgaXMgc2hvd24gb24gYSBub24tSVByb2plY3QgcmVzb3VyY2UsIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHdoYXQncwotCS8vIHNob3duLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9FWENfSU5WQUxJRF9SRUdJU1RFUiA9ICJWQkZfRVhDX0lOVkFMSURfUkVHSVNURVIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBPbiB0aGUgUHJvcGVydGllcyBQYWdlLCB0aGlzIGlzIHRoZSBzdHJpbmcgd2hpY2ggZXhwbGFpbnMgdG8gdGhlIHVzZXIgd2hhdCB0byBkby4gVGhlIHN0cmluZwotCS8vIGlzCi0JLy8gZGlzcGxheWVkIGluIGEgbGFiZWwuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX0xCTF9ERVNDID0gIlZCRl9VSV9MQkxfREVTQyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9uIHRoZSBQcm9wZXJ0aWVzIFBhZ2UsIHRoaXMgaXMgdGhlIHN0cmluZyB3aGljaCBleHBsYWlucyB0byB0aGUgdXNlciB3aGF0IHRvIGRvLiBUaGUgc3RyaW5nCi0JLy8gaXMKLQkvLyBkaXNwbGF5ZWQgaW4gYSBsYWJlbC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfTEJMX05PVkFMSURBVE9SU19ERVNDID0gIlZCRl9VSV9MQkxfTk9WQUxJREFUT1JTX0RFU0MiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBMYWJlbCBvbiB0aGUgY2hlY2tib3ggYnV0dG9uIG9mIHRoZSB2YWxpZGF0b3IgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9MQkxfQVVUT19WQUxJREFURSA9ICJWQkZfVUlfTEJMX0FVVE9fVkFMSURBVEUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJZiB0aGUgdXNlciBoYXMgc2VsZWN0ZWQgIlZhbGlkYXRlIHRoaXMgcHJvamVjdCIgZnJvbSB0aGUgcG9wdXBNZW51LCBidXQgaGFzIG5vIHZhbGlkYXRvcnMKLQkvLyBlbmFibGVkLCB0ZWxsIHRoZW0gdGhhdCBub3RoaW5nIHdpbGwgcnVuLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9OT19WQUxJREFUT1JTX0VOQUJMRUQgPSAiVkJGX1VJX05PX1ZBTElEQVRPUlNfRU5BQkxFRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9uIHRoZSBQcm9wZXJ0aWVzIFBhZ2UsIHRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoZSBncm91cCB3aGljaCBlbmNsb3NlcyB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlcgotCS8vICh0aGUgbGlzdCBvZiBjb25maWd1cmVkIHZhbGlkYXRvcnMpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9DSEVDS0JPWEdST1VQX1RJVExFID0gIlZCRl9VSV9DSEVDS0JPWEdST1VQX1RJVExFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9BVVRPX09OX05PTklOQyA9ICJWQkZfVUlfQVVUT19PTl9OT05JTkMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX01TU0dCT1hfVElUTEVfTk9OSU5DID0gIlZCRl9VSV9NU1NHQk9YX1RJVExFX05PTklOQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfQVVUT19OT1RFID0gIlZCRl9VSV9BVVRPX05PVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX0FVVE9fTk9URV9URVhUID0gIlZCRl9VSV9BVVRPX05PVEVfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfTUVOVUlURU1fVEVYVCA9ICJWQkZfVUlfTUVOVUlURU1fVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfTUVOVUlURU1fVEVYVF9ERUZBVUxUID0gIlZCRl9VSV9NRU5VSVRFTV9URVhUX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX0NMT1NFRF9QUk9KRUNUID0gIlZCRl9VSV9DTE9TRURfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfTk9fVkFMSURBVE9SU19JTlNUQUxMRUQgPSAiVkJGX1VJX05PX1ZBTElEQVRPUlNfSU5TVEFMTEVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX1BPUFVQX1JVTlZBTElEQVRJT04gPSAiJVZCRl9VSV9QT1BVUF9SVU5WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9CVVRUT05fRU5BQkxFQUxMID0gIlBSRUZfQlVUVE9OX0VOQUJMRUFMTCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0JVVFRPTl9ESVNBQkxFQUxMID0gIlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9WQUxMSVNUX1RJVExFID0gIlBSRUZfVkFMTElTVF9USVRMRSI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0JVVFRPTl9BVVRPID0gIlBSRUZfQlVUVE9OX0FVVE8iOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9CVVRUT05fT1ZFUlJJREUgPSAiUFJFRl9CVVRUT05fT1ZFUlJJREUiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9CVVRUT05fRlVMTCA9ICJQUkVGX0JVVFRPTl9GVUxMIjsgLy8kTk9OLU5MUy0xJAotCS8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTEJMX01BWE1TR1MgPSAiUFJFRl9MQkxfTUFYTVNHUyI7IC8vJE5PTi1OTFMtMSQKLSAgLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9NTlVfTUFOVUFMID0gIlBSRUZfTU5VX01BTlVBTCI7IC8vJE5PTi1OTFMtMSQKLSAgLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9NTlVfQlVJTEQgPSAiUFJFRl9NTlVfQlVJTEQiOyAvLyROT04tTkxTLTEkCi0gIC8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTU5VX1NFVFRJTkdTID0gIlBSRUZfTU5VX1NFVFRJTkdTIjsgLy8kTk9OLU5MUy0xJAotICAvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JVVFRPTl9PVkVSUklERSA9ICJQUk9QX0JVVFRPTl9PVkVSUklERSI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JVVFRPTl9GVUxMID0gIlBST1BfQlVUVE9OX0ZVTEwiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9CVVRUT05fU0VMRUNUQUxMID0gIlBST1BfQlVUVE9OX1NFTEVDVEFMTCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JVVFRPTl9ERVNFTEVDVEFMTCA9ICJQUk9QX0JVVFRPTl9ERVNFTEVDVEFMTCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xCTF9NQVhNU1NHUyA9ICJQUk9QX0xCTF9NQVhNU1NHUyI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VSUk9SX0lOVCA9ICJQUkVGX0VSUk9SX0lOVCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VSUk9SX0lOVCA9ICJQUk9QX0VSUk9SX0lOVCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9QUkpORUVESU5QVVQgPSAiVkJGX1VJX1BSSk5FRURJTlBVVCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfUkVTTkVFRElOUFVUID0gIlZCRl9VSV9SRVNORUVESU5QVVQiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX01BWF9SRVBPUlRFRCA9ICJWQkZfVUlfTUFYX1JFUE9SVEVEIjsgLy8kTk9OLU5MUy0xJAotCS8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9QUkpWQUxJREFURUQgPSAiVkJGX1VJX1BSSlZBTElEQVRFRCI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfUkVTVkFMSURBVEVEID0gIlZCRl9VSV9SRVNWQUxJREFURUQiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX0NBTkNFTExFRCA9ICJWQkZfVUlfQ0FOQ0VMTEVEIjsgLy8kTk9OLU5MUy0xJAotCS8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIFZCRl9VSV9DT01QTEVURSA9ICJWQkZfVUlfQ09NUExFVEUiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX0NMT1NFID0gIlZCRl9VSV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkvKiBwYWNrYWdlICovc3RhdGljIGZpbmFsIFN0cmluZyBWQkZfVUlfU1RBVFVTID0gIlZCRl9VSV9TVEFUVVMiOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgVkJGX1VJX1JFU0NBTkNFTExFRCA9ICJWQkZfVUlfUkVTQ0FOQ0VMTEVEIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIHBhY2thZ2UgKi9zdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfVkFMSURBVElPTiA9ICJESVNBQkxFX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCi0JLyogcGFja2FnZSAqL3N0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1ZBTElEQVRJT05fQlVJTERFUiA9ICJBRERfVkFMSURBVElPTl9CVUlMREVSIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTyA9ICJJTkZPIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgU3RyaW5nIERFTEVHQVRFU19ESUFMT0dfVElUTEUgPSAiREVMRUdBVEVTX0RJQUxPR19USVRMRSI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIERFTEVHQVRFU19DT01CT19MQUJFTCA9ICJERUxFR0FURVNfQ09NQk9fTEFCRUwiOyAvLyROT04tTkxTLTEkCi0gIAotICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1dTX1NFVFRJTkdTPSJDT05GSUdfV1NfU0VUVElOR1MiOy8vJE5PTi1OTFMtMSQKLSAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUiA9ICJWQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0gIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5VQUwgPSAiTUFOVUFMIjsgLy8kTk9OLU5MUy0xJAotICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTEQgPSAiQlVJTEQiOyAvLyROT04tTkxTLTEkCi0gIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HUyA9ICJTRVRUSU5HUyI7IC8vJE5PTi1OTFMtMSQKLSAgCQotIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMzcxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgdGhlIFN0cmluZ3MgZnJvbSB0aGUgLnByb3BlcnRpZXMgZmlsZSBhcHByb3ByaWF0ZSBmb3IgdGhlIG1hY2hpbmUncyBMb2NhbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUhhbmRsZXIgewotCS8vVE9ETyBNYWtlIHRoaXMgY2xhc3MgZmluYWwgb25jZSB0aGUgcHVibGljIFJlc291cmNlSGFuZGxlciBoYXMgYmVlbiBkZWxldGVkLgotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIF9idW5kbGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFJlc291cmNlSGFuZGxlcigpIHsKLQkJLy9UT0RPIE1ha2UgdGhpcyBtZXRob2QgcHJpdmF0ZSBvbmNlIHRoZSBwdWJsaWMgUmVzb3VyY2VIYW5kbGVyIGhhcyBiZWVuIGRlbGV0ZWQuCi0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2VzLCBhcyBpZGVudGlmaWVkIGJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCWlmIChfYnVuZGxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0QnVuZGxlTmFtZSgpKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlfYnVuZGxlID0gbnVsbDsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gV1RQVUlQbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25VSVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy51aS5SZXNvdXJjZUhhbmRsZXIuZ2V0QnVuZGxlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJDYW5ub3QgZmluZCBidW5kbGUgIiArIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRCdW5kbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gX2J1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IFdUUFVJUGx1Z2luLmdldExvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMudWkuUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoIlJlc291cmNlIGJ1bmRsZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGtleTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gV1RQVUlQbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy51aS5SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJDYW5ub3QgZmluZCBtZXNzYWdlIGlkICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gcGFybXMpIHsKLQkJU3RyaW5nIHJlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXMgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShrZXkpLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25VSVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLnVpLlJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZywgU3RyaW5nW10pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJDYW5ub3QgZmluZCBtZXNzYWdlIGlkICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gV1RQVUlQbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy51aS5SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcsIFN0cmluZ1tdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiQ2Fubm90IGZvcm1hdCBtZXNzYWdlIGlkICIgKyBrZXkgKyAiIHdpdGggIiArIHBhcm1zLmxlbmd0aCArICIgcGFyYW1ldGVycy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRkZDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOwotCi0vKioKLSAqIEEgZ2VuZXJpYyBzYXZlIGZpbGVzIGRpYWxvZy4gVGhlIGJ1bGsgb2YgdGhlIGNvZGUKLSAqIGZvciB0aGlzIGRpYWxvZyB3YXMgdGFrZW4gZnJvbSB0aGUgSkRUIHJlZmFjdG9yaW5nCi0gKiBzdXBwb3J0IGluIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1NhdmVIZWxwZXIuCi0gKiBUaGlzIGNsYXNzIGlzIGEgZ29vZCBjYW5kaWRhdGUgZm9yIHJldXNlIGFtb3VuZyBjb21wb25lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZpbGVzRGlhbG9nIGV4dGVuZHMgTGlzdERpYWxvZyB7Ci0JCi0JcHVibGljIFNhdmVGaWxlc0RpYWxvZyhTaGVsbCBwYXJlbnQpCi0JewotCSAgc3VwZXIocGFyZW50KTsKLQkgIHNldFRpdGxlKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXMpOyAKLQkgIHNldEFkZENhbmNlbEJ1dHRvbih0cnVlKTsKLQkgIHNldExhYmVsUHJvdmlkZXIoY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpKTsKLQkgIHNldE1lc3NhZ2UoVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX211c3Rfc2F2ZSk7IAotCSAgc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgCi0JewotCQlDb21wb3NpdGUgcmVzdWx0PSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0JCWJvb2xlYW4gZkFsbG93U2F2ZUFsd2F5cyA9IHRydWU7Ci0JCWlmIChmQWxsb3dTYXZlQWx3YXlzKSB7Ci0JCQlmaW5hbCBCdXR0b24gY2hlY2s9IG5ldyBCdXR0b24ocmVzdWx0LCBTV1QuQ0hFQ0spOwotCQkJY2hlY2suc2V0VGV4dChWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfYWx3YXlzX3NhdmUpOyAKLQkJCS8vY2hlY2suc2V0U2VsZWN0aW9uKFJlZmFjdG9yaW5nU2F2ZVByZWZlcmVuY2VzLmdldFNhdmVBbGxFZGl0b3JzKCkpOwotCQkJY2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCSAgdHJ5Ci0JCQkJICB7Ci0JCQkJICAgIEdsb2JhbENvbmZpZ3VyYXRpb24gY29uZmlnID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCQkgICAgY29uZmlnLnNldFNhdmVBdXRvbWF0aWNhbGx5KGNoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJCQkgICAgY29uZmlnLnN0b3JlKCk7Ci0JCQkJICB9Ci0JCQkJICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykKLQkJCQkgIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcihWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0QnVuZGxlTmFtZSgpKS5sb2coTGV2ZWwuV0FSTklORywgIlVuYWJsZSB0byBzZXQgc2F2ZSBhdXRvbWF0aWNhbGx5IHByZWZlcmVuY2UgaW4gc2F2ZSBmaWxlcyBmb3IgdmFsaWRhdGlvbiBkaWFsb2c6ICIgKyBleGMpOwotCQkJCSAgfQotCQkJCSAgCi0JCQkJfQotCQkJfSk7Ci0JCQlhcHBseURpYWxvZ0ZvbnQocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGNyZWF0ZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZUltYWdlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGUoKTsKLQkJCX0KLQkJfTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjMDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgdGhlIHNhdmUgZGlydHkgZmlsZXMgZGlhbG9nLgotICovCi1wdWJsaWMgY2xhc3MgU2F2ZUZpbGVzSGVscGVyIHsKLQotCS8qKgotCSAqIFJldHJlaXZlIGFuIGFycmF5IG9mIElFZGl0b3JQYXJ0cyByZXByZXNlbnRpbmcgYWxsIHRoZSBkaXJ0eQotCSAqIGVkaXRvcnMgb3BlbiBmb3IgdGhlIGZpbGVzIHByb3ZpZGVkIGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqIAkJCUEgbGlzdCBvZiBJRmlsZXMuCi0JICogQHJldHVybgotCSAqIAkJCUFuIGFycmF5IG9mIElFZGl0b3JQYXJ0cyBjb250YWluaW5nIGFsbCB0aGUgZGlydHkgZWRpdG9ycyBmb3IgdGhlIGZpbGVzIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnRbXSBnZXREaXJ0eUVkaXRvcnMoTGlzdCBmaWxlcykgewotCQlTZXQgaW5wdXRzID0gbmV3IEhhc2hTZXQoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYWdlcy5sZW5ndGg7IHgrKykgewotCQkJCUlFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOwotCQkJCWZvciAoaW50IHogPSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykgewotCQkJCQlJRWRpdG9yUGFydCBlcCA9IGVkaXRvcnNbel07Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJCQkJaWYgKGZpbGVzLmNvbnRhaW5zKGZpbGVJbnB1dC5nZXRGaWxlKCkpKSB7Ci0JCQkJCQkJaWYgKCFpbnB1dHMuY29udGFpbnMoaW5wdXQpKSB7Ci0JCQkJCQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQkJCQkJCQlyZXN1bHQuYWRkKGVwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRWRpdG9yUGFydFtdKSByZXN1bHQudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MmIxMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCXByb3RlY3RlZCBWYWxpZGF0aW9uTWVudUFjdGlvbiBkZWxlZ2F0ZTsKLQotCXB1YmxpYyBWYWxpZGF0ZUFjdGlvbigpIHsKLQkJc3VwZXIoVmFsaWRhdGlvblVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9QT1BVUF9SVU5WQUxJREFUSU9OKSk7Ci0JCWRlbGVnYXRlID0gbmV3IFZhbGlkYXRpb25NZW51QWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGRlZmluZWQgb24gPGNvZGU+SUFjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGFjdGlvbiBpbiByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdG8gcmVhY3QgdG8gc2VsZWN0aW9uIGNoYW5nZXM7IGhvd2V2ZXIsIGlmIHRoZQotCSAqIHN1cGVyIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIG92ZXJyaWRpbmcgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc2VsZWN0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsZWN0aW9uKTsKLQotCQlyZXR1cm4gaXNFbmFibGVkKCk7IC8vICJFbmFibGVkIiBpcyBzZXQgYnkgdGhlIGRlbGVnYXRlLgotCX0KLQotCS8qKgotCSAqIElmIGEgc3ViY2xhc3Mgb2YgVmFsaWRhdGVBY3Rpb24gZW5hYmxlcyB0aGlzIG1lbnUgYWN0aW9uIG9uIGEgdHlwZSB0aGF0IGlzIG5vdCBhbiBJUmVzb3VyY2UsCi0JICogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSVJlc291cmNlW10gdGhhdCByZXByZXNlbnQgdGhhdCBvYmplY3QuIElmIG51bGwgaXMgcmV0dXJuZWQsIHRoZQotCSAqIG9iamVjdCB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSB1c2VyIHdpbGwgbm90IGJlIG5vdGlmaWVkIHRoYXQgdGhlIG9iamVjdCB3YXMgbm90IHZhbGlkYXRlZC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHVwZGF0ZVNlbGVjdGlvbiBhbmQgcnVuIGFyZSBjYWxsZWQuIChUaGUgcmVzdWx0IG9mIHRoaXMKLQkgKiBtZXRob2QgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggcmVzb3VyY2VzIHdpbGwgYmUgdmFsaWRhdGVkKQotCSAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VbXSBnZXRSZXNvdXJjZShPYmplY3Qgc2VsZWN0ZWQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM3ZjY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkpvYiBleHRlbmRzIEpvYiB7Ci0KLQotCXByaXZhdGUgTWFwIHByb2plY3RzOwotCXB1YmxpYyBWYWxpZGF0aW9uSm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdHNNYXAoTWFwIHByb2plY3RzKXsKLQkJdGhpcy5wcm9qZWN0cyA9IHByb2plY3RzOwotCX0KLQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwIGdldFByb2plY3RzKCkgewotCQlyZXR1cm4gcHJvamVjdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25NZW51QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbk1lbnVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMDhmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbk1lbnVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHBvcC11cCBtZW51IGl0ZW0gIlJ1biBWYWxpZGF0aW9uIiBXaGVuIHRoZSBpdGVtIGlzIHNlbGVjdGVkLCB0aGlzCi0gKiBhY3Rpb24gdHJpZ2dlcnMgYSB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0LCB1c2luZyBhbGwgY29uZmlndXJlZCwgZW5hYmxlZCB2YWxpZGF0b3JzLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lbnVBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElTZWxlY3Rpb24gX2N1cnJlbnRTZWxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGlzcGxheSBfY3VycmVudERpc3BsYXkgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlVmlzaXRvciBfZm9sZGVyVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIF9wcm9qZWN0VmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgX3NlbGVjdGVkUmVzb3VyY2VzID0gbnVsbDsKLQkvL3Byb3RlY3RlZCBJV29ya2JlbmNoQ29udGV4dCB3b3JrYmVuY2hDb250ZXh0OwotCi0JcHVibGljIFZhbGlkYXRpb25NZW51QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlfY3VycmVudERpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsgLy8gY2FjaGUgdGhlIGRpc3BsYXkgYmVmb3JlCi0JCS8vIHRoaXMgYWN0aW9uIGlzIGZvcmtlZC4gQWZ0ZXIKLQkJLy8gdGhlIGFjdGlvbiBpcyBmb3JrZWQsCi0JCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpIHJldHVybnMKLQkJLy8gbnVsbC4KLQkJX3NlbGVjdGVkUmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIChfY3VycmVudERpc3BsYXkgPT0gbnVsbCkgPyBEaXNwbGF5LmdldEN1cnJlbnQoKSA6IF9jdXJyZW50RGlzcGxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdpemFyZCdzIHNoZWxsLgotCSAqLwotCVNoZWxsIGdldFNoZWxsKCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gKGRpc3BsYXkgPT0gbnVsbCkgPyBudWxsIDogZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCAmJiBkaXNwbGF5ICE9IG51bGwpIHsKLQkJCVNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLQkJCWlmIChzaGVsbHMubGVuZ3RoID4gMCkKLQkJCQlzaGVsbCA9IHNoZWxsc1swXTsKLQkJfQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBfY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtYXAgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLiBFYWNoIGtleSBvZiB0aGUgbWFwIGlzIGFuIElQcm9qZWN0LCBhbmQgdGhlIHZhbHVlIGlzIGEKLQkgKiBTZXQgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlcyBpbiB0aGF0IHByb2plY3QuIElmIGEgcHJvamVjdCBpcyBzZWxlY3RlZCwgYW5kIG5vdGhpbmcgZWxzZSBpbgotCSAqIHRoZSBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhIGZ1bGwgdmFsaWRhdGlvbiAobnVsbCB2YWx1ZSkgd2lsbCBiZSBkb25lIG9uIHRoZSBwcm9qZWN0LiBJZiBhCi0JICogcHJvamVjdCBpcyBzZWxlY3RlZCwgYW5kIHNvbWUgZmlsZXMvZm9sZGVycyBpbiB0aGUgcHJvamVjdCBhcmUgYWxzbyBzZWxlY3RlZCwgb25seSB0aGUKLQkgKiBmaWxlcy9mb2xkZXJzIHdpbGwgYmUgdmFsaWRhdGVkLiBJZiBhIGZvbGRlciBpcyBzZWxlY3RlZCwgYWxsIG9mIGl0cyBjb250ZW50cyBhcmUgYWxzbwotCSAqIHZhbGlkYXRlZC4KLQkgKi8KLQkvLyBUT0RPOiBDaGVjayB0aGlzIG1ldGhvZCBmb3Igc2VsZWN0ZWQgcmVzb3VyY2VzLgotCXByaXZhdGUgTWFwIGxvYWRTZWxlY3RlZChWYWxpZGF0ZUFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gcmVmcmVzaCkgewotCQlpZiAocmVmcmVzaCkgewotCQkJLy8gc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKSBoYXMgYmVlbiBjYWxsZWQuIEZsdXNoIHRoZQotCQkJLy8gZXhpc3RpbmcgY2FjaGUgb2YgcmVzb3VyY2VzIGFuZAotCQkJLy8gYWRkIGp1c3QgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvbmVzLgotCQkJX3NlbGVjdGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRDdXJyZW50U2VsZWN0aW9uKCk7Ci0JCWlmICgoc2VsZWN0aW9uID09IG51bGwpIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhZGRTZWxlY3RlZChhY3Rpb24sIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBfc2VsZWN0ZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkKFZhbGlkYXRlQWN0aW9uIGFjdGlvbiwgT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlhZGRWaXNpdG9yKChJUHJvamVjdCkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWFkZFNlbGVjdGVkKChJRmlsZSkgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJYWRkVmlzaXRvcigoSUZvbGRlcikgc2VsZWN0ZWQpOwotCQl9IGVsc2UgaWYgKGlzVmFsaWRUeXBlKGdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCkpKSB7Ci0JCQlhZGRTZWxlY3RlZChhY3Rpb24sZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBOb3QgYSB2YWxpZCBpbnB1dCB0eXBlLiBNdXN0IGJlIElQcm9qZWN0LCBJSmF2YVByb2plY3QsIG9yCi0JCQkvLyBJUmVzb3VyY2UuCi0JCQkvLyBJZiB0aGlzIFZhbGlkYXRpb25NZW51QWN0aW9uIGlzIGEgZGVsZWdhdGUgb2YgVmFsaWRhdGVBY3Rpb24sIGlzCi0JCQkvLyB0aGUgaW5wdXQgdHlwZSByZWNvZ25pemVkIGJ5IHRoZSBWYWxpZGF0ZUFjdGlvbj8KLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGFjdGlvbi5nZXRSZXNvdXJjZShzZWxlY3RlZCk7Ci0JCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFkZFNlbGVjdGVkKGFjdGlvbiwgcmVzb3VyY2VzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghdmFsaWQpIHsKLQkJCQkvLyBTdG9wIHByb2Nlc3NpbmcuIChUaGlzIGFsbG93cyB0aGUgIlJ1biBWYWxpZGF0aW9uIiBtZW51IGl0ZW0KLQkJCQkvLyB0byBncmF5Ci0JCQkJLy8gb3V0IG9uY2UgYXQgbGVhc3Qgb25lIG5vbi12YWxpZGF0YWJsZSBlbGVtZW50IGlzIHNlbGVjdGVkLikKLQkJCQlfc2VsZWN0ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRFeHRlbmRlZFR5cGUoT2JqZWN0IHNlbGVjdGVkKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKTsKLQkJcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gc2VsZWN0ZWQgOiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSB8fCBvYmplY3QgaW5zdGFuY2VvZiBJRm9sZGVyOwotCX0KLQotCi0Jdm9pZCBhZGRTZWxlY3RlZChJUmVzb3VyY2Ugc2VsZWN0ZWQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHNlbGVjdGVkLmdldFByb2plY3QoKTsKLQkJYm9vbGVhbiBhZGRlZCA9IF9zZWxlY3RlZFJlc291cmNlcy5jb250YWluc0tleShwcm9qZWN0KTsKLQkJU2V0IGNoYW5nZWRSZXMgPSBudWxsOwotCQlpZiAoYWRkZWQpIHsKLQkJCS8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGUgZW50aXJlIHByb2plY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCi0JCQkvLyBhbnl3YXkuCi0JCQljaGFuZ2VkUmVzID0gKFNldCkgX3NlbGVjdGVkUmVzb3VyY2VzLmdldChwcm9qZWN0KTsKLQkJCWlmIChjaGFuZ2VkUmVzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljaGFuZ2VkUmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlpZiAoY2hhbmdlZFJlcy5hZGQoc2VsZWN0ZWQpKSB7Ci0JCQlfc2VsZWN0ZWRSZXNvdXJjZXMucHV0KHByb2plY3QsIGNoYW5nZWRSZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZpc2l0b3IoSUZvbGRlciBzZWxlY3RlZCkgewotCQkvLyBhZGQgdGhlIGZvbGRlciBhbmQgaXRzIGNoaWxkcmVuCi0JCXRyeSB7Ci0JCQlzZWxlY3RlZC5hY2NlcHQoZ2V0Rm9sZGVyVmlzaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblVJUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdGlvbk1lbnVBY3Rpb24uYWRkU2VsZWN0ZWQoSUZvbGRlcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMKTsKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgZ2V0Rm9sZGVyVmlzaXRvcigpIHsKLQkJaWYgKF9mb2xkZXJWaXNpdG9yID09IG51bGwpIHsKLQkJCV9mb2xkZXJWaXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgewotCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWFkZFNlbGVjdGVkKHJlcyk7Ci0JCQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBfZm9sZGVyVmlzaXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFZpc2l0b3IoSVByb2plY3Qgc2VsZWN0ZWQpIHsKLQkJLy8gYWRkIHRoZSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbgotCQlpZiggIXNlbGVjdGVkLmlzQWNjZXNzaWJsZSgpICkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXNlbGVjdGVkLmFjY2VwdChnZXRQcm9qZWN0VmlzaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblVJUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdGlvbk1lbnVBY3Rpb24uYWRkU2VsZWN0ZWQoSUZvbGRlcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMKTsKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgZ2V0UHJvamVjdFZpc2l0b3IoKSB7Ci0JCWlmIChfcHJvamVjdFZpc2l0b3IgPT0gbnVsbCkgewotCQkJX3Byb2plY3RWaXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgewotCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWFkZFNlbGVjdGVkKHJlcyk7Ci0JCQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJYWRkU2VsZWN0ZWQocmVzKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBfcHJvamVjdFZpc2l0b3I7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4gSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgcGx1Z2luIGFjdGlvbgotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIHRoZSBkZXNrdG9wIHdpbmRvdyBwYXNzZWQgYnkgdGhlIGFjdGlvbiBwcm94eQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBUT0RPOiBJbnNlcnQgZGlydHkgZmlsZSBjaGVjayBoZXJlLgotCQlWYWxpZGF0ZUFjdGlvbiB2YWN0aW9uID0gbnVsbDsKLQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFZhbGlkYXRlQWN0aW9uKSB7Ci0JCQl2YWN0aW9uID0gKFZhbGlkYXRlQWN0aW9uKSBhY3Rpb247Ci0JCX0KLQkJZmluYWwgTWFwIHByb2plY3RzID0gbG9hZFNlbGVjdGVkKHZhY3Rpb24sIGZhbHNlKTsKLQkJaWYgKChwcm9qZWN0cyA9PSBudWxsKSB8fCAocHJvamVjdHMuc2l6ZSgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIHRoZSBmaWxlcyBhcmVuJ3Qgc2F2ZWQgZG8gbm90IHJ1biB2YWxpZGF0aW9uLgotCQlpZighaGFuZGxlRmlsZXNUb1NhdmUocHJvamVjdHMpKQotCQl7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkJVmFsaWRhdGlvbkpvYiB2YWxpZGF0aW9ub3AgPSBuZXcgVmFsaWRhdGlvbkpvYihWYWxpZGF0aW9uVUlNZXNzYWdlcy5SdW5WYWxpZGF0aW9uRGlhbG9nVGl0bGUpewotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWZpbmFsIE1hcCBwcm9qZWN0c01hcCA9IHByb2plY3RzOwotCQkJCUlTdGF0dXMgc3RhdCA9IHZhbGlkYXRlKG1vbml0b3IsIHByb2plY3RzTWFwKTsJCi0JCQkJX3NlbGVjdGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJcmV0dXJuIHN0YXQ7Ci0JCQl9Ci0JCX07Ci0JCXZhbGlkYXRpb25vcC5zZXRQcm9qZWN0c01hcChwcm9qZWN0cyk7Ci0JCXZhbGlkYXRpb25vcC5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQl2YWxpZGF0aW9ub3Auc2V0VXNlcih0cnVlKTsKLQkJdmFsaWRhdGlvbm9wLnNjaGVkdWxlKCk7Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIE1hcCBwcm9qZWN0cykgewotCQlib29sZWFuIGNhbmNlbGxlZCA9IGZhbHNlOyAvLyBXYXMgdGhlIG9wZXJhdGlvbiBjYW5jZWxsZWQ/Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvamVjdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCi0JCQlpZiAoIG1vbml0b3IuaXNDYW5jZWxlZCgpICkKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiwgMCwgIk9LIiwgbnVsbCk7OwotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoY2FuY2VsbGVkKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1VJX1JFU0NBTkNFTExFRCwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSk7Ci0JCQkJCW1vbml0b3Iuc2V0VGFza05hbWUobWVzc2FnZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfVUlfQ0xPU0VEX1BST0pFQ1QsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKG1lc3NhZ2UpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24obW9uaXRvciwgcHJvamVjdHMsIHByb2plY3QpOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gV2hlbiBsb2FkaW5nIGZpbGUgZGVsdGFzLCBpZiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuCi0JCQkJLy8gY2FuY2VsbGVkLCB0aGVuCi0JCQkJLy8gcmVzb3VyY2UuYWNjZXB0IHRocm93cyBhbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbi4KLQkJCQljYW5jZWxsZWQgPSB0cnVlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1VJX1JFU0NBTkNFTExFRCwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSk7Ci0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtZXNzYWdlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlsb2dFeGNlcHRpb24obW9uaXRvciwgcHJvamVjdCwgZXhjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLCAwLCAiT0siLCBudWxsKTsKLQl9Ci0JCi0KLQotCS8qKgotCSAqIEBwYXJhbSBkaWFsb2cKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBleGMKLQkgKi8KLQotCXByaXZhdGUgdm9pZCBsb2dFeGNlcHRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBUaHJvd2FibGUgZXhjKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSBXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25VSVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25NZW51QWN0aW9uLnZhbGlkYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMKTsKLQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQl9Ci0JCVN0cmluZyBpbnRlcm5hbEVycm9yTWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUFJPSkVDVCwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSk7Ci0JCW1vbml0b3Iuc2V0VGFza05hbWUoaW50ZXJuYWxFcnJvck1lc3NhZ2UpOwotCX0JCi0KLQkvKioKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBwcm9qZWN0cwotCSAqIEBwYXJhbSBkaWFsb2cKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCi0JcHJpdmF0ZSBJU3RhdHVzIHBlcmZvcm1WYWxpZGF0aW9uKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgTWFwIHByb2plY3RzLAotCQkJCSBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEV2ZW4gaWYgdGhlICJtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyIgbWVzc2FnZSBpcyBvbgotCQkvLyB0aGUgdGFzayBsaXN0LAotCQkvLyBydW4gdmFsaWRhdGlvbiwgYmVjYXVzZSBzb21lIG1lc3NhZ2VzIG1heSBoYXZlIGJlZW4KLQkJLy8gZml4ZWQKLQkJLy8gYW5kIHRoZXJlIG1heSBiZSBzcGFjZSBmb3IgbW9yZSBtZXNzYWdlcy4KLQkJCi0JCWlmICggbW9uaXRvci5pc0NhbmNlbGVkKCkgKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5DQU5DRUwsICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIsIDAsICJPSyIsIG51bGwpOwotCQkKLQkJU2V0IGNoYW5nZWRSZXNvdXJjZXMgPSAoU2V0KSBwcm9qZWN0cy5nZXQocHJvamVjdCk7Ci0JCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCWlmIChjaGFuZ2VkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCXJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbY2hhbmdlZFJlc291cmNlcy5zaXplKCldOwotCQkJY2hhbmdlZFJlc291cmNlcy50b0FycmF5KHJlc291cmNlcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlpZiAocHJqcC5udW1iZXJPZk1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkgPiAwKSB7Ci0JCQkJY2hlY2tQcm9qZWN0Q29uZmlndXJhdGlvbihtb25pdG9yLCBwcm9qZWN0LCByZXNvdXJjZXMsIHByanApOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9OT19WQUxJREFUT1JTX0VOQUJMRUQsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUobWVzc2FnZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRpb25NZW51QWN0aW9uOjpydW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiwgMCwgIk9LIiwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGRpYWxvZwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEBwYXJhbSBwcmpwCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrUHJvamVjdENvbmZpZ3VyYXRpb24oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCUlQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZVtdIHJlc291cmNlcywgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHN1Y2Nlc3NmdWwgPSB0cnVlOyAvLyBEaWQgdGhlIG9wZXJhdGlvbgotCQkvLyBjb21wbGV0ZQotCQkvLyBzdWNjZXNzZnVsbHk/Ci0JCWlmICggbW9uaXRvci5pc0NhbmNlbGVkKCkgKQotCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiwgMCwgIk9LIiwgbnVsbCk7Ci0JCQotCQlNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uIHZhbGlkT3AgPSBudWxsOwotCQkvL3ZhbGlkT3AgPSBuZXcgTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0LCByZXNvdXJjZXMpOwotCQlpZiAocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXZhbGlkT3AgPSBuZXcgTWFudWFsVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0KTsKLQkJfSBlbHNlIHsKLQkJCXZhbGlkT3AgPSBuZXcgTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKHByb2plY3QsIHJlc291cmNlcyk7Ci0JCX0KLQkJaWYgKHZhbGlkT3AuaXNOZWNlc3NhcnkobW9uaXRvcikpIHsKLQkJCXZhbGlkT3AucnVuKG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJaWYgKHJlc291cmNlcyA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfVUlfUFJKTkVFRElOUFVULCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KTsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKG1lc3NhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9SRVNORUVESU5QVVQsIG5ldyBTdHJpbmdbXXtyZXNvdXJjZXNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQkJCW1vbml0b3Iuc2V0VGFza05hbWUobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzdWNjZXNzZnVsKSB7Ci0JCQlwZXJmb3JtU3VjZXNzZnVsKG1vbml0b3IsIHByb2plY3QsIHJlc291cmNlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgaW50ZXJuYWxFcnJvck1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BST0pFQ1QsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShpbnRlcm5hbEVycm9yTWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIiwgMCwgIk9LIiwgbnVsbCk7Ci0JfQotCQotCi0KLQkvKioKLQkgKiBAcGFyYW0gZGlhbG9nCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1TdWNlc3NmdWwoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKLQkJYm9vbGVhbiBsaW1pdEV4Y2VlZGVkID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkud2FzVmFsaWRhdGlvblRlcm1pbmF0ZWQocHJvamVjdCk7Ci0JCWlmIChsaW1pdEV4Y2VlZGVkKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9NQVhfUkVQT1JURUQsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShtZXNzYWdlKTsKLQkJfSBlbHNlIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfVUlfUFJKVkFMSURBVEVELCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KTsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1VJX1JFU1ZBTElEQVRFRCwgbmV3IFN0cmluZ1tde3Jlc291cmNlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcCBoYXMgY2hhbmdlZC4gUGx1Z2luIHByb3ZpZGVyIGNhbiB1c2UgaXQgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkKLQkgKiBvZiB0aGUgYWN0aW9uIG9yIHRvIG1vZGlmeSBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBY3Rpb24gZGVsZWdhdGUgY2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHNlbGVjdGlvbiBjaGFuZ2VzIGJlZm9yZSBpdCBpcyBsb2FkZWQuIEZvciB0aGF0Ci0JICogcmVhc29uLCBjb250cm9sIG9mIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBzaG91bGQgYWxzbyBiZSBwZXJmb3JtZWQgdGhyb3VnaCBzaW1wbGUgWE1MIHJ1bGVzCi0JICogZGVmaW5lZCBmb3IgdGhlIGV4dGVuc2lvbiBwb2ludC4gVGhlc2UgcnVsZXMgYWxsb3cgZW5hYmxlIHN0YXRlIGNvbnRyb2wgYmVmb3JlIHRoZSBkZWxlZ2F0ZQotCSAqIGhhcyBiZWVuIGxvYWRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgcGx1Z2luIGFjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBkZXNrdG9wCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJX2N1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gZndrQWN0aXZhdGVkID0gKFZhbGlkYXRpb25QbHVnaW4uaXNBY3RpdmF0ZWQoKSAmJiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuaXNBY3RpdmF0ZWQoKSk7Ci0JCWlmIChmd2tBY3RpdmF0ZWQpIHsKLQkJCVZhbGlkYXRlQWN0aW9uIHZhY3Rpb24gPSBudWxsOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFZhbGlkYXRlQWN0aW9uKSB7Ci0JCQkJdmFjdGlvbiA9IChWYWxpZGF0ZUFjdGlvbikgYWN0aW9uOwotCQkJfQotCQkJZmluYWwgTWFwIHByb2plY3RzID0gbG9hZFNlbGVjdGVkKHZhY3Rpb24sIHRydWUpOwotCQkJaWYgKChwcm9qZWN0cyAhPSBudWxsKSAmJiAocHJvamVjdHMuc2l6ZSgpID4gMCkpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3RzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkvLyBJZiBhdCBsZWFzdCBvbmUgcHJvamVjdCBjYW4gYmUgdmFsaWRhdGVkLCBtYWtlICJlbmFibGVkIgotCQkJCQkvLyB0cnVlIGFuZAotCQkJCQkvLyBsZXQgdGhlIGRpYWxvZyB0ZWxsIHRoZSB1c2VyIHdoaWNoIHByb2plY3RzIG5lZWQgdG8gYmUKLQkJCQkJLy8gb3BlbmVkLAotCQkJCQkvLyB2YWxpZGF0b3JzIGVuYWJsZWQsIGV0Yy4KLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuaXNPcGVuKCkpKSB7Ci0JCQkJCQkvLyBJZiB0aGUgdmFsaWRhdGlvbiBwbHVnaW4gaGFzbid0IGJlZW4gYWN0aXZhdGVkIHlldCwKLQkJCQkJCS8vIGRvbid0IGFjdGl2YXRlIGl0IGp1c3QgdG8KLQkJCQkJCS8vIGZpbmQgb3V0IGlmIHRoZXJlIGFyZSB2YWxpZGF0b3JzLiBPbmx5IGFzayBpZiB0aGVyZQotCQkJCQkJLy8gYXJlIGVuYWJsZWQgdmFsaWRhdG9ycyBpZgotCQkJCQkJLy8gdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFjdGl2YXRlZC4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbldpdGhvdXRNaWdyYXRlKHByb2plY3QpOwotCQkJCQkJCWlmKCAhcHJqcC5pc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkgKXsKLQkJCQkJCQkJY291bnQgKz0gcHJqcC5udW1iZXJPZk1hbnVhbFZhbGlkYXRvcnMoKTsKLQkJCQkJCQl9CQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKTsKLQkJCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRpb25NZW51QWN0aW9uOjpzZWxlY3Rpb25DaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjb3VudCA+IDApCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoKGNvdW50ID4gMCkgfHwgKCFmd2tBY3RpdmF0ZWQpKTsgLy8gRG9uJ3QgZGlzYWJsZSB0aGUKLQkJLy8gYWN0aW9uIGp1c3QKLQkJLy8gYmVjYXVzZSB0aGUKLQkJLy8gZnJhbWV3b3JrIGhhc24ndAotCQkvLyBiZWVuIGFjdGl2YXRlZC4KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5JTmF2aWdhdG9yQWN0aW9uc0V4dGVuc2lvbiNpbml0KG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLm5hdmlnYXRvci5JTmF2aWdhdG9yRXh0ZW5zaW9uU2l0ZSkKLQkgKi8KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQkvL2luaXQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCS8vZGlzcG9zZQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgeyAKLQkJLy9pbml0Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgYW55IGZpbGVzIHRoYXQgbXVzdCBiZSBzYXZlZCBwcmlvciB0byBydW5uaW5nCi0JICogdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdHMKLQkgKiAJCQlUaGUgbGlzdCBvZiBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgdmFsaWRhdGVkLgotCSAqIEByZXR1cm4KLQkgKiAJCQlUcnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gc2F2ZWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaWxlc1RvU2F2ZShNYXAgcHJvamVjdHMpCi0JewotCSAgTGlzdCBmaWxlTGlzdCA9IGdldElGaWxlcyhwcm9qZWN0cyk7Ci0gICAgICBmaW5hbCBJRWRpdG9yUGFydFtdIGRpcnR5RWRpdG9ycyA9IFNhdmVGaWxlc0hlbHBlci5nZXREaXJ0eUVkaXRvcnMoZmlsZUxpc3QpOwotICAgICAgaWYoZGlydHlFZGl0b3JzID09IG51bGwgfHwgZGlydHlFZGl0b3JzLmxlbmd0aCA9PSAwKQotICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJvb2xlYW4gc2F2ZUF1dG9tYXRpY2FsbHkgPSBmYWxzZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzYXZlQXV0b21hdGljYWxseSA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkpLmdldFNhdmVBdXRvbWF0aWNhbGx5KCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIEluIHRoaXMgY2FzZSBzaW1wbHkgZGVmYXVsdCB0byBmYWxzZS4KLSAgICAgIH0KLSAgICAgIFNhdmVGaWxlc0RpYWxvZyBzZkRpYWxvZyA9IG51bGw7Ci0gICAgICBpZighc2F2ZUF1dG9tYXRpY2FsbHkpCi0gICAgICB7Ci0JICAgIHNmRGlhbG9nID0gbmV3IFNhdmVGaWxlc0RpYWxvZyhWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JICAgIHNmRGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoZGlydHlFZGl0b3JzKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKHNhdmVBdXRvbWF0aWNhbGx5IHx8IHNmRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spewotICAgIAkgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBjdHggPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgICAgIAotICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKXsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAkgIHRyeSB7Ci0gICAgICAgICAgICAJCSAgbW9uaXRvci5iZWdpblRhc2soVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmluZywgZGlydHlFZGl0b3JzLmxlbmd0aCk7Ci0gICAgICAgICAgICAJCSAgaW50IG51bURpcnR5RWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bURpcnR5RWRpdG9yczsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgCSAgZGlydHlFZGl0b3JzW2ldLmRvU2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJICB9IGZpbmFsbHkgewotICAgICAgICAgICAgCQkgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIAotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3R4LnJ1bihmYWxzZSwgdHJ1ZSwgcnVubmFibGUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLSAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgfQotICAgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRJRmlsZXMoTWFwIHByb2plY3RzKQotCXsKLQkJTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2V0IHByb2plY3RLZXlzID0gcHJvamVjdHMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIHByb2plY3RJdGVyID0gcHJvamVjdEtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUocHJvamVjdEl0ZXIuaGFzTmV4dCgpKQotCQl7Ci0JCSAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdEl0ZXIubmV4dCgpOwotCQkgIFNldCByZXNvdXJjZXNMaXN0ID0gKFNldCkgcHJvamVjdHMuZ2V0KHByb2plY3QpOwotCQkgIEl0ZXJhdG9yIHJlc291cmNlc0l0ZXIgPSByZXNvdXJjZXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCSAgd2hpbGUocmVzb3VyY2VzSXRlci5oYXNOZXh0KCkpCi0JCSAgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlyZXNvdXJjZXNJdGVyLm5leHQoKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JCQl7Ci0JCQkJZmlsZUxpc3QuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJcmV0dXJuIGZpbGVMaXN0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0MWNkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLldUUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhbmQgaXRzIGlubmVyIGNsYXNzZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24KLSAqIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIElWYWxpZGF0aW9uUGFnZSBfcGFnZUltcGwgPSBudWxsOwotCi0JLyoqCi0gKiBJbml0aWFsbHksIHRoaXMgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIGFzIGFuIGFic3RyYWN0IGNsYXNzLCBhbmQgZ2V0Q29udHJvbCgpIHdhcyBpbXBsZW1lbnRlZC4KLSAqIChnZXRQcm9qZWN0KCkgY291bGQgYWxzbyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlIGFic3RyYWN0IGNsYXNzLikgSG93ZXZlciwgYXQgcnVudGltZSwgYQotICogTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bjsgdGhlIGlubmVyIGNsYXNzIGhhZCBsb3N0IGl0cyBwb2ludGVyIHRvIGl0cyBlbmNsb3NpbmcgY2xhc3MuCi0gKiBBZnRlciBzb21lIGV4cGVyaW1lbnRhdGlvbiwgSSBkaXNjb3ZlcmVkIHRoYXQgaWYgSSBjaGFuZ2VkIHRoZSBwYXJlbnQgdG8gYW4gaW50ZXJmYWNlLCB0aGUKLSAqIGVuY2xvc2luZyBjbGFzcyBjb3VsZCBiZSBmb3VuZC4gKE1lcmVseSBtb3ZpbmcgdGhlIEFWYWxpZGF0aW9uUGFnZSBpbnRvIGl0cyBvd24gZmlsZSB3YXMKLSAqIGluc3VmZmljaWVudC4pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25QYWdlIHsKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCk7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0KLQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKTsgLy8gUGFnZSBpcyBsb3NpbmcgZm9jdXMgKGV2ZW50IG5vdGlmaWNhdGlvbikKLQotCXB1YmxpYyB2b2lkIGdhaW5Gb2N1cygpOyAvLyBQYWdlIGlzIGdhaW5pbmcgZm9jdXMgKGV2ZW50IG5vdGlmaWNhdGlvbikKLX0KLQotcHVibGljIGNsYXNzIEludmFsaWRQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBHcmlkTGF5b3V0IGxheW91dCA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBtZXNzYWdlTGFiZWwgPSBudWxsOwotCi0JcHVibGljIEludmFsaWRQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBhZ2UgaXMgYWRkZWQgdG8gdGhlIFByb3BlcnRpZXMgZ3VpZGUgaWYgc29tZSBpbnRlcm5hbCBwcm9ibGVtIG9jY3VycmVkOyBmb3IKLQkgKiBleGFtcGxlLCB0aGUgaGlnaGxpZ2h0ZWQgaXRlbSBpbiB0aGUgd29ya2JlbmNoIGlzIG5vdCBhbiBJUHJvamVjdCAoYWNjb3JkaW5nIHRvIHRoaXMKLQkgKiBwYWdlJ3MgcGx1Z2luLnhtbCwgdGhpcyBwYWdlIGlzIG9ubHkgdmFsaWQgd2hlbiBhbiBJUHJvamVjdCBpcyBzZWxlY3RlZCkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gRG9uJ3QgY3JlYXRlIHRoZSBkZWZhdWx0IGFuZCBhcHBseSBidXR0b25zLgotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYzEsIFNXVC5OT05FKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVkFMSURfUkVHSVNURVIpKTsKLQotCQljb21wb3NpdGUuc2V0U2l6ZShjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHRoaXMgcGFnZSBvY2N1cnMgdW5kZXIgaW52YWxpZCBjaXJjdW1zdGFuY2VzLCB0aGVyZSBpcyBub3RoaW5nIHRvIHNhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCW1lc3NhZ2VMYWJlbC5kaXNwb3NlKCk7Ci0JCS8vCQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGNvbnRlbnRzIG9mIGFueSBvdGhlciBwYWdlIGluIHRoZSB3aXphcmQsIHNvIGRvCi0JCS8vIG5vdGhpbmcuCi0JfQotCi0JcHVibGljIHZvaWQgZ2FpbkZvY3VzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiBhbnkgb3RoZXIgcGFnZSBpbiB0aGUgd2l6YXJkLCBzbyBkbwotCQkvLyBub3RoaW5nLgotCX0KLX0KLQotcHJpdmF0ZSBjbGFzcyBOb1ZhbGlkYXRvcnNQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCXByaXZhdGUgR3JpZExheW91dCBsYXlvdXQgPSBudWxsOwotCXByaXZhdGUgR3JpZERhdGEgZGF0YSA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBtZXNzYWdlTGFiZWwgPSBudWxsOwotCi0JcHVibGljIE5vVmFsaWRhdG9yc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYWdlID0gY3JlYXRlUGFnZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGlmIGFuIElQcm9qZWN0IGlzIHNlbGVjdGVkLCBidXQgdGhhdCBwcm9qZWN0IGhhcyBubyB2YWxpZGF0b3JzCi0JICogY29uZmlndXJlZCAoaS5lLiwgdGhlIHBhZ2UgaXMgdmFsaWQsIGJ1dCBhbiBlbXB0eSBsaXN0LikKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBEb24ndCBjcmVhdGUgdGhlIGRlZmF1bHQgYW5kIGFwcGx5IGJ1dHRvbnMuCi0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJLy8gdG9wIGxldmVsIGdyb3VwCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYzEsIFNXVC5OT05FKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9OT19WQUxJREFUT1JTX0lOU1RBTExFRCkpOwotCi0JCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCi0JLyoqCi0JICogU2luY2UgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMsIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQltZXNzYWdlTGFiZWwuZGlzcG9zZSgpOwotCQkvLwkJCWxheW91dC5kaXNwb3NlKCk7Ci0JCS8vCQkJZGF0YS5kaXNwb3NlKCk7Ci0JCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9zZUZvY3VzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiBhbnkgb3RoZXIgcGFnZSBpbiB0aGUgd2l6YXJkLCBzbyBkbwotCQkvLyBub3RoaW5nLgotCX0KLQotCXB1YmxpYyB2b2lkIGdhaW5Gb2N1cygpIHsKLQkJLy8gVGhpcyBwYWdlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgYW55IG90aGVyIHBhZ2UgaW4gdGhlIHdpemFyZCwgc28gZG8KLQkJLy8gbm90aGluZy4KLQl9Ci19Ci0KLXByaXZhdGUgY2xhc3MgVmFsaWRhdG9yTGlzdFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2UgPSBudWxsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLQlUYWJsZVZpZXdlciB2YWxpZGF0b3JMaXN0ID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBlbmFibGVBbGxCdXR0b24gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGRpc2FibGVBbGxCdXR0b24gPSBudWxsOwotCXByaXZhdGUgTGFiZWwgZW1wdHlSb3dQbGFjZWhvbGRlciA9IG51bGw7Ci0JQnV0dG9uIGRpc2FibGVBbGxWYWxpZGF0aW9uID0gbnVsbDsKLQlCdXR0b24gb3ZlcnJpZGVCdXR0b24gPSBudWxsOwotCUJ1dHRvbiBzYXZlQnV0dG9uID0gbnVsbDsKLQlwcml2YXRlIExhYmVsIGxpc3RMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUYWJsZSB2YWxpZGF0b3JzVGFibGU7Ci0KLQlHbG9iYWxDb25maWd1cmF0aW9uIHBhZ2VQcmVmZXJlbmNlcyA9IG51bGw7IC8vIHRoZSB2YWx1ZXMgY3VycmVudGx5IG9uIHRoZSBwYWdlLCBidXQgbm90Ci0JLy8gbmVjZXNzYXJpbHkgc3RvcmVkIHlldC4gUGFja2FnZSB2aXNpYmlsaXR5Ci0JLy8gZm9yIHRoZSB3aWRnZXQgbGlzdGVuZXJzICh0aGUgY29tcGlsZXIgd291bGQKLQkvLyBoYXZlIHRvIGNyZWF0ZSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QgaW4KLQkvLyBvcmRlciB0byBhY2Nlc3MgdGhpcyBmaWVsZCkKLQkvL3ByaXZhdGUgYm9vbGVhbiBfaXNBdXRvQnVpbGRFbmFibGVkOyAvLyBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhW10gX29sZFZtZCA9IG51bGw7IC8vIENhY2hlIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgc28gdGhhdCwgaWYKLSAgcHJpdmF0ZSBNYXAgX29sZERlbGVnYXRlcyA9IG51bGw7IC8vIENhY2hlIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGVzLgotCS8vIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB0aGlzIGxpc3QsIHRoZQotCS8vIGV4cGVuc2l2ZSB0YXNrIGxpc3QgdXBkYXRlIGNhbiBiZSBhdm9pZGVkCi0JcHJpdmF0ZSBib29sZWFuIF9hbGxvdyA9IGZhbHNlOyAvLyBDYWNoZSB0aGUgdmFsdWUgb2YgdGhlIHByZWZlbmNlICJhbGxvdyBwcm9qZWN0cyB0bwotCi0JLy8gb3ZlcnJpZGUiIHNvIHRoYXQsIHdoZW4gT0sgaXMgY2xpY2tlZCwgd2UgY2FuIGRldGVybWluZQotCS8vIGlmICJhbGxvdyIgaGFzIGNoYW5nZWQgb3Igbm90LgotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdGhlIENoZWNrYm94VGFibGVWaWV3ZXIgaW4gdGhlCi0JICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKioKLQkJICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdmlld2VyIHdoZW4gaXQgaXMgZGlzcG9zZWQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy9kaXNwb3NlCi0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4KLQkJICogZWxlbWVudC4gVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLgotCQkgKiBUaGUgcmVzdWx0IGlzIG5vdCBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCQkgKiAKLQkJICogQHBhcmFtIGlucHV0RWxlbWVudAotCQkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBlbGVtZW50Ci0JCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCQkgKi8KLQkJcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yTWV0YURhdGFbXSkgewotCQkJCS8vIFRoZSBDb2xsZWN0aW9uIGlzIHRoZSBDb2xsZWN0aW9uIHdoaWNoIGlzIHJldHVybmVkIGJ5IFZhbGlkYXRvck1hbmFnZXIncwotCQkJCS8vIGdldENvbmZpZ3VyZWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCkgY2FsbC4KLQkJCQkvLyBUaGlzIENvbGxlY3Rpb24gaXMgc2V0IHRvIGJlIHRoZSBpbnB1dCBvZiB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlciBpbgotCQkJCS8vIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSRWYWxpZGF0b3JMaXN0UGFnZSdzIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlKQotCQkJCS8vIG1ldGhvZC4KLQkJCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGlucHV0RWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhCi0JCSAqIGRpZmZlcmVudCBlbGVtZW50LgotCQkgKiA8cD4KLQkJICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0bwotCQkgKiBjaGFuZ2VzIG9uIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlcgotCQkgKiBmcm9tIHRoZSBvbGQgaW5wdXQuIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlcgotCQkgKiBwcm9wYWdhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZSB2aWV3ZXIuCi0JCSAqIDwvcD4KLQkJICogCi0JCSAqIEBwYXJhbSB2aWV3ZXIKLQkJICogICAgICAgICAgICB0aGUgdmlld2VyCi0JCSAqIEBwYXJhbSBvbGRJbnB1dAotCQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90Ci0JCSAqICAgICAgICAgICAgcHJldmlvdXNseSBoYXZlIGFuIGlucHV0Ci0JCSAqIEBwYXJhbSBuZXdJbnB1dAotCQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlCi0JCSAqICAgICAgICAgICAgYW4gaW5wdXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJLy9kbyBub3RoaW5nCi0JCX0KLQotCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UncwotCSAqIGNoZWNrYm94VGFibGVWaWV3ZXIgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCS8qKgotCQkgKiBPdmVycmlkZSB0aGUgTGFiZWxQcm92aWRlcidzIHRleHQsIGJ5IGN1c3RvbWl6aW5nIHRoZSB0ZXh0IGZvciBhIFZhbGlkYXRvck1ldGFEYXRhCi0JCSAqIGVsZW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhbGlkYXRvck1ldGFEYXRhKSB7Ci0JCQkJcmV0dXJuICgoVmFsaWRhdG9yTWV0YURhdGEpIGVsZW1lbnQpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZU5hbWUpIHsKLSAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICF2YWxpZGF0b3JzVGFibGUuaXNFbmFibGVkKCk7Ci0gICAgICBpZiAoaXNEaXNhYmxlZCkgewotICAgICAgICAgIGltYWdlTmFtZSA9IGltYWdlTmFtZSArICJfZGlzYWJsZWQiOyAgLy8kTk9OLU5MUy1OJAotICAgICAgfQotICAgICAgSW1hZ2UgaW1hZ2UgPSBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKTsKLSAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0gICAgCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJaWYoKChWYWxpZGF0b3JNZXRhRGF0YSllbGVtZW50KS5pc01hbnVhbFZhbGlkYXRpb24oKSkKLQkJCQkJcmV0dXJuICBnZXRJbWFnZSgib2tfdGJsIik7Ci0JCQkJcmV0dXJuIGdldEltYWdlKCJmYWlsX3RibCIpOwotCQkJfSAKLSAgICAgIGVsc2UgaWYoY29sdW1uSW5kZXggPT0gMikgewotCQkJCWlmKCgoVmFsaWRhdG9yTWV0YURhdGEpZWxlbWVudCkuaXNCdWlsZFZhbGlkYXRpb24oKSkKLQkJCQkJcmV0dXJuIGdldEltYWdlKCJva190YmwiKTs7Ci0JCQkJcmV0dXJuIGdldEltYWdlKCJmYWlsX3RibCIpOwotCQkJfQotICAgICAgZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKLSAgICAgIHsKLSAgICAgICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKWVsZW1lbnQ7Ci0KLSAgICAgICAgaWYgKHZtZC5pc0RlbGVnYXRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBnZXRJbWFnZSgic2V0dGluZ3MiKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLQkJCXJldHVybiBudWxsOwotCQkKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuICgoVmFsaWRhdG9yTWV0YURhdGEpIGVsZW1lbnQpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JCQl9Ci0JCQkvKmlmKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCQlpZigoKFZhbGlkYXRvck1ldGFEYXRhKWVsZW1lbnQpLmlzTWFudWFsVmFsaWRhdGlvbigpKQotCQkJCQlyZXR1cm4gQ09NQk9fVkFMVUVTWzBdOwotCQkJCXJldHVybiBDT01CT19WQUxVRVNbMV07CQotCQkJfSBlbHNlIGlmKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlpZigoKFZhbGlkYXRvck1ldGFEYXRhKWVsZW1lbnQpLmlzQnVpbGRWYWxpZGF0aW9uKCkpCi0JCQkJCXJldHVybiBDT01CT19WQUxVRVNbMF07Ci0JCQkJcmV0dXJuIENPTUJPX1ZBTFVFU1sxXTsKLQkJCX0qLwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc29ydCB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlciBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm5zIGEgbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIG51bWJlciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlyc3QgZWxlbWVudAotCQkgKiBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50LgotCQkgKiA8cD4KLQkJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBlbGVtZW50cycKLQkJICogY2F0ZWdvcmllcyBhcyBjb21wdXRlZCBieSB0aGUgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IGZyYW1ld29yayBtZXRob2QuIEVsZW1lbnRzCi0JCSAqIHdpdGhpbiB0aGUgc2FtZSBjYXRlZ29yeSBhcmUgZnVydGhlciBzdWJqZWN0ZWQgdG8gYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmUgb2YgdGhlaXIKLQkJICogbGFiZWwgc3RyaW5ncywgZWl0aGVyIGFzIGNvbXB1dGVkIGJ5IHRoZSBjb250ZW50IHZpZXdlcidzIGxhYmVsIHByb3ZpZGVyLCBvciB0aGVpcgotCQkgKiA8Y29kZT50b1N0cmluZzwvY29kZT4gdmFsdWVzIGluIG90aGVyIGNhc2VzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkJICogPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIHZpZXdlcgotCQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkJICogQHBhcmFtIGUxCi0JCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGVsZW1lbnQKLQkJICogQHBhcmFtIGUyCi0JCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBlbGVtZW50Ci0JCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudDsgdGhlCi0JCSAqICAgICAgICAgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OwotCQkgKiAgICAgICAgIGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCS8vIENhbid0IGluc3RhbnRpYXRlIFZpZXdlclNvcnRlciBiZWNhdXNlIGl0J3MgYWJzdHJhY3QsIHNvIHVzZSB0aGlzCi0JCQkvLyBpbm5lciBjbGFzcyB0byByZXByZXNlbnQgaXQuCi0JCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTGlzdFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvL19pc0F1dG9CdWlsZEVuYWJsZWQgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKTsKLQkJcGFnZVByZWZlcmVuY2VzID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSk7IC8vIFRoaXMKLQkJLy8gcmVwcmVzZW50cyB0aGUgdmFsdWVzIG9uIHRoZSBwYWdlIHRoYXQgaGF2ZW4ndCBiZWVuIHBlcnNpc3RlZHlldC4KLQkJLy8gU3RhcnQgd2l0aCB0aGUgbGFzdCB2YWx1ZXMgdGhhdCB3ZXJlIHBlcnNpc3RlZCBpbnRvIHRoZSBjdXJyZW50IHBhZ2UncyBzdGFydGluZyB2YWx1ZXMuCi0JCQotCQlfb2xkVm1kID0gcGFnZVByZWZlcmVuY2VzLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7IC8vIENhY2hlIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgc28KLQkJLy8gdGhhdCwgaWYgdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHRoaXMKLQkJLy8gbGlzdCwgdGhlIGV4cGVuc2l2ZSB0YXNrIGxpc3QKLQkJLy8gdXBkYXRlIGNhbiBiZSBhdm9pZGVkCi0KLSAgICBfb2xkRGVsZWdhdGVzID0gIG5ldyBIYXNoTWFwKHBhZ2VQcmVmZXJlbmNlcy5nZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpKTsKLQkJCi0gICAgX2FsbG93ID0gcGFnZVByZWZlcmVuY2VzLmNhblByb2plY3RzT3ZlcnJpZGUoKTsKLQotCQlwYWdlID0gY3JlYXRlUGFnZShwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0dXBUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUsIFRhYmxlVmlld2VyIHZpZXdlcikgewotCQlUYWJsZUNvbHVtbiB2YWxpZGF0b3JDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgdmFsaWRhdG9yQ29sdW1uLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkFMSURBVE9SKSk7Ci0gICAgICAgIHZhbGlkYXRvckNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICB2YWxpZGF0b3JDb2x1bW4uc2V0V2lkdGgoMzIwKTsKLSAgICAgICAgVGFibGVDb2x1bW4gbWFudWFsQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG1hbnVhbENvbHVtbi5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLk1BTlVBTCkpOwotICAgICAgICBtYW51YWxDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgbWFudWFsQ29sdW1uLnNldFdpZHRoKDQwKTsKLSAgICAgICAgVGFibGVDb2x1bW4gYnVpbGRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgYnVpbGRDb2x1bW4uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5CVUlMRCkpOwotICAgICAgICBidWlsZENvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICBidWlsZENvbHVtbi5zZXRXaWR0aCg0MCk7Ci0gICAgICAgIFRhYmxlQ29sdW1uIHNldHRpbmdzQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHNldHRpbmdzQ29sdW1uLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuU0VUVElOR1MpKTsKLSAgICAgICAgc2V0dGluZ3NDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgc2V0dGluZ3NDb2x1bW4uc2V0V2lkdGgoNTApOwotICAgIH0KLQkKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyB0b3AgbGV2ZWwgZ3JvdXAKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjMSwgU1dULk5PTkUpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOyAvLyB1c2UgdGhlIGxheW91dCdzIGRlZmF1bHQgcHJlZmVyZW5jZXMKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UpOwotCi0JCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJCi0JCUdyaWRMYXlvdXQgdmFsaWRhdG9yR3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl2YWxpZGF0b3JHcm91cExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJdmFsaWRhdG9yR3JvdXAuc2V0TGF5b3V0KHZhbGlkYXRvckdyb3VwTGF5b3V0KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YWxpZGF0b3JHcm91cCwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLQkJR3JpZERhdGEgb3ZlcnJpZGVEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWVtcHR5Um93UGxhY2Vob2xkZXIgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJZW1wdHlSb3dQbGFjZWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJZW1wdHlSb3dQbGFjZWhvbGRlciA9IG5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpOwotCQllbXB0eVJvd1BsYWNlaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwkJCi0JCQotCQlvdmVycmlkZURhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlvdmVycmlkZUJ1dHRvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW92ZXJyaWRlQnV0dG9uLnNldExheW91dERhdGEob3ZlcnJpZGVEYXRhKTsKLQkJb3ZlcnJpZGVCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX0JVVFRPTl9PVkVSUklERSkpOwotCQlvdmVycmlkZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlvdmVycmlkZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlUHJlZmVyZW5jZXMuc2V0Q2FuUHJvamVjdHNPdmVycmlkZShvdmVycmlkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG92ZXJyaWRlQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX09WRVJSSURFKTsKLQotCQllbXB0eVJvd1BsYWNlaG9sZGVyID0gbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCWVtcHR5Um93UGxhY2Vob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQotCQlHcmlkRGF0YSBkaXNhYmxlVmFsaWRhdGlvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGlzYWJsZVZhbGlkYXRpb25EYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQlkaXNhYmxlQWxsVmFsaWRhdGlvbi5zZXRMYXlvdXREYXRhKGRpc2FibGVWYWxpZGF0aW9uRGF0YSk7Ci0JCWRpc2FibGVBbGxWYWxpZGF0aW9uLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuRElTQUJMRV9WQUxJREFUSU9OKSk7Ci0JCWRpc2FibGVBbGxWYWxpZGF0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VQcmVmZXJlbmNlcy5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJZGlzYWJsZUFsbFZhbGlkYXRpb24uc2V0Rm9jdXMoKTsKLQkJCQl2YWxpZGF0b3JzVGFibGUuc2V0RW5hYmxlZCghZGlzYWJsZUFsbFZhbGlkYXRpb24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWVuYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKCFkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJZGlzYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKCFkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWVtcHR5Um93UGxhY2Vob2xkZXIgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJZW1wdHlSb3dQbGFjZWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCi0JCUdyaWREYXRhIHNhdmVGaWxlRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzYXZlRmlsZURhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzYXZlQnV0dG9uID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKLQkJc2F2ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKHNhdmVGaWxlRGF0YSk7Ci0JCXNhdmVCdXR0b24uc2V0VGV4dChWYWxpZGF0aW9uVUlNZXNzYWdlcy5QcmVmUGFnZV9hbHdheXNfc2F2ZSk7Ci0JCXNhdmVCdXR0b24uc2V0U2VsZWN0aW9uKHBhZ2VQcmVmZXJlbmNlcy5nZXRTYXZlQXV0b21hdGljYWxseSgpKTsKLQkJc2F2ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlUHJlZmVyZW5jZXMuc2V0U2F2ZUF1dG9tYXRpY2FsbHkoc2F2ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJc2F2ZUJ1dHRvbi5zZXRGb2N1cygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWVtcHR5Um93UGxhY2Vob2xkZXIgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJZW1wdHlSb3dQbGFjZWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlsaXN0TGFiZWwgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgbGlzdExhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlsaXN0TGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGlzdExhYmVsLnNldExheW91dERhdGEobGlzdExhYmVsRGF0YSk7Ci0JCWxpc3RMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlBSRUZfVkFMTElTVF9USVRMRSkpOwotCi0JCXZhbGlkYXRvcnNUYWJsZSA9IG5ldyBUYWJsZSh2YWxpZGF0b3JHcm91cCxTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxNjAsIHRydWUpKTsKLSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwLCB0cnVlKSk7Ci0gICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgdHJ1ZSkpOwotICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNDAsIHRydWUpKTsKLSAgICAKLQkJdmFsaWRhdG9yc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXZhbGlkYXRvcnNUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdmFsaWRhdG9yTGlzdCA9IG5ldyBUYWJsZVZpZXdlcih2YWxpZGF0b3JzVGFibGUpOwotICAgICAgICBHcmlkRGF0YSB2YWxpZGF0b3JMaXN0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl2YWxpZGF0b3JMaXN0RGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKLQkJdmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLnNldExheW91dERhdGEodmFsaWRhdG9yTGlzdERhdGEpOwotCQl2YWxpZGF0b3JMaXN0LnNldExhYmVsUHJvdmlkZXIobmV3IFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyKCkpOwotCQl2YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmFsaWRhdG9yTGlzdC5zZXRTb3J0ZXIobmV3IFZhbGlkYXRpb25WaWV3ZXJTb3J0ZXIoKSk7Ci0gICAgc2V0dXBUYWJsZUNvbHVtbnModmFsaWRhdG9yc1RhYmxlLHZhbGlkYXRvckxpc3QpOwotCQl2YWxpZGF0b3JMaXN0LnNldElucHV0KHBhZ2VQcmVmZXJlbmNlcy5nZXRWYWxpZGF0b3JzKCkpOwotICAgIHZhbGlkYXRvcnNUYWJsZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmJ1dHRvbiAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgIGlmICh0YWJsZUl0ZW0gPT0gbnVsbCB8fCB0YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaXRlbSBubyBsb25nZXIgZXhpc3RzCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2x1bW5OdW1iZXI7Ci0gICAgICAgIGludCBjb2x1bW5zQ291bnQgPSB2YWxpZGF0b3JzVGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKLSAgICAgICAgaWYgKGNvbHVtbnNDb3VudCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgbm8gVGFibGVDb2x1bW4sIFRhYmxlIGFjdHMgYXMgaWYgaXQgaGFzIGEgc2luZ2xlIGNvbHVtbgotICAgICAgICAgIC8vIHdoaWNoIHRha2VzIHRoZSB3aG9sZSB3aWR0aC4KLSAgICAgICAgICBjb2x1bW5OdW1iZXIgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbHVtbk51bWJlciA9IC0xOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoaSk7Ci0gICAgICAgICAgICBpZiAoYm91bmRzLmNvbnRhaW5zKGUueCwgZS55KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gaTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjb2x1bW5OdW1iZXIgPT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbHVtbkNsaWNrZWQoY29sdW1uTnVtYmVyKTsgICAgICAgICAgCi0gICAgICB9fSk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgdmFsaWRhdG9yc1RhYmxlLnNldE1lbnUoY3JlYXRlQ29udGV4dE1lbnUoKSk7Ci0gICAgdmFsaWRhdG9yc1RhYmxlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpewotCi0gICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLmZvY3VzR2FpbmVkKGUpOwotICAgICAgICBpZiAodmFsaWRhdG9yc1RhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHZhbGlkYXRvcnNUYWJsZS5zZWxlY3QoMCk7Ci0gICAgICAgIH0KLSAgICAgIH19KTsKLQotICAgIGVuYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5QVVNIKTsKLQkJZW5hYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQllbmFibGVBbGxCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX0JVVFRPTl9FTkFCTEVBTEwpKTsKLQkJZW5hYmxlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcmZvcm1FbmFibGVBbGwoKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlbmFibGVBbGxCdXR0b24sIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UpOwotCi0JCWRpc2FibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCWRpc2FibGVBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWRpc2FibGVBbGxCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX0JVVFRPTl9ESVNBQkxFQUxMKSk7Ci0JCWRpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaXNhYmxlQWxsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYnV0dG9uR3JvdXBMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChidXR0b25Hcm91cExheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQkvLyBIYXZlIHRvIHNldCB0aGUgdGFiIG9yZGVyIG9yIG9ubHkgdGhlIGZpcnN0IGNoZWNrYm94IGluIGEgQ29tcG9zaXRlIGNhbgotCQkvLyBiZSB0YWItZWQgdG8uIChTZWVtcyB0byBhcHBseSBvbmx5IHRvIGNoZWNrYm94ZXMuIEhhdmUgdG8gdXNlIHRoZSBhcnJvdwotCQkvLyBrZXkgdG8gbmF2aWdhdGUgdGhlIGNoZWNrYm94ZXMuKQotCQl2YWxpZGF0b3JHcm91cC5zZXRUYWJMaXN0KG5ldyBDb250cm9sW117b3ZlcnJpZGVCdXR0b24sIGRpc2FibGVBbGxWYWxpZGF0aW9uLCBzYXZlQnV0dG9uLCB2YWxpZGF0b3JMaXN0LmdldFRhYmxlKCksIGVuYWJsZUFsbEJ1dHRvbiwgZGlzYWJsZUFsbEJ1dHRvbn0pOwotCi0JCXVwZGF0ZVdpZGdldHMoKTsKLQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJY29tcG9zaXRlLnNldFNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotICAKLSAgcHJvdGVjdGVkIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoKQotICB7Ci0gICAgZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUodmFsaWRhdG9yc1RhYmxlLmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotICAgIGZpbmFsIE1lbnVJdGVtIG1hbnVhbEl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0gICAgbWFudWFsSXRlbS5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlBSRUZfTU5VX01BTlVBTCkpOwotICAgIGZpbmFsIE1lbnVJdGVtIGJ1aWxkSXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULkNIRUNLKTsKLSAgICBidWlsZEl0ZW0uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX01OVV9CVUlMRCkpOwotICAgIGZpbmFsIE1lbnVJdGVtIHNldHRpbmdzSXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotICAgIHNldHRpbmdzSXRlbS5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlBSRUZfTU5VX1NFVFRJTkdTKSk7Ci0gICAgCi0gICAgY2xhc3MgTWVudUl0ZW1MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgICBNZW51SXRlbSBtZW51SXRlbSA9IChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKTsKLSAgICAgICAgaW50IGluZGV4ID0gbWVudS5pbmRleE9mKG1lbnVJdGVtKSArIDE7Ci0gICAgICAgIGNvbHVtbkNsaWNrZWQoaW5kZXgpOwotICAgICAgfSAgIAotICAgIH0KLSAgICBNZW51SXRlbUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1lbnVJdGVtTGlzdGVuZXIoKTsKLSAgICBtYW51YWxJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBidWlsZEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIHNldHRpbmdzSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICBtZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsaWRhdG9yTGlzdC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIG1hbnVhbEl0ZW0uc2V0U2VsZWN0aW9uKHZtZC5pc01hbnVhbFZhbGlkYXRpb24oKSk7Ci0gICAgICAgIGJ1aWxkSXRlbS5zZXRTZWxlY3Rpb24odm1kLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotICAgICAgICBzZXR0aW5nc0l0ZW0uc2V0RW5hYmxlZCh2bWQuaXNEZWxlZ2F0aW5nKCkpOwotICAgICAgfX0pOwotICAgIAotICAgIHJldHVybiBtZW51OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29sdW1uQ2xpY2tlZChpbnQgY29sdW1uVG9FZGl0KQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2YWxpZGF0b3JMaXN0LmdldFNlbGVjdGlvbigpOwotICAgIFZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgIAotICAgIHN3aXRjaCAoY29sdW1uVG9FZGl0KQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICB2bWQuc2V0TWFudWFsVmFsaWRhdGlvbighdm1kLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHZtZC5zZXRCdWlsZFZhbGlkYXRpb24oIXZtZC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHsKLSAgICAgICAgaWYgKCF2bWQuaXNEZWxlZ2F0aW5nKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IHBhZ2VQcmVmZXJlbmNlcy5nZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kKTsKLSAgCi0gICAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgICAgRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nIGRpYWxvZyA9IG5ldyBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2coc2hlbGwsIHZtZCwgZGVsZWdhdGVJRCk7Ci0gIAotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgCi0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBwYWdlUHJlZmVyZW5jZXMuc2V0RGVsZWdhdGVVbmlxdWVOYW1lKHZtZCwgZGlhbG9nLmdldERlbGVnYXRlSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7ICAgICAgCi0gIH0JCi0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyBOZWVkIHRvIHVwZGF0ZSBldmVuIHRoZSB3aWRnZXRzIHRoYXQgZG8gbm90IGNoYW5nZSBiYXNlZCBvbiBhbm90aGVyCi0JCS8vIHdpZGdldHMgYmVjYXVzZSBvZiBwZXJmb3JtRGVmYXVsdHMoKS4gSWYgcGVyZm9ybURlZmF1bHRzKCkgaXMgc2VsZWN0ZWQsCi0JCS8vIHRoZW4gdGhlIHBhZ2VQcmVmZXJlbmNlcyB2YWx1ZXMgYXJlIHJlc2V0LCBhbmQgdGhlc2Ugd2lkZ2V0cwotCQkvLyBtaWdodCBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJdXBkYXRlVGFibGUoKTsKLQkJdXBkYXRlQWxsV2lkZ2V0cygpOwotCQl1cGRhdGVIZWxwKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHNGb3JEZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdXBkYXRlVGFibGVGb3JEZWZhdWx0cygpOwotCQl1cGRhdGVBbGxXaWRnZXRzKCk7Ci0JCXVwZGF0ZUhlbHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQWxsV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJb3ZlcnJpZGVCdXR0b24uc2V0U2VsZWN0aW9uKHBhZ2VQcmVmZXJlbmNlcy5jYW5Qcm9qZWN0c092ZXJyaWRlKCkpOwotCQlkaXNhYmxlQWxsVmFsaWRhdGlvbi5zZXRTZWxlY3Rpb24ocGFnZVByZWZlcmVuY2VzLmlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSk7Ci0JCXZhbGlkYXRvcnNUYWJsZS5zZXRFbmFibGVkKCFkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWVuYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKCFkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWRpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghZGlzYWJsZUFsbFZhbGlkYXRpb24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW0uZ2V0RGF0YSgpOwotCi0JCQkJLy8gU2hvdWxkIHRoZSB2YWxpZGF0b3IgYmUgZW5hYmxlZD8gUmVhZCB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGZyb20gbGFzdCB0aW1lLAotCQkJCS8vIGlmIHRoZXkgZXhpc3QsIGFuZCBzZXQgZnJvbSB0aGF0LiBJZiB0aGV5IGRvbid0IGV4aXN0LCB1c2UgdGhlIFZhbGlkYXRvciBjbGFzcycKLQkJCQkvLyBkZWZhdWx0IHZhbHVlLgotCQkJCWlmIChwYWdlUHJlZmVyZW5jZXMuaXNNYW51YWxFbmFibGVkKHZtZCkpCi0JCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJdm1kLnNldE1hbnVhbFZhbGlkYXRpb24oZmFsc2UpOwotCQkJCWlmIChwYWdlUHJlZmVyZW5jZXMuaXNCdWlsZEVuYWJsZWQodm1kKSkKLQkJCQkJdm1kLnNldEJ1aWxkVmFsaWRhdGlvbih0cnVlKTsKLQkJCQllbHNlCi0JCQkJCXZtZC5zZXRCdWlsZFZhbGlkYXRpb24oZmFsc2UpOwotCi0JCQl9Ci0JCXZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWJsZUZvckRlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtLmdldERhdGEoKTsKLQotCQkJLy8gU2hvdWxkIHRoZSB2YWxpZGF0b3IgYmUgZW5hYmxlZD8gUmVhZCB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGZyb20gbGFzdCB0aW1lLAotCQkJLy8gaWYgdGhleSBleGlzdCwgYW5kIHNldCBmcm9tIHRoYXQuIElmIHRoZXkgZG9uJ3QgZXhpc3QsIHVzZSB0aGUgVmFsaWRhdG9yIGNsYXNzJwotCQkJLy8gZGVmYXVsdCB2YWx1ZS4KLQkJCWlmKHBhZ2VQcmVmZXJlbmNlcy5pc0VuYWJsZWQodm1kKSkgewotCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKHRydWUpOwotCQkJCXZtZC5zZXRCdWlsZFZhbGlkYXRpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCX0KLQkJfQotCQl2YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlTWFudWFsQW5kQnVpbGRWYWx1ZXMoKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJdm1kLnNldE1hbnVhbFZhbGlkYXRpb24odHJ1ZSk7Ci0JCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKHRydWUpOwotCQl9Ci0JCXZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlTWFudWFsQW5kQnVpbGRWYWx1ZXMoKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJdm1kLnNldE1hbnVhbFZhbGlkYXRpb24oZmFsc2UpOwotCQkJdm1kLnNldEJ1aWxkVmFsaWRhdGlvbihmYWxzZSk7Ci0JCX0KLQkJdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJdXBkYXRlVGFza0xpc3QoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlwYWdlUHJlZmVyZW5jZXMucmVzZXRUb0RlZmF1bHQoKTsKLQkJdXBkYXRlV2lkZ2V0c0ZvckRlZmF1bHRzKCk7Ci0JCWdldERlZmF1bHRzQnV0dG9uKCkuc2V0Rm9jdXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUVuYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc2V0QWxsVmFsaWRhdG9ycyh0cnVlKTsKLQkJcGFnZVByZWZlcmVuY2VzLnNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQllbmFibGVNYW51YWxBbmRCdWlsZFZhbHVlcygpOwotCQllbmFibGVBbGxCdXR0b24uc2V0Rm9jdXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFsbFZhbGlkYXRvcnMoYm9vbGVhbiBib29sKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZhbGlkYXRvck1ldGFEYXRhID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQl2YWxpZGF0b3JNZXRhRGF0YS5zZXRNYW51YWxWYWxpZGF0aW9uKGJvb2wpOwotCQkJdmFsaWRhdG9yTWV0YURhdGEuc2V0QnVpbGRWYWxpZGF0aW9uKGJvb2wpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzKCkgewotCQlMaXN0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2YWxpZGF0b3JNZXRhRGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYodmFsaWRhdG9yTWV0YURhdGEuaXNNYW51YWxWYWxpZGF0aW9uKCkgfHwgdmFsaWRhdG9yTWV0YURhdGEuaXNCdWlsZFZhbGlkYXRpb24oKSkKLQkJCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodmFsaWRhdG9yTWV0YURhdGEpOwotCQl9Ci0JCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSllbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkVmFsaWRhdG9ycy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoKSB7Ci0JCUxpc3QgZW5hYmxlZFZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZhbGlkYXRvck1ldGFEYXRhID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQlpZih2YWxpZGF0b3JNZXRhRGF0YS5pc01hbnVhbFZhbGlkYXRpb24oKSkKLQkJCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodmFsaWRhdG9yTWV0YURhdGEpOwotCQl9Ci0JCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSllbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkVmFsaWRhdG9ycy5zaXplKCldKTsKLQkKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycygpIHsKLQkJTGlzdCBlbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSB2YWxpZGF0b3JzVGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdmFsaWRhdG9yTWV0YURhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCWlmKHZhbGlkYXRvck1ldGFEYXRhLmlzQnVpbGRWYWxpZGF0aW9uKCkpCi0JCQkJZW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvck1ldGFEYXRhKTsKLQkJfQotCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pZW5hYmxlZFZhbGlkYXRvcnMudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbZW5hYmxlZFZhbGlkYXRvcnMuc2l6ZSgpXSk7Ci0JCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybURpc2FibGVBbGwoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXNldEFsbFZhbGlkYXRvcnMoZmFsc2UpOwotCQlwYWdlUHJlZmVyZW5jZXMuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCWRpc2FibGVNYW51YWxBbmRCdWlsZFZhbHVlcygpOwotCQlkaXNhYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlbHAoKSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlzYWJsZUFsbFZhbGlkYXRpb24sIENvbnRleHRJZHMuVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfRElTQUJMRV9BTExfRU5BQkxFRCk7Ci0JfQotCi0JLyoKLQkgKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGludG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlwYWdlUHJlZmVyZW5jZXMuc2V0Q2FuUHJvamVjdHNPdmVycmlkZShvdmVycmlkZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQlpZiAoZGlzYWJsZUFsbFZhbGlkYXRpb24uaXNFbmFibGVkKCkpIHsKLQkJCXBhZ2VQcmVmZXJlbmNlcy5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJLy9wYWdlUHJlZmVyZW5jZXMuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCQotCQlwYWdlUHJlZmVyZW5jZXMuc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoKSk7Ci0JCQotCQlwYWdlUHJlZmVyZW5jZXMuc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKCkpOwotCi0JCXBhZ2VQcmVmZXJlbmNlcy5wYXNzaXZhdGUoKTsKLQkJcGFnZVByZWZlcmVuY2VzLnN0b3JlKCk7Ci0JCQotCQkvLyBJZiB0aGUgcHJvamVjdHMgYXJlbid0IGFsbG93ZWQgdG8gb3ZlcnJpZGUsIGNsZWFyIHRoZWlyIHNldHRpbmdzLgotCQlpZiAoIXBhZ2VQcmVmZXJlbmNlcy5jYW5Qcm9qZWN0c092ZXJyaWRlKCkpIHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJCWlmIChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNNaWdyYXRlZChwcm9qZWN0KSkgewotCQkJCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJCQkJcHJqcC5zZXREb2VzUHJvamVjdE92ZXJyaWRlKGZhbHNlKTsKLQkJCQkJCQlwcmpwLnBhc3NpdmF0ZSgpOwotCQkJCQkJCXByanAuc3RvcmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXNrTGlzdCgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWJvb2xlYW4gYWxsb3dDaGFuZ2VkID0gKHBhZ2VQcmVmZXJlbmNlcy5jYW5Qcm9qZWN0c092ZXJyaWRlKCkgIT0gX2FsbG93KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJdHJ5IHsKLQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQlpZiAoIXByanAuZG9lc1Byb2plY3RPdmVycmlkZSgpICYmIChwcmpwLmhhc0VuYWJsZWRWYWxpZGF0b3JzQ2hhbmdlZChfb2xkVm1kLCBhbGxvd0NoYW5nZWQpIHx8IHRydWUpICYmIAotICAgICAgICAgICAgICAocHJqcC5oYXZlRGVsZWdhdGVzQ2hhbmdlZChfb2xkRGVsZWdhdGVzLCBhbGxvd0NoYW5nZWQpIHx8IHRydWUpKSB7Ci0JCQkJCQkvLyBJZiB0aGUgcHJvamVjdCB1c2VkIHRvIG92ZXJyaWRlIHRoZSBwcmVmZXJlbmNlcywgYW5kIHRoZSBwcmVmZXJlbmNlcwotCQkJCQkJLy8gbWFrZSB0aGF0IGltcG9zc2libGUgbm93LCB0aGVuIHVwZGF0ZSB0aGUgdGFzayBsaXN0LgotCQkJCQkJLy8KLQkJCQkJCS8vIElmIHRoZSBwcmVmZXJlbmNlcyBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSwgYW5kIHRoZXkgZG9uJ3QsIGFuZCBpZgotCQkJCQkJLy8gdGhlIHZhbGlkYXRvcnMgaGF2ZSBjaGFuZ2VkLCB0aGVuIHVwZGF0ZSB0aGUgdGFzayBsaXN0LgotCQkJCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkudXBkYXRlVGFza0xpc3QocHJvamVjdCk7IC8vIERvIG5vdCByZW1vdmUKLQkJCQkJCS8vIHRoZSBleGNlZWRlZCBtZXNzYWdlOyBvbmx5IFZhbGlkYXRpb25PcGVyYXRpb24gc2hvdWxkIGRvIHRoYXQKLQkJCQkJCS8vIGJlY2F1c2UgaXQncyBhYm91dCB0byBydW4gdmFsaWRhdGlvbi4gSWYgdGhlIGxpbWl0IGlzIGluY3JlYXNlZCwgCi0JCQkJCQkvL21lc3NhZ2VzIG1heSBzdGlsbCBiZSBtaXNzaW5nLCBzbyBkb24ndCByZW1vdmUgdGhlICJtZXNzYWdlcwotCQkJCQkJLy8gbWF5IGJlIG1pc3NpbmciIG1lc3NhZ2UuCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbGlzdExhYmVsLmRpc3Bvc2UoKTsKLQkJb3ZlcnJpZGVCdXR0b24uZGlzcG9zZSgpOwotCQlkaXNhYmxlQWxsVmFsaWRhdGlvbi5kaXNwb3NlKCk7Ci0JCWVtcHR5Um93UGxhY2Vob2xkZXIuZGlzcG9zZSgpOwotCQlkaXNhYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJZW5hYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJdmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLmRpc3Bvc2UoKTsKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2VzIG5vdCBuZWVkIHRvIGNhY2hlIGFueXRoaW5nIGJlZm9yZSBpdCBsb3NlcyBmb2N1cy4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7LyoKLQkJLy8gVGhpcyBwYWdlIGRlcGVuZHMgb24gdGhlIFdvcmtiZW5jaCBQcmVmZXJlbmNlIHBhZ2UsIHNvIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlCi0JCS8vIGlzQXV0b0J1aWxkIChpbiBjYXNlIHRoZSB3b3JrYmVuY2ggcGFnZSdzIHZhbHVlIGhhcyBjaGFuZ2VkKSwgYW5kIHRoZW4gdXBkYXRlCi0JCS8vIHRoaXMgcGFnZSdzIHdpZGdldHMuCi0JCXRyeSB7Ci0JCQkvL19pc0F1dG9CdWlsZEVuYWJsZWQgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKTsKLQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJfQotCSovfQotfQotCi0vKgotICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0gKi8KLXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQl0cnkgewotCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGdwLm51bWJlck9mVmFsaWRhdG9ycygpID09IDApIHsKLQkJCV9wYWdlSW1wbCA9IG5ldyBOb1ZhbGlkYXRvcnNQYWdlKHBhcmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCV9wYWdlSW1wbCA9IG5ldyBWYWxpZGF0b3JMaXN0UGFnZShwYXJlbnQpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlfcGFnZUltcGwgPSBuZXcgSW52YWxpZFBhZ2UocGFyZW50KTsKLQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJX3BhZ2VJbXBsID0gbmV3IEludmFsaWRQYWdlKHBhcmVudCk7Ci0JCQkJZGlzcGxheUFuZExvZ0Vycm9yKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfVElUTEUpLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpLCBleGMpOwotCQkJfQotCQl9Ci0JfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJX3BhZ2VJbXBsID0gbmV3IEludmFsaWRQYWdlKHBhcmVudCk7Ci0JCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCV9wYWdlSW1wbCA9IG5ldyBJbnZhbGlkUGFnZShwYXJlbnQpOwotCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JfQotCi0JcmV0dXJuIF9wYWdlSW1wbC5nZXRDb250cm9sKCk7Ci19Ci0KLS8qCi0gKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KElXb3JrYmVuY2gpCi0gKi8KLXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkvL2luaXQKLX0KLQotcHJvdGVjdGVkIHZvaWQgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKSB7Ci0Jc3VwZXIubm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLX0KLQotLyoqCi0gKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAqIDxwPgotICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3VibGNhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuIHRoZSBEZWZhdWx0cyBidXR0b24KLSAqIGhhcyBiZWVuIHByZXNzZWQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLCBidXQgc2hvdWxkIGNhbGwgPGNvZGU+c3VwZXIucGVyZm9ybURlZmF1bHRzPC9jb2RlPi4KLSAqIDwvcD4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JdHJ5IHsKLQkJX3BhZ2VJbXBsLnBlcmZvcm1EZWZhdWx0cygpOwotCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQl9Ci19Ci0KLS8qKgotICogV2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSAiT0siIG9yICJBcHBseSIgYnV0dG9uIG9uIHRoZSBQcm9wZXJ0aWVzIEd1aWRlL1Byb3BlcnRpZXMgUGFnZSwKLSAqIHJlc3BlY3RpdmVseSwgc29tZSBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBieSB0aGlzIFByb3BlcnR5UGFnZS4gSWYgdGhlIHBhZ2UgaXMgZm91bmQsIGFuZAotICogY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdHJ1ZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBmYWxzZSBpcyByZXR1cm5lZCwgYW5kIHRoZSBndWlkZSBkb2Vzbid0Ci0gKiBmaW5pc2guCi0gKi8KLXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQl0cnkgewotCQlyZXR1cm4gX3BhZ2VJbXBsLnBlcmZvcm1PaygpOwotCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJZGlzcGxheUFuZExvZ0Vycm9yKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfVElUTEUpLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpLCBleGMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi0vKioKLSAqIFNpbmNlIHRoZSBwYWdlcyBhcmUgaW5uZXIgY2xhc3NlcyBvZiBhIGNoaWxkIFByZWZlcmVuY2VQYWdlLCBub3QgYSBQcmVmZXJlbmNlUGFnZSBpdHNlbGYsCi0gKiBEaWFsb2dQYWdlJ3MgYXV0b21hdGljIGRpc3Bvc2FsIG9mIGl0cyBjaGlsZHJlbidzIHdpZGdldHMgY2Fubm90IGJlIHVzZWQuIEluc3RlYWQsIGRpc3Bvc2Ugb2YKLSAqIGVhY2ggaW5uZXIgY2xhc3MnIHdpZGdldHMgZXhwbGljaXRseS4KLSAqLwotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlzdXBlci5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaWYgKF9wYWdlSW1wbCAhPSBudWxsKSB7Ci0JCQlfcGFnZUltcGwuZGlzcG9zZSgpOwotCQl9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgbG9nRXJyb3IoVGhyb3dhYmxlIGV4YykgewotCUxvZ2dlciBsb2dnZXIgPSBXVFBVSVBsdWdpbi5nZXRMb2dnZXIoKTsKLQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmRpc3BsYXlBbmRMb2dFcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpOwotCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCWlmIChleGMgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQlpZiAoKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleGMpLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleGMpLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogcGFja2FnZSB2aXNpYmlsaXR5IGJlY2F1c2UgaWYgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgdGhlbiB0aGUgY29tcGlsZXIgbmVlZHMgdG8gY3JlYXRlIGEKLSAqIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBpbnRlcm5hbCBjbGFzc2VzLCBhbmQgdGhhdCBjYW4gaGF2ZSBwZXJmb3JtYW5jZQotICogaW1wbGljYXRpb25zLgotICovCi12b2lkIGRpc3BsYXlBbmRMb2dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjKSB7Ci0JbG9nRXJyb3IoZXhjKTsKLQlkaXNwbGF5TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5JQ09OX0VSUk9SKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBpSWNvblR5cGUpIHsKLQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLCBvcmcuZWNsaXBzZS5zd3QuU1dULk9LIHwgaUljb25UeXBlIHwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JbWVzc2FnZUJveC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCW1lc3NhZ2VCb3guc2V0VGV4dCh0aXRsZSk7Ci0JbWVzc2FnZUJveC5vcGVuKCk7Ci19Ci0KLS8qKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLSAqLwotcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCWlmIChfcGFnZUltcGwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWlmICh2aXNpYmxlKSB7Ci0JCV9wYWdlSW1wbC5nYWluRm9jdXMoKTsKLQl9IGVsc2UgewotCQlfcGFnZUltcGwubG9zZUZvY3VzKCk7Ci0JfQotfQotCi0vKioKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNnZXREZWZhdWx0c0J1dHRvbigpCi0gKi8KLXByb3RlY3RlZCBCdXR0b24gZ2V0RGVmYXVsdHNCdXR0b24oKSB7Ci0JcmV0dXJuIHN1cGVyLmdldERlZmF1bHRzQnV0dG9uKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmJjM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFuZCBpdHMgaW5uZXIgY2xhc3NlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbgotICogZnJhbWV3b3JrLgotICogCi0gKiBUaGlzIHBhZ2UgaW1wbGVtZW50cyB0aGUgUHJvcGVydHlQYWdlIGZvciB2YWxpZGF0b3JzOyB2aWV3ZWQgd2hlbiB0aGUgdXNlciByaWdodC1jbGlja3Mgb24gdGhlCi0gKiBJUHJvamVjdCwgc2VsZWN0cyAiUHJvcGVydGllcyIsIGFuZCB0aGVuICJWYWxpZGF0aW9uLiIKLSAqIAotICogVGhlcmUgZXhpc3QgdGhyZWUgcG9zc2libGUgcGFnZSBsYXlvdXRzOiBpZiB0aGVyZSBpcyBhbiBlY2xpcHNlIGludGVybmFsIGVycm9yLCBhbmQgdGhlIHBhZ2UgaXMKLSAqIGJyb3VnaHQgdXAgb24gYSBub24tSVByb2plY3QgdHlwZTsgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiB0aGF0IHR5cGUgb2YKLSAqIElQcm9qZWN0LCBhbmQgYSBwYWdlIHdoaWNoIGxpc3RzIGFsbCB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gdGhhdCB0eXBlIG9mIElQcm9qZWN0LiBUaGVzZSB0aHJlZQotICogcGFnZXMgYXJlIGltcGxlbWVudGVkIGFzIGlubmVyIGNsYXNzZXMsIHNvIHRoYXQgaXQncyBjbGVhciB3aGljaCBtZXRob2QgaXMgbmVlZGVkIGZvciB3aGljaAotICogaW5wdXQuIFdoZW4gYWxsIG9mIHRoZSBtZXRob2RzLCBhbmQgYmVoYXZpb3VyLCB3ZXJlIGltcGxlbWVudGVkIGluIHRoaXMgb25lIGNsYXNzLCBtdWNoIG1vcmUKLSAqIGVycm9yLWNoZWNraW5nIGhhZCB0byBiZSBkb25lLCB0byBlbnN1cmUgdGhhdCB0aGUgbWV0aG9kIHdhc24ndCBiZWluZyBjYWxsZWQgaW5jb3JyZWN0bHkgYnkgb25lCi0gKiBvZiB0aGUgcGFnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORV9BTkRfVEFCID0gTkVXTElORSArIFRBQjsKLQlwcml2YXRlIElWYWxpZGF0aW9uUGFnZSBfcGFnZUltcGwgPSBudWxsOwotCi0JLyoqCi0JICogSW5pdGlhbGx5LCB0aGlzIGludGVyZmFjZSB3YXMgY3JlYXRlZCBhcyBhbiBhYnN0cmFjdCBjbGFzcywgYW5kIGdldENvbnRyb2woKSB3YXMgaW1wbGVtZW50ZWQuCi0JICogKGdldFByb2plY3QoKSBjb3VsZCBhbHNvIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGUgYWJzdHJhY3QgY2xhc3MuKSBIb3dldmVyLCBhdCBydW50aW1lLCBhCi0JICogTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bjsgdGhlIGlubmVyIGNsYXNzIGhhZCBsb3N0IGl0cyBwb2ludGVyIHRvIGl0cyBlbmNsb3NpbmcgY2xhc3MuCi0JICogQWZ0ZXIgc29tZSBleHBlcmltZW50YXRpb24sIEkgZGlzY292ZXJlZCB0aGF0IGlmIEkgY2hhbmdlZCB0aGUgcGFyZW50IHRvIGFuIGludGVyZmFjZSwgdGhlCi0JICogZW5jbG9zaW5nIGNsYXNzIGNvdWxkIGJlIGZvdW5kLiAoTWVyZWx5IG1vdmluZyB0aGUgQVZhbGlkYXRpb25QYWdlIGludG8gaXRzIG93biBmaWxlIHdhcwotCSAqIGluc3VmZmljaWVudC4pCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJVmFsaWRhdGlvblBhZ2UgewotCQlwdWJsaWMgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0JCQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKTsKLQotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBJbnZhbGlkUGFnZSBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUGFnZSB7Ci0JCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2UgPSBudWxsOwotCi0JCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0JCXByaXZhdGUgR3JpZExheW91dCBsYXlvdXQgPSBudWxsOwotCQlwcml2YXRlIExhYmVsIG1lc3NhZ2VMYWJlbCA9IG51bGw7Ci0KLQkJcHVibGljIEludmFsaWRQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXBhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBwYWdlIGlzIGFkZGVkIHRvIHRoZSBQcm9wZXJ0aWVzIGd1aWRlIGlmIHNvbWUgaW50ZXJuYWwgcHJvYmxlbSBvY2N1cnJlZDsgZm9yCi0JCSAqIGV4YW1wbGUsIHRoZSBoaWdobGlnaHRlZCBpdGVtIGluIHRoZSB3b3JrYmVuY2ggaXMgbm90IGFuIElQcm9qZWN0IChhY2NvcmRpbmcgdG8gdGhpcwotCQkgKiBwYWdlJ3MgcGx1Z2luLnhtbCwgdGhpcyBwYWdlIGlzIG9ubHkgdmFsaWQgd2hlbiBhbiBJUHJvamVjdCBpcyBzZWxlY3RlZCkuCi0JCSAqLwotCQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gRG9uJ3QgY3JlYXRlIHRoZSBkZWZhdWx0IGFuZCBhcHBseSBidXR0b25zLgotCQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQotCQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7Ci0JCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFKTsKLQotCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSKSk7Ci0KLQkJCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHRoaXMgcGFnZSBvY2N1cnMgdW5kZXIgaW52YWxpZCBjaXJjdW1zdGFuY2VzLCB0aGVyZSBpcyBub3RoaW5nIHRvIHNhdmUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCW1lc3NhZ2VMYWJlbC5kaXNwb3NlKCk7Ci0JCQkvLwkJCWxheW91dC5kaXNwb3NlKCk7Ci0JCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIE5vVmFsaWRhdG9yc1BhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKLQotCQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCQlwcml2YXRlIEdyaWRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQkJcHJpdmF0ZSBHcmlkRGF0YSBkYXRhID0gbnVsbDsKLQkJcHJpdmF0ZSBMYWJlbCBtZXNzYWdlTGFiZWwgPSBudWxsOwotCQkKLQkJcHVibGljIE5vVmFsaWRhdG9yc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBpZiBhbiBJUHJvamVjdCBpcyBzZWxlY3RlZCwgYnV0IHRoYXQgcHJvamVjdCBoYXMgbm8gdmFsaWRhdG9ycwotCQkgKiBjb25maWd1cmVkIChpLmUuLCB0aGUgcGFnZSBpcyB2YWxpZCwgYnV0IGFuIGVtcHR5IGxpc3QuKQotCQkgKi8KLQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIERvbid0IGNyZWF0ZSB0aGUgZGVmYXVsdCBhbmQgYXBwbHkgYnV0dG9ucy4KLQkJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJCS8vIHRvcCBsZXZlbCBncm91cAotCQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7Ci0JCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFKTsKLQotCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9MQkxfTk9WQUxJREFUT1JTX0RFU0MsIG1zZ1Bhcm0pKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB0aGVyZSBhcmUgbm8gdmFsaWRhdG9ycywgdGhlcmUgaXMgbm90aGluZyB0byBzYXZlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQltZXNzYWdlTGFiZWwuZGlzcG9zZSgpOwotCQkJLy8JCQlsYXlvdXQuZGlzcG9zZSgpOwotCQkJLy8JCQlkYXRhLmRpc3Bvc2UoKTsKLQkJCWNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVmFsaWRhdG9yTGlzdFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgewotCQlDb21wb3NpdGUgcGFnZSA9IG51bGw7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQkJR3JpZERhdGEgZGF0YSA9IG51bGw7Ci0JCUxhYmVsIG1lc3NhZ2VMYWJlbCA9IG51bGw7Ci0JCVRhYmxlVmlld2VyIHZhbGlkYXRvckxpc3QgPSBudWxsOwotCQlCdXR0b24gb3ZlcnJpZGVHbG9iYWxCdXR0b24gPSBudWxsOwotCQlib29sZWFuIGV4aXN0aW5nT3ZlcnJpZGVHbG9iYWxWYWwgPSBmYWxzZTsKLQkJQnV0dG9uIGRpc2FibGVBbGxWYWxpZGF0aW9uID0gbnVsbDsKLQkJYm9vbGVhbiBleGlzdGluZ0Rpc2FibGVBbGxWYWxpZGF0aW9uID0gZmFsc2U7Ci0JCXByaXZhdGUgQnV0dG9uIGVuYWJsZUFsbEJ1dHRvbiA9IG51bGw7Ci0JCXByaXZhdGUgQnV0dG9uIGRpc2FibGVBbGxCdXR0b24gPSBudWxsOwotCQlMYWJlbCBlbXB0eVJvd1BsYWNlaG9sZGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBUYWJsZSB2YWxpZGF0b3JzVGFibGU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIHBhZ2VQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBjYW5PdmVycmlkZSA9IGZhbHNlOwotCQlwcml2YXRlIEJ1dHRvbiBhZGRWYWxpZGF0aW9uQnVpbGRlciA9IG51bGw7Ci0JCXByaXZhdGUgQ29sb3IgY29sb3IgPSBudWxsOwotCi0JCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBvbGRWbWQgPSBudWxsOyAvLyBDYWNoZSB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHNvIHRoYXQsIGlmIHRoZXJlCi0gICAgcHJpdmF0ZSBNYXAgb2xkRGVsZWdhdGVzID0gbnVsbDsgLy8gQ2FjaGUgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZXMuCi0KLQkJLy8gaXMgbm8gY2hhbmdlIHRvIHRoaXMgbGlzdCwgdGhlIGV4cGVuc2l2ZSB0YXNrCi0JCS8vIGxpc3QgdXBkYXRlIGNhbiBiZSBhdm9pZGVkCi0KLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHRoZSBDaGVja2JveFRhYmxlVmlld2VyIGluIHRoZQotCQkgKiBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJCS8qKgotCQkJICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdmlld2VyIHdoZW4gaXQgaXMgZGlzcG9zZWQuCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9kaXNwb3NlCi0JCQl9Ci0KLQkJCS8qKgotCQkJICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyIHdoZW4gaXRzIGlucHV0IGlzIHNldCB0byB0aGUgZ2l2ZW4KLQkJCSAqIGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkJCSAqIFRoZSByZXN1bHQgaXMgbm90IG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JCQkgKiAKLQkJCSAqIEBwYXJhbSBpbnB1dEVsZW1lbnQKLQkJCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkJCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCQkJICovCi0JCQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yTWV0YURhdGFbXSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdG9yTWV0YURhdGFbXSBpcyB0aGUgYXJyYXkgd2hpY2ggaXMgcmV0dXJuZWQgYnkgVmFsaWRhdG9yTWFuYWdlcidzCi0JCQkJCS8vIGdldENvbmZpZ3VyZWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCkgY2FsbC4KLQkJCQkJLy8gVGhpcyBhcnJheSBpcyBzZXQgdG8gYmUgdGhlIGlucHV0IG9mIHRoZSBDaGVja2JveFRhYmxlVmlld2VyIGluCi0JCQkJCS8vIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSRWYWxpZGF0b3JMaXN0UGFnZSdzIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlKQotCQkJCQkvLyBtZXRob2QuCi0JCQkJCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSkgaW5wdXRFbGVtZW50OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYQotCQkJICogZGlmZmVyZW50IGVsZW1lbnQuCi0JCQkgKiA8cD4KLQkJCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIgdG8KLQkJCSAqIGNoYW5nZXMgb24gdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyCi0JCQkgKiBmcm9tIHRoZSBvbGQgaW5wdXQuIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlcgotCQkJICogcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUgdmlld2VyLgotCQkJICogPC9wPgotCQkJICogCi0JCQkgKiBAcGFyYW0gdmlld2VyCi0JCQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkJCSAqIEBwYXJhbSBvbGRJbnB1dAotCQkJICogICAgICAgICAgICB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZGlkIG5vdAotCQkJICogICAgICAgICAgICBwcmV2aW91c2x5IGhhdmUgYW4gaW5wdXQKLQkJCSAqIEBwYXJhbSBuZXdJbnB1dAotCQkJICogICAgICAgICAgICB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIgZG9lcyBub3QgaGF2ZQotCQkJICogICAgICAgICAgICBhbiBpbnB1dAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQotCi0KLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UncwotCQkgKiBjaGVja2JveFRhYmxlVmlld2VyIGVsZW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCQkvKioKLQkJCSAqIE92ZXJyaWRlIHRoZSBMYWJlbFByb3ZpZGVyJ3MgdGV4dCwgYnkgY3VzdG9taXppbmcgdGhlIHRleHQgZm9yIGEgVmFsaWRhdG9yTWV0YURhdGEKLQkJCSAqIGVsZW1lbnQuCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yTWV0YURhdGEpIHsKLQkJCQkJcmV0dXJuICgoVmFsaWRhdG9yTWV0YURhdGEpIGVsZW1lbnQpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCWlmKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQkJcmV0dXJuICgoVmFsaWRhdG9yTWV0YURhdGEpIGVsZW1lbnQpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JCQkJfQotCQkJCS8qaWYoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCQlpZigoKFZhbGlkYXRvck1ldGFEYXRhKWVsZW1lbnQpLmlzTWFudWFsVmFsaWRhdGlvbigpKQotCQkJCQkJcmV0dXJuIEVOQUJMRUQ7Ci0JCQkJCXJldHVybiBESVNBQkxFRDsJCi0JCQkJfSBlbHNlIGlmKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQkJaWYoKChWYWxpZGF0b3JNZXRhRGF0YSllbGVtZW50KS5pc0J1aWxkVmFsaWRhdGlvbigpKQotCQkJCQkJcmV0dXJuIEVOQUJMRUQ7Ci0JCQkJCXJldHVybiBESVNBQkxFRDsKLQkJCQl9Ki8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotICAgICAgcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXNhYmxlZCA9ICF2YWxpZGF0b3JzVGFibGUuaXNFbmFibGVkKCk7Ci0gICAgICAgIGlmIChpc0Rpc2FibGVkKSB7Ci0gICAgICAgICAgICBpbWFnZU5hbWUgPSBpbWFnZU5hbWUgKyAiX2Rpc2FibGVkIjsgIC8vJE5PTi1OTFMtTiQKLSAgICAgICAgfQotICAgICAgICBJbWFnZSBpbWFnZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICB9Ci0gICAgICAKLQotICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlpZihjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQkJCWlmKCgoVmFsaWRhdG9yTWV0YURhdGEpZWxlbWVudCkuaXNNYW51YWxWYWxpZGF0aW9uKCkpCi0JCQkJCQlyZXR1cm4gIGdldEltYWdlKCJva190YmwiKTsKLQkJCQkJcmV0dXJuIGdldEltYWdlKCJmYWlsX3RibCIpOwotCQkJCX0gZWxzZSBpZihjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJCWlmKCgoVmFsaWRhdG9yTWV0YURhdGEpZWxlbWVudCkuaXNCdWlsZFZhbGlkYXRpb24oKSkKLQkJCQkJCXJldHVybiBnZXRJbWFnZSgib2tfdGJsIik7OwotCQkJCQlyZXR1cm4gZ2V0SW1hZ2UoImZhaWxfdGJsIik7Ci0JCQkJfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKWVsZW1lbnQ7Ci0KLSAgICAgICAgICBpZiAodm1kLmlzRGVsZWdhdGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZSgic2V0dGluZ3MiKTsgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNvcnQgdGhlIENoZWNrYm94VGFibGVWaWV3ZXIgZWxlbWVudHMuCi0JCSAqLwotCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCQkvKioKLQkJCSAqIFJldHVybnMgYSBuZWdhdGl2ZSwgemVybywgb3IgcG9zaXRpdmUgbnVtYmVyIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBlbGVtZW50Ci0JCQkgKiBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50LgotCQkJICogPHA+Ci0JCQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIGVsZW1lbnRzJwotCQkJICogY2F0ZWdvcmllcyBhcyBjb21wdXRlZCBieSB0aGUgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IGZyYW1ld29yayBtZXRob2QuIEVsZW1lbnRzCi0JCQkgKiB3aXRoaW4gdGhlIHNhbWUgY2F0ZWdvcnkgYXJlIGZ1cnRoZXIgc3ViamVjdGVkIHRvIGEgY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJlIG9mIHRoZWlyCi0JCQkgKiBsYWJlbCBzdHJpbmdzLCBlaXRoZXIgYXMgY29tcHV0ZWQgYnkgdGhlIGNvbnRlbnQgdmlld2VyJ3MgbGFiZWwgcHJvdmlkZXIsIG9yIHRoZWlyCi0JCQkgKiA8Y29kZT50b1N0cmluZzwvY29kZT4gdmFsdWVzIGluIG90aGVyIGNhc2VzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkJCSAqIDwvcD4KLQkJCSAqIAotCQkJICogQHBhcmFtIHZpZXdlcgotCQkJICogICAgICAgICAgICB0aGUgdmlld2VyCi0JCQkgKiBAcGFyYW0gZTEKLQkJCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGVsZW1lbnQKLQkJCSAqIEBwYXJhbSBlMgotCQkJICogICAgICAgICAgICB0aGUgc2Vjb25kIGVsZW1lbnQKLQkJCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgZWxlbWVudDsgdGhlCi0JCQkgKiAgICAgICAgIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGVxdWFsIHRvIHRoZSBzZWNvbmQgZWxlbWVudDsKLQkJCSAqICAgICAgICAgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLQkJCSAqLwotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJLy8gQ2FuJ3QgaW5zdGFudGlhdGUgVmlld2VyU29ydGVyIGJlY2F1c2UgaXQncyBhYnN0cmFjdCwgc28gdXNlIHRoaXMKLQkJCQkvLyBpbm5lciBjbGFzcyB0byByZXByZXNlbnQgaXQuCi0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFZhbGlkYXRvckxpc3RQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCUNvbmZpZ3VyYXRpb25NYW5hZ2VyIHByZWZNZ3IgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0JCQkvLyBWYWxpZGF0b3JNYW5hZ2VyIHZNZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQotCQkJcGFnZVByZWZlcmVuY2VzID0gcHJlZk1nci5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihnZXRQcm9qZWN0KCkpOyAvLyBUaGlzCi0JCQkvLyByZXByZXNlbnRzIHRoZSB2YWx1ZXMgb24gdGhlIHBhZ2UgdGhhdCBoYXZlbid0IGJlZW4gcGVyc2lzdGVkIHlldC4KLQkJCS8vIFN0YXJ0IHdpdGggdGhlIGxhc3QgdmFsdWVzIHRoYXQgd2VyZSBwZXJzaXN0ZWQgaW50byB0aGUgY3VycmVudAotCQkJLy8gcGFnZSdzIHN0YXJ0aW5nIHZhbHVlcy4KLQotCQkJLy8gc3RvcmUgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgd2lkZ2V0cwotCQkJY2FuT3ZlcnJpZGUgPSBwcmVmTWdyLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5jYW5Qcm9qZWN0c092ZXJyaWRlKCk7Ci0JCQkvL2lzQXV0b0J1aWxkRW5hYmxlZCA9IHZNZ3IuaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCk7Ci0JCQkvL2lzQnVpbGRlckNvbmZpZ3VyZWQgPSBWYWxpZGF0b3JNYW5hZ2VyLmRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbihnZXRQcm9qZWN0KCkpOwotCQkJb2xkVm1kID0gcGFnZVByZWZlcmVuY2VzLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7IC8vIENhY2hlIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgc28KLSAgICAgIC8vIHRoYXQsIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB0aGlzCi0gICAgICAvLyBsaXN0LCB0aGUgZXhwZW5zaXZlIHRhc2sgbGlzdCB1cGRhdGUKLSAgICAgIC8vIGNhbiBiZSBhdm9pZGVkCi0KLSAgICAgIG9sZERlbGVnYXRlcyA9ICBuZXcgSGFzaE1hcChwYWdlUHJlZmVyZW5jZXMuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSk7Ci0KLQkJCWNyZWF0ZVBhZ2UocGFyZW50KTsKLQkJCQotCQkJZXhpc3RpbmdPdmVycmlkZUdsb2JhbFZhbCA9IG92ZXJyaWRlR2xvYmFsQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJZXhpc3RpbmdEaXNhYmxlQWxsVmFsaWRhdGlvbiA9IGRpc2FibGVBbGxWYWxpZGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgc2V0dXBUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUsIFRhYmxlVmlld2VyIHZpZXdlcikgewotCQkJVGFibGVDb2x1bW4gdmFsaWRhdG9yQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JICAgICAgICB2YWxpZGF0b3JDb2x1bW4uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQUxJREFUT1IpKTsKLQkgICAgICAgIHZhbGlkYXRvckNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCSAgICAgICAgdmFsaWRhdG9yQ29sdW1uLnNldFdpZHRoKDMyMCk7Ci0JICAgICAgICBUYWJsZUNvbHVtbiBtYW51YWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkgICAgICAgIG1hbnVhbENvbHVtbi5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLk1BTlVBTCkpOwotCSAgICAgICAgbWFudWFsQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JICAgICAgICBtYW51YWxDb2x1bW4uc2V0V2lkdGgoNDApOwotCSAgICAgICAgVGFibGVDb2x1bW4gYnVpbGRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkgICAgICAgIGJ1aWxkQ29sdW1uLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuQlVJTEQpKTsKLQkgICAgICAgIGJ1aWxkQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JICAgICAgICBidWlsZENvbHVtbi5zZXRXaWR0aCg0MCk7Ci0gICAgICAgICAgVGFibGVDb2x1bW4gc2V0dGluZ3NDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICBzZXR0aW5nc0NvbHVtbi5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlNFVFRJTkdTKSk7Ci0gICAgICAgICAgc2V0dGluZ3NDb2x1bW4uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgICBzZXR0aW5nc0NvbHVtbi5zZXRXaWR0aCg1MCk7Ci0JICAgIH0KLQotCQkvKioKLQkJICogVGhpcyBwYWdlIGlzIGNyZWF0ZWQgaWYgdGhlIGN1cnJlbnQgcHJvamVjdCBoYXMgYXQgbGVhc3Qgb25lIHZhbGlkYXRvciBjb25maWd1cmVkIG9uIGl0LgotCQkgKi8KLQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCS8vIHRvcCBsZXZlbCBncm91cAotCQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXBhZ2UgPSBuZXcgQ29tcG9zaXRlKHNjMSwgU1dULk5PTkUpOwotCQkJc2MxLnNldENvbnRlbnQocGFnZSk7Ci0JCQlwYWdlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgLy8gdXNlIHRoZSBsYXlvdXQncyBkZWZhdWx0IHByZWZlcmVuY2VzCi0JCQkKLQkJCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUocGFnZSwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCB2YWxpZGF0b3JHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQl2YWxpZGF0b3JHcm91cExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCXZhbGlkYXRvckdyb3VwLnNldExheW91dCh2YWxpZGF0b3JHcm91cExheW91dCk7Ci0JCQkKLQkJCUh5cGVybGluayBsaW5rID0gbmV3IEh5cGVybGluayh2YWxpZGF0b3JHcm91cCxTV1QuTm9uZSk7Ci0JCQlHcmlkRGF0YSBsYXlvdXQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJbGF5b3V0Lmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxpbmsuc2V0TGF5b3V0RGF0YShsYXlvdXQpOwotCQkJbGluay5zZXRVbmRlcmxpbmVkKHRydWUpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IodmFsaWRhdG9yR3JvdXAuZ2V0RGlzcGxheSgpLG5ldyBSR0IoMCwwLDI1NSkgKTsKLQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQlsaW5rLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuQ09ORklHX1dTX1NFVFRJTkdTKSk7Ci0JCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9OT19MSU5LID0gIlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2Uubm9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJcHVibGljIHZvaWQgbGlua0VudGVyZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCQlTdHJpbmcgaWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0JCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXXtpZH0sIERBVEFfTk9fTElOSykub3BlbigpOwotCQkJCQl0cnkgewotCQkJCQkJdXBkYXRlV2lkZ2V0cygpOwotCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGllKSB7Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCQkJCXJldHVybiAiVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIjsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJR3JpZERhdGEgb3ZlcnJpZGVEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlvdmVycmlkZURhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJb3ZlcnJpZGVHbG9iYWxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJb3ZlcnJpZGVHbG9iYWxCdXR0b24uc2V0TGF5b3V0RGF0YShvdmVycmlkZURhdGEpOwotCQkJb3ZlcnJpZGVHbG9iYWxCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUk9QX0JVVFRPTl9PVkVSUklERSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCl9KSk7Ci0JCQlvdmVycmlkZUdsb2JhbEJ1dHRvbi5zZXRGb2N1cygpOyAvLyBtdXN0IGZvY3VzIG9uIHNvbWV0aGluZyBmb3IgRjEgdG8gaGF2ZSBhIHRvcGljIHRvIGxhbnVjaAotCQkJb3ZlcnJpZGVHbG9iYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlwYWdlUHJlZmVyZW5jZXMuc2V0RG9lc1Byb2plY3RPdmVycmlkZShvdmVycmlkZUdsb2JhbEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl1cGRhdGVXaWRnZXRzKCk7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJZW1wdHlSb3dQbGFjZWhvbGRlciA9IG5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpOwotCQkJZW1wdHlSb3dQbGFjZWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCQotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlkaXNhYmxlQWxsVmFsaWRhdGlvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQlkaXNhYmxlQWxsVmFsaWRhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJZGlzYWJsZUFsbFZhbGlkYXRpb24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5ESVNBQkxFX1ZBTElEQVRJT04pKTsKLQkJCWRpc2FibGVBbGxWYWxpZGF0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcGFnZVByZWZlcmVuY2VzLnNldERpc2FibGVBbGxWYWxpZGF0aW9uKGRpc2FibGVBbGxWYWxpZGF0aW9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJZGlzYWJsZUFsbFZhbGlkYXRpb24uc2V0Rm9jdXMoKTsKLQkJCQkJdmFsaWRhdG9yc1RhYmxlLnNldEVuYWJsZWQoIWRpc2FibGVBbGxWYWxpZGF0aW9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJZW5hYmxlQWxsQnV0dG9uLnNldEVuYWJsZWQoIWRpc2FibGVBbGxWYWxpZGF0aW9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJZGlzYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKCFkaXNhYmxlQWxsVmFsaWRhdGlvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JICAgICAgICAgIHRyeSB7Ci0JICAgICAgICAgICAgdXBkYXRlV2lkZ2V0cygpOwotCSAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCSAgICAgICAgICAgIGRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkgICAgICAgICAgfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQllbXB0eVJvd1BsYWNlaG9sZGVyID0gbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQllbXB0eVJvd1BsYWNlaG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0KLQotCQkJR3JpZERhdGEgbGlzdExhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJbGlzdExhYmVsRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9VSV9MQkxfREVTQywgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCl9KSk7Ci0JCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShsaXN0TGFiZWxEYXRhKTsKLQotCQkJdmFsaWRhdG9yc1RhYmxlID0gbmV3IFRhYmxlKHZhbGlkYXRvckdyb3VwLFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTYwLCB0cnVlKSk7Ci0JCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwLCB0cnVlKSk7Ci0JCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDMwLCB0cnVlKSk7Ci0JCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwLCB0cnVlKSk7Ci0JCQl2YWxpZGF0b3JzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCXZhbGlkYXRvcnNUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JICAgICAgICB2YWxpZGF0b3JzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJCQotCQkJdmFsaWRhdG9yTGlzdCA9IG5ldyBUYWJsZVZpZXdlcih2YWxpZGF0b3JzVGFibGUpOwotCSAgICAgICAgR3JpZERhdGEgdmFsaWRhdG9yTGlzdERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCXZhbGlkYXRvckxpc3REYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKLQkJCXZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKLQkJCXZhbGlkYXRvckxpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgVmFsaWRhdGlvbkxhYmVsUHJvdmlkZXIoKSk7Ci0JCQl2YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKLQkJCXZhbGlkYXRvckxpc3Quc2V0U29ydGVyKG5ldyBWYWxpZGF0aW9uVmlld2VyU29ydGVyKCkpOwotCSAgICBzZXR1cFRhYmxlQ29sdW1ucyh2YWxpZGF0b3JzVGFibGUsdmFsaWRhdG9yTGlzdCk7Ci0gICAgICB2YWxpZGF0b3JzVGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZS5idXR0b24gIT0gMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIEhhbmRsZXMgbW91c2UgY2xpY2tzIGluIHRoZSB0YWJsZS4KLSAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgICAgaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IHRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaXRlbSBubyBsb25nZXIgZXhpc3RzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCBjb2x1bW5OdW1iZXI7Ci0gICAgICAgICAgaW50IGNvbHVtbnNDb3VudCA9IHZhbGlkYXRvcnNUYWJsZS5nZXRDb2x1bW5Db3VudCgpOwotICAgICAgICAgIGlmIChjb2x1bW5zQ291bnQgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBubyBUYWJsZUNvbHVtbiwgVGFibGUgYWN0cyBhcyBpZiBpdCBoYXMgYSBzaW5nbGUgY29sdW1uCi0gICAgICAgICAgICAvLyB3aGljaCB0YWtlcyB0aGUgd2hvbGUgd2lkdGguCi0gICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gLTE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNDb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcyhpKTsKLSAgICAgICAgICAgICAgaWYgKGJvdW5kcy5jb250YWlucyhlLngsIGUueSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sdW1uTnVtYmVyID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY29sdW1uQ2xpY2tlZChjb2x1bW5OdW1iZXIpOyAgICAgICAgICAKLSAgICAgICAgfX0pOwotICAgICAgCi0gICAgICB2YWxpZGF0b3JzVGFibGUuc2V0TWVudShjcmVhdGVDb250ZXh0TWVudSgpKTsKLSAgICAgIHZhbGlkYXRvcnNUYWJsZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKXsKLQotICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBzdXBlci5mb2N1c0dhaW5lZChlKTsKLSAgICAgICAgICBpZiAodmFsaWRhdG9yc1RhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpZGF0b3JzVGFibGUuc2VsZWN0KDApOwotICAgICAgICAgIH0KLSAgICAgICAgfX0pOwkJCQotICAgICAgCi0JCQl2YWxpZGF0b3JMaXN0LnNldElucHV0KHBhZ2VQcmVmZXJlbmNlcy5nZXRWYWxpZGF0b3JzKCkpOwotCQkJCi0JCQllbmFibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQlHcmlkRGF0YSBzZWxlY3REYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQllbmFibGVBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShzZWxlY3REYXRhKTsKLQkJCWVuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlBSRUZfQlVUVE9OX0VOQUJMRUFMTCkpOwotCQkJZW5hYmxlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcmZvcm1FbmFibGVBbGwoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlbmFibGVBbGxCdXR0b24sIENvbnRleHRJZHMuVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0UpOwotCi0JCQlHcmlkRGF0YSBkZXNlbGVjdERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRpc2FibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7Ci0JCQlkaXNhYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEoZGVzZWxlY3REYXRhKTsKLQkJCWRpc2FibGVBbGxCdXR0b24uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX0JVVFRPTl9ESVNBQkxFQUxMKSk7Ci0JCQlkaXNhYmxlQWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcmZvcm1EaXNhYmxlQWxsKCk7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlzYWJsZUFsbEJ1dHRvbiwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRSk7Ci0KLQkJCWVtcHR5Um93UGxhY2Vob2xkZXIgPSBuZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJCWVtcHR5Um93UGxhY2Vob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkKLQkJCUdyaWREYXRhIGRpc2FibGVWYWxpZGF0aW9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGlzYWJsZVZhbGlkYXRpb25EYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWFkZFZhbGlkYXRpb25CdWlsZGVyID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKLQkJCWFkZFZhbGlkYXRpb25CdWlsZGVyLnNldExheW91dERhdGEoZGlzYWJsZVZhbGlkYXRpb25EYXRhKTsKLQkJCWFkZFZhbGlkYXRpb25CdWlsZGVyLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuQUREX1ZBTElEQVRJT05fQlVJTERFUikpOwotCi0JCQkvLyBIYXZlIHRvIHNldCB0aGUgdGFiIG9yZGVyIG9yIG9ubHkgdGhlIGZpcnN0IGNoZWNrYm94IGluIGEgQ29tcG9zaXRlIGNhbgotCQkJLy8gYmUgdGFiLWVkIHRvLiAoU2VlbXMgdG8gYXBwbHkgb25seSB0byBjaGVja2JveGVzLiBIYXZlIHRvIHVzZSB0aGUgYXJyb3cKLQkJCS8vIGtleSB0byBuYXZpZ2F0ZSB0aGUgY2hlY2tib3hlcy4pCi0JCQl2YWxpZGF0b3JHcm91cC5zZXRUYWJMaXN0KG5ldyBDb250cm9sW117b3ZlcnJpZGVHbG9iYWxCdXR0b24sZGlzYWJsZUFsbFZhbGlkYXRpb24sIHZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKSwgZW5hYmxlQWxsQnV0dG9uLCBkaXNhYmxlQWxsQnV0dG9ufSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMoKTsKLQotCQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJcGFnZS5zZXRTaXplKHBhZ2UuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7Ci0KLQkJCXJldHVybiBwYWdlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFibGUoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtLmdldERhdGEoKTsKLQotCQkJCS8vIFNob3VsZCB0aGUgdmFsaWRhdG9yIGJlIGVuYWJsZWQ/IFJlYWQgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBmcm9tIGxhc3QgdGltZSwKLQkJCQkvLyBpZiB0aGV5IGV4aXN0LCBhbmQgc2V0IGZyb20gdGhhdC4gSWYgdGhleSBkb24ndCBleGlzdCwgdXNlIHRoZSBWYWxpZGF0b3IgY2xhc3MnCi0JCQkJaWYgKHBhZ2VQcmVmZXJlbmNlcy5pc01hbnVhbEVuYWJsZWQodm1kKSkKLQkJCQkJdm1kLnNldE1hbnVhbFZhbGlkYXRpb24odHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQl2bWQuc2V0TWFudWFsVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQkJCi0JCQkJaWYgKHBhZ2VQcmVmZXJlbmNlcy5pc0J1aWxkRW5hYmxlZCh2bWQpKQotCQkJCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJdm1kLnNldEJ1aWxkVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQl9Ci0JCQl2YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlTWFudWFsQW5kQnVpbGRWYWx1ZXMoKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtLmdldERhdGEoKTsKLQkJCQl2bWQuc2V0TWFudWFsVmFsaWRhdGlvbih0cnVlKTsKLQkJCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKHRydWUpOwotCQkJfQotCQkJdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGRpc2FibGVNYW51YWxBbmRCdWlsZFZhbHVlcygpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCX0KLQkJCXZhbGlkYXRvckxpc3QucmVmcmVzaCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJcGFnZVByZWZlcmVuY2VzLnJlc2V0VG9EZWZhdWx0KCk7Ci0JCQl1cGRhdGVXaWRnZXRzKCk7Ci0JCQlnZXREZWZhdWx0c0J1dHRvbigpLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1FbmFibGVBbGwoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlzZXRBbGxWYWxpZGF0b3JzKHRydWUpOwotCQkJcGFnZVByZWZlcmVuY2VzLnNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQkJZW5hYmxlTWFudWFsQW5kQnVpbGRWYWx1ZXMoKTsKLQkJCWVuYWJsZUFsbEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGlzYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCXNldEFsbFZhbGlkYXRvcnMoZmFsc2UpOwotCQkJcGFnZVByZWZlcmVuY2VzLnNldEVuYWJsZWRWYWxpZGF0b3JzKGdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQkJZGlzYWJsZU1hbnVhbEFuZEJ1aWxkVmFsdWVzKCk7Ci0JCQlkaXNhYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSB7Ci0JCQlMaXN0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVGFibGVJdGVtW10gaXRlbXMgPSB2YWxpZGF0b3JzVGFibGUuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2YWxpZGF0b3JNZXRhRGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJCWlmKHZhbGlkYXRvck1ldGFEYXRhLmlzTWFudWFsVmFsaWRhdGlvbigpIHx8IHZhbGlkYXRvck1ldGFEYXRhLmlzQnVpbGRWYWxpZGF0aW9uKCkpCi0JCQkJCWVuYWJsZWRWYWxpZGF0b3JzLmFkZCh2YWxpZGF0b3JNZXRhRGF0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pZW5hYmxlZFZhbGlkYXRvcnMudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbZW5hYmxlZFZhbGlkYXRvcnMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkgewotCQkJTGlzdCBlbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdmFsaWRhdG9yTWV0YURhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCQlpZih2YWxpZGF0b3JNZXRhRGF0YS5pc01hbnVhbFZhbGlkYXRpb24oKSkKLQkJCQkJZW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvck1ldGFEYXRhKTsKLQkJCX0KLQkJCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSllbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkVmFsaWRhdG9ycy5zaXplKCldKTsKLQkJfQotCQkKLQkJcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpIHsKLQkJCUxpc3QgZW5hYmxlZFZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZhbGlkYXRvck1ldGFEYXRhID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQkJaWYodmFsaWRhdG9yTWV0YURhdGEuaXNCdWlsZFZhbGlkYXRpb24oKSkKLQkJCQkJZW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvck1ldGFEYXRhKTsKLQkJCX0KLQkJCXJldHVybiAoVmFsaWRhdG9yTWV0YURhdGFbXSllbmFibGVkVmFsaWRhdG9ycy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkVmFsaWRhdG9ycy5zaXplKCldKTsKLQkJfQotCi0JCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0QWxsVmFsaWRhdG9ycyhib29sZWFuIGJvb2wpIHsKLQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmFsaWRhdG9yc1RhYmxlLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdmFsaWRhdG9yTWV0YURhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCQl2YWxpZGF0b3JNZXRhRGF0YS5zZXRNYW51YWxWYWxpZGF0aW9uKGJvb2wpOwotCQkJCXZhbGlkYXRvck1ldGFEYXRhLnNldEJ1aWxkVmFsaWRhdGlvbihib29sKTsKLQkJCX0KLQkJfQotCi0gICAgcHJvdGVjdGVkIE1lbnUgY3JlYXRlQ29udGV4dE1lbnUoKQotICAgIHsKLSAgICAgIGZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51KHZhbGlkYXRvcnNUYWJsZS5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLSAgICAgIGZpbmFsIE1lbnVJdGVtIG1hbnVhbEl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0gICAgICBtYW51YWxJdGVtLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuUFJFRl9NTlVfTUFOVUFMKSk7Ci0gICAgICBmaW5hbCBNZW51SXRlbSBidWlsZEl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5DSEVDSyk7Ci0gICAgICBidWlsZEl0ZW0uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX01OVV9CVUlMRCkpOwotICAgICAgZmluYWwgTWVudUl0ZW0gc2V0dGluZ3NJdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0gICAgICBzZXR0aW5nc0l0ZW0uc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5QUkVGX01OVV9TRVRUSU5HUykpOwotICAgICAgCi0gICAgICBjbGFzcyBNZW51SXRlbUxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlcgotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgTWVudUl0ZW0gbWVudUl0ZW0gPSAoTWVudUl0ZW0pIGUuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgaW50IGluZGV4ID0gbWVudS5pbmRleE9mKG1lbnVJdGVtKSArIDE7Ci0gICAgICAgICAgY29sdW1uQ2xpY2tlZChpbmRleCk7Ci0gICAgICAgIH0gICAKLSAgICAgIH0KLSAgICAgIE1lbnVJdGVtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTWVudUl0ZW1MaXN0ZW5lcigpOwotICAgICAgbWFudWFsSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICBidWlsZEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgc2V0dGluZ3NJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgbWFudWFsSXRlbS5zZXRTZWxlY3Rpb24odm1kLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLSAgICAgICAgICBidWlsZEl0ZW0uc2V0U2VsZWN0aW9uKHZtZC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLSAgICAgICAgICBzZXR0aW5nc0l0ZW0uc2V0RW5hYmxlZCh2bWQuaXNEZWxlZ2F0aW5nKCkpOwotICAgICAgICB9fSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBtZW51OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DbGlja2VkKGludCBjb2x1bW5Ub0VkaXQpCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2YWxpZGF0b3JMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoY29sdW1uVG9FZGl0KQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICB2bWQuc2V0TWFudWFsVmFsaWRhdGlvbighdm1kLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHZtZC5zZXRCdWlsZFZhbGlkYXRpb24oIXZtZC5pc0J1aWxkVmFsaWRhdGlvbigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICB7Ci0gICAgICAgIGlmICghdm1kLmlzRGVsZWdhdGluZygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gcGFnZVByZWZlcmVuY2VzLmdldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQpOwotICAKLSAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cgZGlhbG9nID0gbmV3IERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhzaGVsbCwgdm1kLCBkZWxlZ2F0ZUlEKTsKLSAgCi0gICAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAKLSAgICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0gIAotICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIHBhZ2VQcmVmZXJlbmNlcy5zZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kLCBkaWFsb2cuZ2V0RGVsZWdhdGVJRCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB2YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsgICAgICAKLSAgICB9Ci0gICAgCi0JCXZvaWQgdXBkYXRlV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCS8vIFNpbmNlIHRoZSBzZXR0aW5nIG9mIHRoZSAib3ZlcnJpZGUiIGJ1dHRvbiBlbmFibGVzL2Rpc2FibGVzIHRoZSBvdGhlciB3aWRnZXRzIG9uIHRoZQotCQkJLy8gcGFnZSwgdXBkYXRlIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBvdGhlciB3aWRnZXRzIGZyb20gdGhlICJvdmVycmlkZSIgYnV0dG9uLgotCQkJdXBkYXRlVGFibGUoKTsKLQkJCXVwZGF0ZUFsbFdpZGdldHMoKTsKLQkJCQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzRm9yRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQl1cGRhdGVUYWJsZUZvckRlZmF1bHRzKCk7Ci0JCQl1cGRhdGVBbGxXaWRnZXRzKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVBbGxXaWRnZXRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJLy8gU2luY2UgdGhlIHNldHRpbmcgb2YgdGhlICJvdmVycmlkZSIgYnV0dG9uIGVuYWJsZXMvZGlzYWJsZXMgdGhlIG90aGVyIHdpZGdldHMgb24gdGhlCi0JCQkvLyBwYWdlLCB1cGRhdGUgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG90aGVyIHdpZGdldHMgZnJvbSB0aGUgIm92ZXJyaWRlIiBidXR0b24uCi0JCQlDb25maWd1cmF0aW9uTWFuYWdlciBwcmVmTWdyID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkJY2FuT3ZlcnJpZGUgPSBwcmVmTWdyLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5jYW5Qcm9qZWN0c092ZXJyaWRlKCk7Ci0JCQlib29sZWFuIG92ZXJyaWRlUHJlZmVyZW5jZXMgPSBjYW5PdmVycmlkZSAmJiBwYWdlUHJlZmVyZW5jZXMuZG9lc1Byb2plY3RPdmVycmlkZSgpOwotCQkJb3ZlcnJpZGVHbG9iYWxCdXR0b24uc2V0RW5hYmxlZChjYW5PdmVycmlkZSk7Ci0JCQlvdmVycmlkZUdsb2JhbEJ1dHRvbi5zZXRTZWxlY3Rpb24ob3ZlcnJpZGVQcmVmZXJlbmNlcyk7Ci0JCQlkaXNhYmxlQWxsVmFsaWRhdGlvbi5zZXRFbmFibGVkKG92ZXJyaWRlUHJlZmVyZW5jZXMpOwotCQkJZGlzYWJsZUFsbFZhbGlkYXRpb24uc2V0U2VsZWN0aW9uKHBhZ2VQcmVmZXJlbmNlcy5pc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkpOwotCQkJaWYgKG92ZXJyaWRlUHJlZmVyZW5jZXMpCi0JCQkJZW5hYmxlRGVwZW5kZW50Q29udHJvbHMoIXBhZ2VQcmVmZXJlbmNlcy5pc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkpOwotCQkJZWxzZQotCQkJCWVuYWJsZURlcGVuZGVudENvbnRyb2xzKG92ZXJyaWRlUHJlZmVyZW5jZXMpOwotCQkJc2V0QWRkVmFsaWRhdGlvbkJ1aWxkZXJCdXR0b25FbmFibGVtZW50KCk7Ci0JCQl1cGRhdGVIZWxwKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0QWRkVmFsaWRhdGlvbkJ1aWxkZXJCdXR0b25FbmFibGVtZW50KCkgewotCQkJdHJ5IHsKLQkJCQlib29sZWFuIGJ1aWxkZXJFeGlzdHMgPSBmYWxzZTsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEKSB8IGlzVmFsaWRhdGlvbkJ1aWxkZXJFbmFibGVkKGNvbW1hbmRzW2ldKSkKLQkJCQkJCWJ1aWxkZXJFeGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoYnVpbGRlckV4aXN0cykgewotCQkJCQlhZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlhZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlhZGRWYWxpZGF0aW9uQnVpbGRlci5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlICBib29sZWFuIGlzVmFsaWRhdGlvbkJ1aWxkZXJFbmFibGVkKElDb21tYW5kIGNvbW1hbmQpIHsKLQkJCU1hcCBhcmdzID0gY29tbWFuZC5nZXRBcmd1bWVudHMoKTsKLQkJCWlmKGFyZ3MuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKWFyZ3MuZ2V0KCJMYXVuY2hDb25maWdIYW5kbGUiKTsKLQkJCWlmKGhhbmRsZSAhPSBudWxsICYmIGhhbmRsZS5sZW5ndGgoKSA+IDAgJiYgaGFuZGxlLmluZGV4T2YoVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQpICE9IC0xKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlRm9yRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZhbGlkYXRvcnNUYWJsZS5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRhYmxlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVtLmdldERhdGEoKTsKLQotCQkJCS8vIFNob3VsZCB0aGUgdmFsaWRhdG9yIGJlIGVuYWJsZWQ/IFJlYWQgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBmcm9tIGxhc3QgdGltZSwKLQkJCQkvLyBpZiB0aGV5IGV4aXN0LCBhbmQgc2V0IGZyb20gdGhhdC4gSWYgdGhleSBkb24ndCBleGlzdCwgdXNlIHRoZSBWYWxpZGF0b3IgY2xhc3MnCi0JCQkJaWYocGFnZVByZWZlcmVuY2VzLmlzRW5hYmxlZCh2bWQpKSB7Ci0JCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKHRydWUpOwotCQkJCQl2bWQuc2V0QnVpbGRWYWxpZGF0aW9uKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZtZC5zZXRNYW51YWxWYWxpZGF0aW9uKGZhbHNlKTsKLQkJCQkJdm1kLnNldEJ1aWxkVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIG92ZXJyaWRlUHJlZmVyZW5jZXMKLQkJICovCi0JCXByaXZhdGUgdm9pZCBlbmFibGVEZXBlbmRlbnRDb250cm9scyhib29sZWFuIG92ZXJyaWRlUHJlZmVyZW5jZXMpIHsKLQkJCXZhbGlkYXRvcnNUYWJsZS5zZXRFbmFibGVkKG92ZXJyaWRlUHJlZmVyZW5jZXMpOwotICAgICAgdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7Ci0JCQllbmFibGVBbGxCdXR0b24uc2V0RW5hYmxlZChvdmVycmlkZVByZWZlcmVuY2VzKTsgLy8gc2luY2UgaGVscCBtZXNzc2FnZSBpc24ndAotCQkJZGlzYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKG92ZXJyaWRlUHJlZmVyZW5jZXMpOwotICAgICAgCi0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWxwKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJLy8gV2hlbmV2ZXIgYSB3aWRnZXQgaXMgZGlzYWJsZWQsIGl0IGNhbm5vdCBnZXQgZm9jdXMuCi0JCQkvLyBTaW5jZSBpdCBjYW4ndCBoYXZlIGZvY3VzLCBpdHMgY29udGV4dC1zZW5zaXRpdmUgRjEgaGVscCBjYW4ndCBjb21lIHVwLgotCQkJLy8gRnJvbSBleHBlcmltZW50YXRpb24sIEkga25vdyB0aGF0IHRoZSBjb21wb3NpdGUgcGFyZW50IG9mIHRoZSB3aWRnZXQKLQkJCS8vIGNhbid0IGhhdmUgZm9jdXMgZWl0aGVyLiBTbywgZnVkZ2UgdGhlIGZvY3VzIGJ5IG1ha2luZyB0aGUgdGFibGUgdGhlIHdpZGdldAotCQkJLy8gc3Vycm9nYXRlIHNvIHRoYXQgdGhlIEYxIGhlbHAgY2FuIGJlIHNob3duLCB3aXRoIGl0cyBpbnN0cnVjdGlvbnMgb24gaG93IHRvCi0JCQkvLyBlbmFibGUgdGhlIGRpc2FibGVkIHdpZGdldC4gVGhlIHRhYmxlIG5ldmVyIGhhcyBGMSBoZWxwIGFzc29jaWF0ZWQgd2l0aCBpdCBvdGhlcgotCQkJLy8gdGhhbiB0aGUgcGFnZSBGMSwgc28gdGhpcyBmdWRnZSBkb2Vzbid0IHJlbW92ZSBhbnkgY29udGV4dC1zZW5zaXRpdmUgaGVscAotCQkJLy8gZnJvbSB0aGUgdGFibGUgd2lkZ2V0LgotCi0JCQkvKmlmIChhdXRvQnV0dG9uLmdldEVuYWJsZWQoKSkgewotCQkJCS8vIHNldCB0aGUgdGFibGUncyBoZWxwIGJhY2sgdG8gd2hhdCBpdCB3YXMKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRSk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhdXRvQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0FVVE9fRU5BQkxFRCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBpcyBpbXBvcnRhbnQhCi0JCQkJLy8gSWYgdGhlIHVzZXIgY2Fubm90IGVuYWJsZSBhdXRvbWF0aWMgdmFsaWRhdGlvbiBvbiB0aGUgcHJvamVjdCwgdGhlbiB0aGUgdXNlcgotCQkJCS8vIHNob3VsZCBub3QgYmUgdG9sZCwgZm9yIGV4YW1wbGUsIHRvIHR1cm4gYXV0by1idWlsZCBvbi4gTGV0IHRoZSB1c2VyIGtub3cgdGhhdAotCQkJCS8vIG5vIG1hdHRlciB3aGF0IHRoZXkgZG8gdGhleSBjYW5ub3QgcnVuIGF1dG8tdmFsaWRhdGUgb24gdGhlIHByb2plY3QuIElGIHRoZQotCQkJCS8vIHByb2plY3QKLQkJCQkvLyBzdXBwb3J0cyBhdXRvLXZhbGlkYXRlLCBUSEVOIGNoZWNrIGZvciB0aGUgaXRlbXMgd2hpY2ggdGhlIHVzZXIgY2FuIGNoYW5nZS4KLQkJCQl2YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQkJCQlpZiAocGFnZVByZWZlcmVuY2VzLm51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgPT0gMCkgewotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX05PSU5DVkFMQ09ORklHKTsKLQkJCQl9IGVsc2UgaWYgKCFWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0dsb2JhbEF1dG9CdWlsZEVuYWJsZWQoKSkgewotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKSwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX0FVVE9CVUlMRCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSW5jcmVtZW50YWwgdmFsaWRhdG9ycyBjb25maWd1cmVkIGJ1dCBub3Qgc2VsZWN0ZWQKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YWxpZGF0b3JMaXN0LmdldFRhYmxlKCksIENvbnRleHRJZHMuVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQVVUT19OT0lOQ1ZBTFNFTEVDVEVEKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIGF1dG9CdXR0b24gQU5EIGJ1aWxkIGJ1dHRvbiBhcmUgZGlzYWJsZWQsIHNob3cgdGhlIGJ1aWxkIGJ1dHRvbidzICJ0byBlbmFibGUiIHRleHQKLQkJCWlmICh2YWxXaGVuQnVpbGRCdXR0b24uZ2V0RW5hYmxlZCgpKSB7Ci0JCQkJLy8gRG8gTk9UIHNldCB0aGUgdGFibGUncyBoZWxwIGJhY2sgdG8gd2hhdCBpdCB3YXMuCi0JCQkJLy8gT25seSBpZiBhdXRvLXZhbGlkYXRlIGlzIGVuYWJsZWQgc2hvdWxkIHRoZSBwYWdlIGdvIGJhY2suCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YWxXaGVuQnVpbGRCdXR0b24sIENvbnRleHRJZHMuVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfUkVCVUlMRF9FTkFCTEVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8JCQkJcGFnZS5nZXRQYXJlbnQoKS5zZXRGb2N1cygpOwotCQkJCXZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5zZXRGb2N1cygpOwotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX0JVSUxEX05PVkFMU0VMRUNURUQpOwotCQkJfQotKi8KLQkJCS8vIGlmIHRoZSBvdmVycmlkZSBidXR0b24gaXMgZGlzYWJsZWQsIHNob3cgaXRzICJ0byBlbmFibGUiIHRleHQuCi0JCQlpZiAob3ZlcnJpZGVHbG9iYWxCdXR0b24uZ2V0RW5hYmxlZCgpKSB7Ci0JCQkJLy8gRG8gTk9UIHNldCB0aGUgdGFibGUncyBoZWxwIGJhY2sgdG8gd2hhdCBpdCB3YXMuCi0JCQkJLy8gT25seSBpZiBhdXRvLXZhbGlkYXRlIGlzIGVuYWJsZWQgc2hvdWxkIHRoZSBwYWdlIGdvIGJhY2suCi0JCQkJYm9vbGVhbiBkb2VzUHJvamVjdFN1cHBvcnRCdWlsZFZhbGlkYXRpb24gPSBWYWxpZGF0b3JNYW5hZ2VyLmRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbihnZXRQcm9qZWN0KCkpOwotCQkJCS8vIEdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJCS8vYm9vbGVhbiBpc1ByZWZBdXRvID0gZ3AuaXNBdXRvVmFsaWRhdGUoKTsKLQkJCQkvL2Jvb2xlYW4gaXNQcmVmTWFudWFsID0gZ3AuaXNCdWlsZFZhbGlkYXRlKCk7Ci0JCQkJaWYgKGRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbikgewotCQkJCQkvLyBQcm9qZWN0IHN1cHBvcnRzIGJ1aWxkIHZhbGlkYXRpb24sIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHByZWZlcmVuY2VzCi0JCQkJCS8vIGFyZQotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG92ZXJyaWRlR2xvYmFsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRUQpOwotCQkJCX0gLyplbHNlIGlmICghZG9lc1Byb2plY3RTdXBwb3J0QnVpbGRWYWxpZGF0aW9uICYmIChpc1ByZWZBdXRvICYmIGlzUHJlZk1hbnVhbCkpIHsKLQkJCQkJLy8gUHJvamVjdCBkb2Vzbid0IHN1cHBvcnQgYnVpbGQgdmFsaWRhdGlvbiwgYW5kIHRoZSB1c2VyIHByZWZlcnMgYm90aCBhdXRvIGFuZAotCQkJCQkvLyBtYW51YWwgYnVpbGQgdmFsaWRhdGlvbgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG92ZXJyaWRlR2xvYmFsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9CT1RIKTsKLQkJCQl9IGVsc2UgaWYgKCFkb2VzUHJvamVjdFN1cHBvcnRCdWlsZFZhbGlkYXRpb24gJiYgaXNQcmVmQXV0bykgewotCQkJCQkvLyBQcm9qZWN0IGRvZXNuJ3Qgc3VwcG9ydCBidWlsZCB2YWxpZGF0aW9uLCBhbmQgdGhlIHVzZXIgcHJlZmVycyBhdXRvIGJ1aWxkCi0JCQkJCS8vIHZhbGlkYXRpb24KLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvdmVycmlkZUdsb2JhbEJ1dHRvbiwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEX0NBTk5PVF9IT05PVVJfQVVUTyk7Ci0JCQkJfSBlbHNlIGlmICghZG9lc1Byb2plY3RTdXBwb3J0QnVpbGRWYWxpZGF0aW9uICYmIGlzUHJlZk1hbnVhbCkgewotCQkJCQkvLyBQcm9qZWN0IGRvZXNuJ3Qgc3VwcG9ydCBidWlsZCB2YWxpZGF0aW9uLCBhbmQgdGhlIHVzZXIgcHJlZmVycyBtYW51YWwgYnVpbGQKLQkJCQkJLy8gdmFsaWRhdGlvbgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG92ZXJyaWRlR2xvYmFsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9NQU5VQUwpOwotCQkJCX0gZWxzZSBpZiAoIWRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbiAmJiAhaXNQcmVmQXV0byAmJiAhaXNQcmVmTWFudWFsKSB7Ci0JCQkJCS8vIFByb2plY3QgZG9lc24ndCBzdXBwb3J0IGJ1aWxkIHZhbGlkYXRpb24sIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgdGhlCi0JCQkJCS8vIHVzZXIgcHJlZmVycyBubyBidWlsZCB2YWxpZGF0aW9uLgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG92ZXJyaWRlR2xvYmFsQnV0dG9uLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRUQpOwotCQkJCX0qLwotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQkJCQkvLyBQcmVmZXJlbmNlIHBhZ2UgZG9lc24ndCBhbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZQotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX09WRVJSSURFKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgY29udHJvbHMgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCXBhZ2VQcmVmZXJlbmNlcy5zZXREb2VzUHJvamVjdE92ZXJyaWRlKG92ZXJyaWRlR2xvYmFsQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotCQkJaWYgKHBhZ2VQcmVmZXJlbmNlcy5kb2VzUHJvamVjdE92ZXJyaWRlKCkpIHsKLQkJCQlwYWdlUHJlZmVyZW5jZXMuc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCQkJcGFnZVByZWZlcmVuY2VzLnNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFnZVByZWZlcmVuY2VzLnJlc2V0VG9EZWZhdWx0KCk7IC8vIElmIHRoZSBwcm9qZWN0IGNhbid0IG9yIGRvZXNuJ3Qgb3ZlcnJpZGUsCi0JCQkJLy8gdXBkYXRlIGl0cyB2YWx1ZXMgdG8gbWF0Y2ggdGhlIGdsb2JhbAotCQkJCS8vIHByZWZlcmVuY2UgdmFsdWVzLgotCQkJfQotCQkJcGFnZVByZWZlcmVuY2VzLnN0b3JlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVhZHMgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycywgZW5hYmxlcyB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgc2VsZWN0ZWQsIGRpc2FibGVzIHRoZQotCQkgKiB2YWxpZGF0b3JzIHdoaWNoIGFyZSBub3Qgc2VsZWN0ZWQsIGFuZCBpZiB0aGUgYXV0by12YWxpZGF0ZSBjaGVja2JveCBpcyBjaG9zZW4sIHBlcmZvcm1zCi0JCSAqIGEgZnVsbCB2YWxpZGF0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJLy8gYWRkQnVpbGRlciBNVVNUIGJlIGNhbGxlZCBiZWZvcmUgc3RvcmVWYWx1ZXMKLQkJCS8vIGFkZEJ1aWxkZXIgYWRkcyBhIGJ1aWxkZXIgdG8gdGhlIHByb2plY3QsIGFuZCB0aGF0IGNoYW5nZXMgdGhlIHByb2plY3QgZGVzY3JpcHRpb24uCi0JCQkvLyBDaGFuZ2luZyBhIHByb2plY3QncyBkZXNjcmlwdGlvbiB0cmlnZ2VycyB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsncyAibmF0dXJlQ2hhbmdlIgotCQkJLy8gbWlncmF0aW9uLCBhbmQgYSBuYXR1cmUgY2hhbmdlIHJlcXVpcmVzIHRoYXQgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBiZSByZWNhbGN1bGF0ZWQuCi0JCQkvLyBJZiB0aGUgYnVpbGRlciBpcyBhZGRlZCBhZnRlciB0aGUgdmFsdWVzIGFyZSBzdG9yZWQsIHRoZSBzdG9yZWQgdmFsdWVzIGFyZQotCQkJLy8gb3ZlcndyaXR0ZW4uCi0JCQlhZGRCdWlsZGVyKCk7Ci0KLQkJCS8vIElmIHRoaXMgbWV0aG9kIGlzIGJlaW5nIGNhbGxlZCBiZWNhdXNlIGFuIEFQUExZIHdhcyBoaXQgaW5zdGVhZCBvZiBhbiBPSywKLQkJCS8vIHJlY2FsY3VsYXRlIHRoZSAiY2FuIGJ1aWxkIGJlIGVuYWJsZWQiIHN0YXR1cyBiZWNhdXNlIHRoZSBidWlsZGVyIG1heSBoYXZlCi0JCQkvLyBiZWVuIGFkZGVkIGluIHRoZSBhZGRCdWlsZGVyKCkgY2FsbCBhYm92ZS4KLQkJCS8vIEFsc28gcmVjYWxjdWxhdGUgdGhlIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiB0aGUgaXNCdWlsZGVyQ29uZmlndXJlZCB2YWx1ZS4KLQkJCS8vaXNCdWlsZGVyQ29uZmlndXJlZCA9IFZhbGlkYXRvck1hbmFnZXIuZG9lc1Byb2plY3RTdXBwb3J0QnVpbGRWYWxpZGF0aW9uKGdldFByb2plY3QoKSk7Ci0KLQkJCS8vIFBlcnNpc3QgdGhlIHZhbHVlcy4KLQkJCXN0b3JlVmFsdWVzKCk7Ci0KLQkJCWlmIChwYWdlUHJlZmVyZW5jZXMuaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKG9sZFZtZCwgZmFsc2UpIHx8Ci0gICAgICAgICAgcGFnZVByZWZlcmVuY2VzLmhhdmVEZWxlZ2F0ZXNDaGFuZ2VkKG9sZERlbGVnYXRlcywgZmFsc2UpKSB7IAotCQkJCS8vIGZhbHNlIG1lYW5zIHRoYXQgdGhlIHByZWZlcmVuY2UgImFsbG93IiB2YWx1ZSBoYXNuJ3QgY2hhbmdlZAotCQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnVwZGF0ZVRhc2tMaXN0KGdldFByb2plY3QoKSk7IAotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGUgY3VycmVudCBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIGNvbmZpZ3VyZWQgb24gaXQsIGFkZCB0aGUKLQkJICogYnVpbGRlci4gT3RoZXJ3aXNlIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZEJ1aWxkZXIoKSB7Ci0JCQlpZiAoYWRkVmFsaWRhdGlvbkJ1aWxkZXIuaXNFbmFibGVkKCkgJiYgYWRkVmFsaWRhdGlvbkJ1aWxkZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChnZXRQcm9qZWN0KCkpOwotCQl9Ci0KLQkJcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIHBhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZW5hYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKLQkJCWRpc2FibGVBbGxCdXR0b24uZGlzcG9zZSgpOwotCQkJdmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLmRpc3Bvc2UoKTsKLQkJCW1lc3NhZ2VMYWJlbC5kaXNwb3NlKCk7Ci0JCQkvLwkJCWxheW91dC5kaXNwb3NlKCk7Ci0JCQkvLwkJCWRhdGEuZGlzcG9zZSgpOwotCQkJZW1wdHlSb3dQbGFjZWhvbGRlci5kaXNwb3NlKCk7Ci0JCQlvdmVycmlkZUdsb2JhbEJ1dHRvbi5kaXNwb3NlKCk7Ci0JCQlwYWdlLmRpc3Bvc2UoKTsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCQlwYWdlUHJlZmVyZW5jZXMuc2V0RG9lc1Byb2plY3RPdmVycmlkZShleGlzdGluZ092ZXJyaWRlR2xvYmFsVmFsKTsKLQkJCXBhZ2VQcmVmZXJlbmNlcy5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihleGlzdGluZ0Rpc2FibGVBbGxWYWxpZGF0aW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSgpIHsKLQkJLy8gU29tZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUgImluaXRpYWxpemUiIG1ldGhvZCwgd2hpY2ggaXMKLQkJLy8gY2FsbGVkIGJ5IHRoZSAiZ2V0UGFnZVR5cGUiIG1ldGhvZCwgYmVjYXVzZSB0aGUgY3VycmVudCBwcm9qZWN0IG11c3QKLQkJLy8gYmUga25vd24gaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aG9zZSBmaWVsZHMuCi0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBwYXJlbnQgKHRoZSBQcm9wZXJ0aWVzIGd1aWRlKSwgY3JlYXRlIHRoZSBWYWxpZGF0b3JzIHBhZ2UgdG8gYmUgYWRkZWQgdG8gaXQuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0JCWlmICgocHJvamVjdCA9PSBudWxsKSB8fCAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJX3BhZ2VJbXBsID0gbmV3IEludmFsaWRQYWdlKHBhcmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCkubnVtYmVyT2ZWYWxpZGF0b3JzKCkgPT0gMCkgewotCQkJCQlfcGFnZUltcGwgPSBuZXcgTm9WYWxpZGF0b3JzUGFnZShwYXJlbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCV9wYWdlSW1wbCA9IG5ldyBWYWxpZGF0b3JMaXN0UGFnZShwYXJlbnQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJX3BhZ2VJbXBsID0gbmV3IEludmFsaWRQYWdlKHBhcmVudCk7Ci0JCQkJZGlzcGxheUFuZExvZ0Vycm9yKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfVElUTEUpLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpLCBleGMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCV9wYWdlSW1wbCA9IG5ldyBJbnZhbGlkUGFnZShwYXJlbnQpOwotCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBfcGFnZUltcGwuZ2V0Q29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHRoZSBwYWdlcyBhcmUgaW5uZXIgY2xhc3NlcyBvZiBhIGNoaWxkIFByZWZlcmVuY2VQYWdlLCBub3QgYSBQcmVmZXJlbmNlUGFnZSBpdHNlbGYsCi0JICogRGlhbG9nUGFnZSdzIGF1dG9tYXRpYyBkaXNwb3NhbCBvZiBpdHMgY2hpbGRyZW4ncyB3aWRnZXRzIGNhbm5vdCBiZSB1c2VkLiBJbnN0ZWFkLCBkaXNwb3NlIG9mCi0JICogZWFjaCBpbm5lciBjbGFzcycgd2lkZ2V0cyBleHBsaWNpdGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCV9wYWdlSW1wbC5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWxvZ0Vycm9yKGV4Yyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoaWdobGlnaHRlZCBpdGVtIGluIHRoZSB3b3JrYmVuY2guCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0KLQotCQlJQWRhcHRhYmxlIHNlbGVjdGVkRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiAoSVByb2plY3QpIHNlbGVjdGVkRWxlbWVudDsKLQotCQlPYmplY3QgYWRhcHRlZE9iamVjdCA9IHNlbGVjdGVkRWxlbWVudC5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJaWYgKGFkYXB0ZWRPYmplY3QgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCXJldHVybiAoSVByb2plY3QpIGFkYXB0ZWRPYmplY3Q7Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKSB7Ci0JCXN1cGVyLm5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGZyYW1ld29yayBob29rIG1ldGhvZCBmb3Igc3VibGNhc3NlcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuIHRoZSBEZWZhdWx0cyBidXR0b24KLQkgKiBoYXMgYmVlbiBwcmVzc2VkLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSwgYnV0IHNob3VsZCBjYWxsIDxjb2RlPnN1cGVyLnBlcmZvcm1EZWZhdWx0czwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRyeSB7Ci0JCQlfcGFnZUltcGwucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWRpc3BsYXlBbmRMb2dFcnJvcihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFKSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFKSwgZXhjKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlfcGFnZUltcGwucGVyZm9ybUNhbmNlbCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlICJPSyIgb3IgIkFwcGx5IiBidXR0b24gb24gdGhlIFByb3BlcnRpZXMgR3VpZGUvUHJvcGVydGllcyBQYWdlLAotCSAqIHJlc3BlY3RpdmVseSwgc29tZSBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBieSB0aGlzIFByb3BlcnR5UGFnZS4gSWYgdGhlIHBhZ2UgaXMgZm91bmQsIGFuZAotCSAqIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRydWUgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgZmFsc2UgaXMgcmV0dXJuZWQsIGFuZCB0aGUgZ3VpZGUgZG9lc24ndAotCSAqIGZpbmlzaC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gX3BhZ2VJbXBsLnBlcmZvcm1PaygpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJZGlzcGxheUFuZExvZ0Vycm9yKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfVElUTEUpLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpLCBleGMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlkaXNwbGF5QW5kTG9nRXJyb3IoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSksIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUxfUEFHRSksIGV4Yyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQl2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGMpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IFdUUFVJUGx1Z2luLmdldExvZ2dlcigpOwotCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblVJUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UuZGlzcGxheUFuZExvZ0Vycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UpOwotCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCWlmIChleGMgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKCgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZXhjKS5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbigoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4YykuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBkaXNwbGF5QW5kTG9nRXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4YykgewotCQlsb2dFcnJvcihleGMpOwotCQlkaXNwbGF5TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5JQ09OX0VSUk9SKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGxheU1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGlJY29uVHlwZSkgewotCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLCBvcmcuZWNsaXBzZS5zd3QuU1dULk9LIHwgaUljb25UeXBlIHwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJbWVzc2FnZUJveC5zZXRUZXh0KHRpdGxlKTsKLQkJbWVzc2FnZUJveC5vcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2dldERlZmF1bHRzQnV0dG9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGdldERlZmF1bHRzQnV0dG9uKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdHNCdXR0b24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblVJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4N2VmNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25VSUNvbnN0YW50cyBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLlJlc291cmNlQ29uc3RhbnRzIHsKLQkvL0RlZmF1bHQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2RiOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogLwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgVmFsaWRhdGlvbiBVSS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkudmFsaWRhdGlvbnVpIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfc2F2ZV9hbGxfcmVzb3VyY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVGaWxlc0RpYWxvZ19tdXN0X3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZlBhZ2VfYWx3YXlzX3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUnVuVmFsaWRhdGlvbkRpYWxvZ1RpdGxlOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25VSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRpb25VSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1J1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThhY2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhbiBJV29ya3NwYWNlUnVubmFibGUgdG8gdGhlIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gVGhpcyBjbGFzcyBuZWVkcyB0byBiZQotICogdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBmcm9tIGEgSVJ1bm5hYmxlQ29udGV4dC4KLSAqIAotICogQHNlZSBJUnVubmFibGVDb250ZXh0Ci0gKiBAc2VlIFZhbGlkYXRpb25VSVBsdWdpbiNnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyBDcmVhdGlvbiBkYXRlOiAoNS84LzIwMDEgMToyODo0NSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBoZWFkbGVzc1J1bm5hYmxlID0gbnVsbDsKLQlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uT3BlcmF0aW9uIHZhbGlkYXRpb25PcGVyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSVdvcmtzcGFjZVJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJc2V0SGVhZGxlc3NSdW5uYWJsZShhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyk7Ci0JfQotCi0JcHVibGljIFJ1bm5hYmxlV2l0aFByb2dyZXNzV3JhcHBlcihJV29ya3NwYWNlUnVubmFibGUgYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpIHsKLQkJc2V0V29ya3NwYWNlUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCkgewotCQlzZXRWYWxpZGF0aW9uT3BlcmF0aW9uKG9wKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBnZXRXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JICovCi0JcHJvdGVjdGVkIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGdldEhlYWRsZXNzUnVubmFibGUoKSB7Ci0JCXJldHVybiBoZWFkbGVzc1J1bm5hYmxlOwotCX0KLQotCXByb3RlY3RlZCBJV29ya3NwYWNlUnVubmFibGUgZ2V0V29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXJldHVybiB3b3Jrc3BhY2VSdW5uYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0SGVhZGxlc3NSdW5uYWJsZSgpICE9IG51bGwpIHsKLQkJCQlnZXRIZWFkbGVzc1J1bm5hYmxlKCkucnVuKG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSAoZ2V0V29ya3NwYWNlUnVubmFibGUoKSA9PSBudWxsKSA/IHZhbGlkYXRpb25PcGVyYXRpb24gOiBnZXRXb3Jrc3BhY2VSdW5uYWJsZSgpOwotCQkJCWlmIChydW5uYWJsZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2Ugc2V0V29ya3NwYWNlUnVubmFibGUoSVdvcmtzcGFjZVJ1bm5hYmxlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEhlYWRsZXNzUnVubmFibGUoSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgbmV3SGVhZGxlc3NSdW5uYWJsZSkgewotCQloZWFkbGVzc1J1bm5hYmxlID0gbmV3SGVhZGxlc3NSdW5uYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXb3Jrc3BhY2VSdW5uYWJsZShJV29ya3NwYWNlUnVubmFibGUgbmV3V29ya3NwYWNlUnVubmFibGUpIHsKLQkJd29ya3NwYWNlUnVubmFibGUgPSBuZXdXb3Jrc3BhY2VSdW5uYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWxpZGF0aW9uT3BlcmF0aW9uKFZhbGlkYXRpb25PcGVyYXRpb24gb3ApIHsKLQkJdmFsaWRhdGlvbk9wZXJhdGlvbiA9IG9wOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vVmFsaWRhdGlvblVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1ZhbGlkYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjMyZmEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vVmFsaWRhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblVJUGx1Z2luIGV4dGVuZHMgV1RQVUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25VSVBsdWdpbiBfcGx1Z2luID0gbnVsbDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fUFJPUF9GSUxFX05BTUUgPSAidmFsaWRhdGVfdWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zIn07Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoX3BsdWdpbiA9PSBudWxsKSB7Ci0JCQlfcGx1Z2luID0gdGhpczsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBWQUxJREFUSU9OX1BST1BfRklMRV9OQU1FOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25VSVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgU3RyaW5nIGZvdW5kIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKFBsYXRmb3JtLmdldEJ1bmRsZShWQUxJREFUSU9OX1BMVUdJTl9JRCksIGtleSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJTG9nZ2VyIGxvZ2dlciA9IFdUUFVJUGx1Z2luLmdldExvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFN0cmluZykiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoIk1pc3NpbmcgcmVzb3VyY2UgZm9yIGtleSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIG9uZSBvZiBvdXIgaGVhZGxlc3Mgb3BlcmF0aW9ucyBpbiB0aGUKLQkgKiBVSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJV29ya3NwYWNlUnVubmFibGUgYVdvcmtzcGFjZVJ1bm5hYmxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFXb3Jrc3BhY2VSdW5uYWJsZSk7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgewotLy8JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKLS8vCX0KLQotCS8vIE5lZWQgYSB0aGlyZCwgVmFsaWRhdGlvbk9wZXJhdGlvbiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLCBiZWNhdXNlIFZhbGlkYXRpb25PcGVyYXRpb24KLQkvLyBpcyBib3RoIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBhbmQgYW4gSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgbWV0aG9kIHdpbGwKLQkvLyBleGlzdCBvbmx5IHdoaWxlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGV4aXN0cy4KLQlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhWYWxpZGF0aW9uT3BlcmF0aW9uIG9wKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8Jb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMudWkuVUlSZXNvdXJjZVV0aWwuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOwotCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgewotCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7Ci0JCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YThjMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3ZhbGlkYXRpb251aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1TYXZlRmlsZXNEaWFsb2dfc2F2aW5nPVNhdmluZyBSZXNvdXJjZXMKLVNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZT0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKLVNhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCi1TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCi0KLVByZWZQYWdlX2Fsd2F5c19zYXZlPSZTYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCi0KLVJ1blZhbGlkYXRpb25EaWFsb2dUaXRsZT1SdW5uaW5nIFZhbGlkYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2ZWI3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0ZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZhbGlkYXRlX2NvcmUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM2OTA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLXZhbGlkYXRlLmphcgotYnVpbGQueG1sCi1jb21tb24uamFyCi12YWxpZGF0ZXNyYy56aXAKLWNvbW1vbnNyYy56aXAKLXNyYy56aXAKLW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uXzEuMC4wLnppcAotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTY1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi9kZWJ1Zz10cnVlCi1jb20uaWJtLmV0b29scy52YWxpZGF0aW9uL3RyYWNlZmlsdGVyPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZkYWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGMwZjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI0ZyaSBBcHIgMTMgMTQ6MTg6MzEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlMjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBNYXIgMjkgMDQ6MDc6MDcgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDFlNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMi5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkYjM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyY2JmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLgotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICB4c2RzLwotb3V0cHV0Li4gPSBiaW4vCi1zb3VyY2UuLiA9IHZhbGlkYXRlX2NvcmUvLFwKLSAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgdmFsaWRhdGUvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDExZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPjxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUiPjwvcGFja2FnZT48cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wbHVnaW4iPjwvcGFja2FnZT48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZTQ4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFZlcnNpb24gMS4zCi0jCi1WQUxJREFUSU9OX0JVSUxERVJfTkFNRT1WYWxpZGF0aW9uCi1WQUxJREFUSU9OX1BST0JMRU1NQVJLRVJfTkFNRT1WYWxpZGF0aW9uIE1lc3NhZ2UKLVZBTElEQVRJT05fUFJPSkVDVE1BUktFUl9OQU1FPUVuYWJsZWQgVmFsaWRhdG9ycwotVkFMSURBVElPTl9QUkVGRVJFTkNFTUFSS0VSX05BTUU9VmFsaWRhdGlvbiBQcmVmZXJlbmNlcwotVmFsaWRhdG9yPVZhbGlkYXRvcgotUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yPVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcgotdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI9dmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIKLVZhbGlkYXRvckRlbGVnYXRlcz1WYWxpZGF0b3IgRGVsZWdhdGVzCi0KLUJ1bmRsZS1OYW1lLjAgPSBWYWxpZGF0aW9uIEZyYW1ld29yawotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4NzkxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gVmFsaWRhdGlvbiBleHRlbnNpb24gcG9pbnRzIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yIiBuYW1lPSIlVmFsaWRhdG9yIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yRXh0U2NoZW1hLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgbmFtZT0iJVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIgc2NoZW1hPSJ4c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciIgbmFtZT0iJXZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIiBzY2hlbWE9InhzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdGlvbkhlbHBlciIgbmFtZT0idmFsaWRhdGlvbkhlbHBlciIgc2NoZW1hPSJ4c2RzL3ZhbGlkYXRpb25IZWxwZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idmFsaWRhdG9yRGVsZWdhdGVzIiBuYW1lPSIlVmFsaWRhdG9yRGVsZWdhdGVzIiBzY2hlbWE9InhzZHMvdmFsaWRhdG9yRGVsZWdhdGVzLmV4c2QiLz4gICAKLSAgIAotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gVmFsaWRhdGlvbiBDb250cmlidXRpb25zICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25idWlsZGVyIgotICAgICAgICAgbmFtZT0iJVZBTElEQVRJT05fQlVJTERFUl9OQU1FIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmJ1aWxkZXJzIj4KLSAgICAgIDxidWlsZGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbkJ1aWxkZXIiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2J1aWxkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gUHJvYmxlbSBtYXJrZXJzIG11c3QgYmUgYSBzdWJ0eXBlIG9mIHByb2JsZW1tYXJrZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YXNrIHZpZXcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvYmxlbW1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVWQUxJREFUSU9OX1BST0JMRU1NQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im93bmVyIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmFsaWRhdGlvblNldmVyaXR5Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idGFyZ2V0T2JqZWN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iZ3JvdXBOYW1lIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWVzc2FnZUlkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgPC9leHRlbnNpb24+Ci08IS0tIERvbid0IHdhbnQgdG8gZGlzcGxheSB0aGlzIG1hcmtlciBpbiB0aGUgdGFzayB2aWV3IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InByb2plY3RtYXJrZXIiCi0gICAgICAgICBuYW1lPSIlVkFMSURBVElPTl9QUk9KRUNUTUFSS0VSX05BTUUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiPgotICAgICAgPC9zdXBlcj4KLSAgICAgIDxwZXJzaXN0ZW50Ci0gICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+Ci0gICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJlbmFibGVkVmFsaWRhdG9yTGlzdCI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9ImF1dG9WYWxpZGF0ZSI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9InJ1bldoZW5CdWlsZCI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9Im1heE51bU1lc3NhZ2VzIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ib3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlcyI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9InZlcnNpb24iPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gRG9uJ3Qgd2FudCB0byBkaXNwbGF5IHRoaXMgbWFya2VyIGluIHRoZSB0YXNrIHZpZXcgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJlZmVyZW5jZW1hcmtlciIKLSAgICAgICAgIG5hbWU9IiVWQUxJREFUSU9OX1BSRUZFUkVOQ0VNQVJLRVJfTkFNRSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlcgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGV4dG1hcmtlciI+Ci0gICAgICA8L3N1cGVyPgotICAgICAgPHBlcnNpc3RlbnQKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvcGVyc2lzdGVudD4KLSAgICAgIDxhdHRyaWJ1dGUKLSAgICAgICAgICAgIG5hbWU9ImVuYWJsZWRWYWxpZGF0b3JMaXN0Ij4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0iYXV0b1ZhbGlkYXRlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0icnVuV2hlbkJ1aWxkIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0ibWF4TnVtTWVzc2FnZXMiPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgICBuYW1lPSJwcm9qZWN0c0Nhbk92ZXJyaWRlIj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICAgbmFtZT0idmVyc2lvbiI+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFkNWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vcHJvcGVydHlfZmlsZXMvdmFsaWRhdGVfYmFzZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV9iYXNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OWI1MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9wcm9wZXJ0eV9maWxlcy92YWxpZGF0ZV9iYXNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucywgZWFjaCBleHRlbnNpb24gcG9pbnQgc2hvdWxkIHByZWZhY2UgdGhlaXIgcHJvcGVydHkgbmFtZXMgd2l0aCBhbiBpZGVudGlmaWVyLgotIwotIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyAgICAgKiBDb2RlIG9yaWVudGVkIGluc3RydWN0aW9uczoKLSMgICAgICoKLSMgICAgICogSW4gdGhlIHN0cmluZywgeW91IG1heSBzZWUgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHNlcXVlbmNlczoKLSMgICAgICogYSkge259ICB3aGVyZSBuIGlzIGEgbnVtYmVyLiBUaGVzZSBhcmUgcmVwbGFjZWFibGUgcGFyYW1ldGVycy4KLSMgICAgICogYikgJycgIEluIC5wcm9wZXJ0aWVzIGZpbGVzLCBpbiBvcmRlciB0byBzZWUgb25lIGFwb3N0cm9waGUgKCcpIGluIHRoZSBmaW5hbAotIyAgICAgKiAgICBzdHJpbmcsIHNvbWV0aW1lcyB0d28gYXBvc3Ryb3BoZXMgbXVzdCBiZSBlbnRlcmVkIGluIHRoZSBzdHJpbmcuIEluIHRoZSB0cmFuc2xhdGVkCi0jICAgICAqICAgIHN0cmluZywgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHtufSBpbiB0aGUgc3RyaW5nLCB0aGVuIHRvIHNob3cgb25lIGFwb3N0cm9waGUKLSMgICAgICogICAgdG8gdGhlIHVzZXIsIHB1dCB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIHN0cmluZy4gSWYgdGhlcmUgYXJlIG5vIHtufSBpbiB0aGUgc3RyaW5nLAotIyAgICAgKiAgICB0aGVuIHB1dCBvbmUgYXBvc3Ryb3BoZS4KLSMgICAgICogICAgRm9yIGV4YW1wbGUsIHNheSB0aGF0IHlvdSB3YW50IHRoZSB1c2VyIHRvIHJlYWQgIkdlb3JnZSdzIGZpbGUiLiAKLSMgICAgICogICAgICAgIEdFT1JHRT1HZW9yZ2UncyBmaWxlIHdhcyBvbiB0aGUgZGVzay4KLSMgICAgICogICAgICAgIEdFT1JHRTI9R2VvcmdlJydzIGZpbGUgYW5kIHswfSB3ZXJlIG9uIHRoZSBkZXNrLgotIyAgICAgKiAgICBHRU9SR0UgdXNlcyBvbmUgYXBvc3Ryb3BoZSBiZWNhdXNlIHRoZXJlIGFyZSBubyB7bn0gYW5kIEdFT1JHRTIKLSMgICAgICogICAgdXNlcyB0d28gYXBvc3Ryb3BoZXMgYmVjYXVzZSB0aGVyZSBpcyBhIHtufS4KLSMgICAgICogYykgJycgdGV4dCAnJyB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgZG91YmxlCi0jICAgICAqICAgIGFwb3N0cm9waGVzIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gCi0jICAgICAqIGQpIDx0ZXh0PiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgYW5nbGUKLSMgICAgICogICAgYnJhY2tldHMgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiBlKSAidGV4dCIgd2hlcmUgdGV4dCBjYW4gYmUgYW55IHdvcmQocykuIFRoZSB0ZXh0IGJldHdlZW4gdGhlIHF1b3RhdGlvbiAKLSMgICAgICogICAgbWFya3Mgc2hvdWxkIE5PVCBiZSB0cmFuc2xhdGVkLgotIyAgICAgKiAgICAKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAgICogT3RoZXIgaW5zdHJ1Y3Rpb25zCi0jICAgICAqIGEpIERvIG5vdCB0cmFuc2xhdGUgYW55IHRleHQgdGhhdCBpcyBvbiBhIGxpbmUgd2hpY2ggYmVnaW5zIHdpdGggYSBjb21tZW50IAotIyAgICAgKiAgICBzeW1ib2wgKCMpLgotIyAgICAgKiBiKSBEbyBub3QgdHJhbnNsYXRlIHRoZXNlIHdvcmRzOiAKLSMgICAgICogICAgICAgIHNjaGVtYSwgRUpCLCBSREIsIEpBUiwgUk1JLCBCTVAsIENNUCwgT09TUUwKLSMgICAgICogYykgUGxlYXNlIHJldHVybiB0aGUgLnByb3BlcnRpZXMgZmlsZXMgdXNpbmcgdGhlIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSMgICAgICogICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0d28gb2YgdGhlIGZpbGVzIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSMgICAgICoKLSMgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQW55IG90aGVyIGNvbW1lbnRzIHRvIHRoZSB0cmFuc2xhdG9ycyBhcmUgb24gbGluZXMgd2hpY2ggc3RhcnQgbGlrZSB0aGlzOiAgIyAyVEM6Ci0jCi0jIFZlcnNpb24gMS4xNAotIwotIwotIyBJRDoKLSMgICAgVkJGIC0gVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yawotIyAgICAgICBWQkZfRVhDPUV4Y2VwdGlvbiBvciBlcnJvciB0ZXh0Ci0jICAgICAgIFZCRl9TVEFUVVM9U3RhdHVzIG1lc3NhZ2UKLSMgICAgICAgVkJGX1RBU0s9VGFzayBsaXN0IG1lc3NhZ2UKLSMKLQotIyAKLSMgQmVnaW4gVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yayBTdHJpbmdzCi0jCi0jIElEczoKLSMgICAgVkJGX0VYQz1FeGNlcHRpb24gb3IgZXJyb3IgdGV4dAotIyAgICBWQkZfU1RBVFVTPVN0YXR1cyBtZXNzYWdlCi0jICAgIFZCRl9UQVNLPVRhc2sgbGlzdCBtZXNzYWdlCi0jCi1WQkZfRVhDX0NBTk5PVF9BRERfTUFSS0VSPUlXQUUwMDAxRSBUaGUgbWFya2VyIGNhbm5vdCBiZSBhZGRlZCB0byByZXNvdXJjZSB7MH0gaW4gdGhlIHRhc2sgbGlzdC4KLVZCRl9FWENfQ0FOTk9UX1JFTU9WRV9NQVJLRVI9SVdBRTAwMDJFIFRoZSBtYXJrZXIgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSByZXNvdXJjZSB7MH0gaW4gdGhlIHRhc2sgbGlzdC4KLQotVkJGX0VYQ19IRUxQRVJfTUlTU0lORz1JV0FFMDAwM0UgVW5hYmxlIHRvIGxvYWQgezB9IGJlY2F1c2UgaXQgZGlkIG5vdCBzcGVjaWZ5IGEgPGhlbHBlcj4uIEVhY2ggdmFsaWRhdG9yIG11c3QgaWRlbnRpZnkgdGhlIGhlbHBlciBjbGFzcyB0aGF0IGxvYWRzIGl0cyBNT0YgbW9kZWwuCi1WQkZfRVhDX0hFTFBFUl9DQU5OT1RMT0FEPUlXQUUwMDA0RSBVbmFibGUgdG8gbG9hZCB7MH0gYmVjYXVzZSBpdHMgPGhlbHBlcj4sIHsxfSwgY291bGQgbm90IGJlIGxvYWRlZC4gRW5zdXJlIHRoYXQgdGhlIGNhc2Utc2Vuc2l0aXZlIGZpbGUgbmFtZSBpcyBzcGVsbGVkIGNvcnJlY3RseS4KLQotVkJGX0VYQ19JTlRFUk5BTD1JV0FFMDAwNUUgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHZhbGlkYXRpb24uIFZhbGlkYXRpb24gd2FzIGJlaW5nIHJ1biBvbiBwcm9qZWN0IHswfSB3aXRoIHZhbGlkYXRvciB7MX0uIFRoZSBtZXNzYWdlIHRocm93biB3YXMgezJ9LgotCi0jIDJUQzogSW4gdGhlIGZvbGxvd2luZyBzdHJpbmcsICJ0eXBlIiBpcyBhIG5vdW4KLVZCRl9FWENfSU5WQUxJRF9UWVBFX0ZJTFRFUj1JV0FFMDAwNkUgSW52YWxpZCB0eXBlIGZpbHRlcjsgezB9IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgezF9LgotVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFPUlXQUUwMDA3RSBDYW5ub3QgYWRkIG1lc3NhZ2UgInswfSIgd2l0aCB0YXJnZXQgb2JqZWN0ICJ7MX0iIGJlY2F1c2Ugbm8gZmlsZSwgZm9sZGVyLCBvciBwcm9qZWN0IGNhbiBiZSBmb3VuZCB3aXRoIHdoaWNoIHRvIGFzc29jaWF0ZSB0aGUgbWVzc2FnZS4KLQotVkJGX0VYQ19NSVNTSU5HX1ZBTElEQVRPUl9FUD1JV0FFMDAwOEUgVGhlIHZhbGlkYXRvciBmcmFtZXdvcmsgY291bGQgbm90IGJlIHN0YXJ0ZWQuIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZWQgXCJ7MH1cIiBjb3VsZCBub3QgYmUgZm91bmQuIFNhdmUgYWxsIGxvZyBmaWxlcyBhbmQgY29udGFjdCB5b3VyIElCTSByZXByZXNlbnRhdGl2ZS4KLVZCRl9FWENfTUlTU0lOR19QUk9KRUNUTkFUVVJFX0lEPUlXQUUwMDA5RSBBIHByb2plY3ROYXR1cmUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgSUQuIFZhbGlkYXRpb24gaXMgaWdub3JpbmcgdGhpcyB0YWcgYW5kIGNvbnRpbnVpbmcuCi0KLVZCRl9FWENfUlVOVElNRT1JV0FFMDAxMEUgUnVuLXRpbWUgZXhjZXB0aW9uIHswfSBvY2N1cnJlZCBkdXJpbmcgdmFsaWRhdGlvbi4gVGhlIHZhbGlkYXRvciBiZWluZyBydW4gd2FzIHsxfSBhbmQgdGhlIG1lc3NhZ2UgdGhyb3duIHdhcyB7Mn0uCi0KLVZCRl9FWENfU1lOVEFYX05VTExfTkFNRT1JV0FFMDAxMUUgUmVzb3VyY2UgezB9IGNhbm5vdCBiZSBhZGRlZCB0byBmaWxlIGxpc3QgYmVjYXVzZSBJV29ya2JlbmNoQ29udGV4dC5nZXRQb3J0YWJsZU5hbWUoKSByZXR1cm5zIG51bGwuIFRoaXMgcmVzb3VyY2Ugd2lsbCBub3QgYmUgdmFsaWRhdGVkIGJ5IHRoZSB2YWxpZGF0b3IgbmFtZWQgezF9LgotVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSPUlXQUUwMDEyRSBObyA8aGVscGVyPiBlbGVtZW50IGlzIHNwZWNpZmllZCBpbiB0aGUgcGx1Z2luLnhtbCBmaWxlIGZvciB2YWxpZGF0b3IgezB9LiBTaW5jZSB0aGUgaGVscGVyIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgdmFsaWRhdG9yIHdpbGwgbm90IGJlIGxvYWRlZC4KLVZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9DTEFTUz1JV0FFMDAxM0UgTm8gImNsYXNzIiBhdHRyaWJ1dGUgaW4gdGhlIDxoZWxwZXI+IGVsZW1lbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yIHZhbGlkYXRvciB7MH0uIFRoZSBoZWxwZXIgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aG91dCB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGl0LiBTaW5jZSB0aGUgaGVscGVyIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgdmFsaWRhdG9yIHdpbGwgbm90IGJlIGxvYWRlZC4KLVZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9USFJPV0FCTEU9SVdBRTAwMTRFIFRoZSBoZWxwZXIgezB9IGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgYSBUaHJvd2FibGUgd2FzIGNhdWdodC4KLVZCRl9FWENfU1lOVEFYX05PX1ZBTF9SVU49SVdBRTAwMTVFIFZhbGlkYXRvciBjYW5ub3QgYmUgY3JlYXRlZCBiZWNhdXNlIG5vIDxydW4+IGVsZW1lbnQgaXMgc3BlY2lmaWVkIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUgZm9yIHRoZSB2YWxpZGF0b3IgbmFtZWQgezB9LiBDYW5ub3QgY3JlYXRlIGEgdmFsaWRhdG9yIHVubGVzcyBhIDxydW4+IGVsZW1lbnQgZXhpc3RzIHRoYXQgc3BlY2lmaWVzIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZS4gVGhlIHZhbHVlIG9mIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgSVdvcmtiZW5jaEhlbHBlciBpbnRlcmZhY2UuCi1WQkZfRVhDX1NZTlRBWF9OT19WQUxfQ0xBU1M9SVdBRTAwMTZFIFZhbGlkYXRvciBjYW5ub3QgYmUgY3JlYXRlZCBiZWNhdXNlIG5vICJjbGFzcyIgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHJ1bj4gZWxlbWVudCBvZiB0aGUgcGx1Z2luLnhtbCBmaWxlIGZvciB0aGUgdmFsaWRhdG9yIG5hbWVkIHswfS4gQ2Fubm90IGNyZWF0ZSBhIHZhbGlkYXRvciB1bmxlc3MgYSA8cnVuPiBlbGVtZW50IGV4aXN0cyB0aGF0IHNwZWNpZmllcyB0aGUgImNsYXNzIiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBvZiB0aGUgImNsYXNzIiBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIElXb3JrYmVuY2hIZWxwZXIgaW50ZXJmYWNlLgotVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRT1JV0FFMDAxN0UgQ2Fubm90IGNyZWF0ZSB2YWxpZGF0b3IgezB9IGJlY2F1c2UgYSBUaHJvd2FibGUgd2FzIGNhdWdodC4KLVZCRl9FWENfU1lOVEFYX05PX1ZBTF9OVUxMPUlXQUUwMDE4RSBWYWxpZGF0b3IgY2xhc3MgezB9IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBJQ29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihTdHJpbmcpIHJldHVybmVkIG51bGwuCi0KLVZCRl9FWENfRElTQUJMRVY9SVdBRTAwMTlFIENhbm5vdCBpbnN0YW50aWF0ZSB2YWxpZGF0b3IgezB9LiBEaXNhYmxpbmcgdGhlIHZhbGlkYXRvcjsgcmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLgotVkJGX0VYQ19ESVNBQkxFSD1JV0FFMDAyMEUgQ2Fubm90IGluc3RhbnRpYXRlIGhlbHBlciB7MH0uIERpc2FibGluZyB2YWxpZGF0b3IgezF9OyByZWFkIHRoZSBsb2cgZm9yIGRldGFpbHMuCi1WQkZfRVhDX09SUEhBTl9JVkFMSURBVE9SPUlXQUUwMDIxRSBDYW5ub3QgbG9jYXRlIG1ldGEtZGF0YSBmb3IgdmFsaWRhdG9yIHswfS4KLQotVkJGX0VYQ19WQUxJREFUT1JOQU1FX0lTX05VTEw9SVdBRTAwMjJFIFRoZSBwbHVnaW4gd2l0aCBJRCB7MH0gaGFzIGJlZW4gZGlzYWJsZWQgYmVjYXVzZSBpdHMgZ2V0TmFtZSgpIG1ldGhvZCByZXR1cm5zIG51bGwuIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSB2YWx1ZS4KLQotVkJGX0VYQ19OVUxMQ1JFQVRFPUlXQUUwMDIzRSBDYW5ub3QgY3JlYXRlIGEgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgbnVsbCByZXNvdXJjZS4KLVZCRl9FWENfTlVMTFNBVkU9SVdBRTAwMjRFIENhbm5vdCBzYXZlIGEgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgbnVsbCByZXNvdXJjZS4KLVZCRl9FWENfU0FWRT1JV0FFMDAyNUUgQ291bGQgbm90IHNhdmUgdGhlIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBvbiByZXNvdXJjZSB7MH0uCi1WQkZfRVhDX05VTExSRVRSSUVWRT1JV0FFMDAyNkUgQ2Fubm90IHJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSByZXNvdXJjZSBpcyBudWxsLgotVkJGX0VYQ19SRVRSSUVWRT1JV0FFMDAyN0UgQ291bGQgbm90IHJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHJlc291cmNlIHswfS4KLQotVkJGX0VYQ19CQURWTUQ9SVdBRTAwMjhFIFZhbGlkYXRvck1ldGFEYXRhW10gbXVzdCBub3QgYmUgbnVsbCBvciBlbXB0eS4KLVZCRl9FWENfT1BFTlBSSj1JV0FFMDAyOUUgUHJvamVjdCB7MH0gbXVzdCBiZSBvcGVuLgotVkJGX0VYQ19FWElTVFBSSj1JV0FFMDAzMEUgUHJvamVjdCB7MH0gbXVzdCBleGlzdC4KLVZCRl9FWENfQkFEUFJKPUlXQUUwMDMxRSBQcm9qZWN0IHswfSBtdXN0IGJlIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlcyBpbiB0aGUgSVJlc291cmNlW10uCi1WQkZfRVhDX01VTFRJUFJKPUlXQUUwMDMyRSBBbGwgSVJlc291cmNlIGluc3RhbmNlcyBpbiB0aGUgSVJlc291cmNlW10gbXVzdCBiZSBwYXJ0IG9mIHRoZSBzYW1lIElQcm9qZWN0IGluc3RhbmNlLiBUaGUgcmVzb3VyY2VzIGNvbWUgZnJvbSB0aGUgZm9sbG93aW5nIHByb2plY3RzOiB7MH0uCi1WQkZfRVhDX0JBRFZBTD1JV0FFMDAzM0UgVmFsaWRhdG9yIHswfSBtdXN0IGJlIGNvbmZpZ3VyZWQgb24gezF9OwotCi1WQkZfU1RBVFVTX0lOSVRJQUxJWklORz1Jbml0aWFsaXppbmcgezB9LgotCi1WQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQPVBlcmZvcm1pbmcgY2xlYW51cCBvbiB7MH0gYmVmb3JlIHRlcm1pbmF0aW9uLgotCi1WQkZfU1RBVFVTX1BST0dSRVNTTU9OSVRPUl9USVRMRT1WYWxpZGF0aW5nCi1WQkZfU1RBVFVTX05VTExfREVMVEE9TGFzdCBidWlsZCBzdGF0ZSBvZiB7MH0gY291bGQgbm90IGJlIHJldHJpZXZlZC4gUGVyZm9ybWluZyBhIGZ1bGwgdmFsaWRhdGlvbi4KLQotVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRD1WYWxpZGF0aW9uIG9mIHswfSB1c2luZyB7MX0gd2FzIGNhbmNlbGxlZC4KLQotVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVM9UmVtb3ZpbmcgezB9IG1lc3NhZ2VzIG9uIHsxfSBoYXMgc3RhcnRlZC4uLgotVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTPU1lc3NhZ2VzIHJlbW92ZWQuCi0KLVZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTj1WYWxpZGF0aW9uIG9mIHswfSBieSB7MX0gaGFzIHN0YXJ0ZWQuLi4KLVZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT049VmFsaWRhdGlvbiBvZiB7MH0gYnkgezF9IGlzIGNvbXBsZXRlLiBBbGwga25vd24gcHJvYmxlbXMgaGF2ZSBiZWVuIHJlcG9ydGVkLgotVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZPVZhbGlkYXRpb24gb2YgezB9IGJ5IHsxfSBlbmRlZCBhYm5vcm1hbGx5LiBUaGUgbGlzdCBvZiBwcm9ibGVtcyBtYXkgYmUgaW5jb21wbGV0ZS4gUGxlYXNlIGNoZWNrIHRoZSBpbmZvcm1hdGlvbiBtZXNzYWdlcyBmb3IgdGhlIGNhdXNlIG9mIHRoZSBhYm5vcm1hbCB0ZXJtaW5hdGlvbi4KLQotVkJGX1NUQVRVU19MT09LSU5HPUxvb2tpbmcgZm9yIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLgotVkJGX1NUQVRVU19MT09LSU5HRE9ORT1Mb29raW5nIGZvciB2YWxpZGF0aW9uIG1lc3NhZ2VzIG93bmVkIGJ5IHVuaW5zdGFsbGVkIHZhbGlkYXRvcnMuLi5kb25lLgotVkJGX1NUQVRVU19SRU1PVklORz1SZW1vdmluZyB2YWxpZGF0aW9uIG1lc3NhZ2VzIG93bmVkIGJ5IHVuaW5zdGFsbGVkIHZhbGlkYXRvcnMuLi4KLVZCRl9TVEFUVVNfUkVNT1ZJTkdET05FPVJlbW92aW5nIHZhbGlkYXRpb24gbWVzc2FnZXMgb3duZWQgYnkgdW5pbnN0YWxsZWQgdmFsaWRhdG9ycy4uLmRvbmUuCi0KLVZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURT1UaGUgdmFsaWRhdG9yIHswfSBpcyBhIGJlaW5nIGludm9rZWQgd2l0aCBhIHdyb25nIGNvbnRleHQuIFBsZWFzZSB1c2UgYW4gSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dC4KLVZCRl9OT19ERUxFR0FURT1UaGUgdmFsaWRhdG9yIHswfSBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yIGJ1dCBubyBkZWxlZ2F0ZSBjYW4gZm91bmQgZm9yIGl0LgotVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURT1UaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHswfSByZWdpc3RlcmVkIGZvciB7MX0gY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLQotIyBUaGUgZm9sbG93aW5nIG1lc3NhZ2Ugd2lsbCBiZSBkZWxldGVkIHNvb24uCi1WQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfQUJPUlQ9SVdBRTAwMzRXIElXQUQzMDAwSTogezF9IHRlcm1pbmF0ZWQgdmFsaWRhdGlvbiBvZiB7MH0gYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgd2VyZSByZXBvcnRlZC4gU29tZSBtZXNzYWdlcyBtYXkgYmUgbWlzc2luZy4KLQotVkJGX1RBU0tfV0FSTl9NRVNTQUdFX0xJTUlUX1ZBTD1JV0FFMDAzNVcgSVdBRDMwMDBJOiBTb21lIG1lc3NhZ2VzIG1heSBiZSBtaXNzaW5nIGJlY2F1c2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGhhcyBiZWVuIHJlcG9ydGVkLiBJbmNyZWFzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgYW5kIHRyeSBhZ2Fpbi4KLVZCRl9WQUxJREFUSU9OX0pPQl9NU0c9V2FpdGluZyBmb3IgYnVpbGQKLQotIwotIyBFbmQgVmFsaWRhdGlvbiBCdWlsZGVyIEZyYW1ld29yayBTdHJpbmdzCi0jCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwN2VjMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBWYWxpZGF0aW9uIGNvbnN0YW50cyBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBtYXJrZXIgZXh0ZW5zaW9uIHBvaW50IGFuZCB0aGUgdXNlcidzIHByZWZlcmVuY2VzLgotICogCi0gKiBPbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgdXNlIHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCVN0cmluZyBESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcgPSAiZGlzYWJsZUFsbFZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkIC8vIGJvb2xlYW4KLQlTdHJpbmcgU0FWRV9BVVRPTUFUSUNBTExZX1NFVFRJTkcgPSAic2F2ZUF1dG9tYXRpY2FsbHkiOyAvLyROT04tTkxTLTEkIC8vIGJvb2xlYW4KLQotCS8vIERlZmF1bHRzIGZvciB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvamVjdCB2YWx1ZXMKLQkKLQlTdHJpbmcgQ1VSUkVOVF9WRVJTSU9OID0gKFN0cmluZykgVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRIZWFkZXJzKCkuZ2V0KG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX1ZFUlNJT04pOyAvLyROT04tTkxTLTEkIC8vIHRoaXMgaXMgYSBjb25zdGFudCwgc28gaXQgc2hvdWxkIGJlIGludGVybgotCWJvb2xlYW4gREVGQVVMVF9BU1lOQyA9IHRydWU7Ci0JYm9vbGVhbiBERUZBVUxUX0RJU0FCTEVfVkFMSURBVElPTl9TRVRUSU5HID0gZmFsc2U7Ci0JVmFsaWRhdG9yTWV0YURhdGFbXSBERUZBVUxUX0VOQUJMRURfVkFMSURBVE9SUyA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YUFycmF5RW5hYmxlZEJ5RGVmYXVsdCgpOyAvLyROT04tTkxTLTEkIC8vIHN0b3JlIGEgY29weSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBhbmQgZG9uJ3QgY3JlYXRlIGEgY29weSBldmVyeSB0aW1lIHdlIG5lZWQgdGhpcyB2YWx1ZQotCWludCBERUZBVUxUX01BWE5VTU1FU1NBR0VTID0gNTA7Ci0JaW50IERFUFRIX0lORklOSVRFID0gSVJlc291cmNlLkRFUFRIX0lORklOSVRFOwotCWludCBERVBUSF9aRVJPID0gSVJlc291cmNlLkRFUFRIX1pFUk87Ci0JU3RyaW5nIEVMRU1FTlRfU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkIC8vIHNlcGFyYXRlcyB0aGUgbmFtZSBvZiBvbmUgSVZhbGlkYXRvciBmcm9tIHRoZSBuZXh0IGluIHRoZSBsaXN0IG9mIGVuYWJsZWQgdmFsaWRhdG9ycyBmb3IgYSBwcm9qZWN0IG9yIHByZWZlcmVuY2UKLQlTdHJpbmcgREVMRUdBVEVTX1NFUEFSQVRPUiA9ICI9IjsgLy8kTk9OLU5MUy0xJCAvLyBTZXBhcmF0ZXMgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yIGlkIGZyb20gdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBpZCBpbiB0aGUgbGlzdCBvZiBkZWxlZ2F0ZXMKLQotCS8vIFRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHByZWZlcmVuY2UgbWFya2VyIGFzIHNob3duIGluCi0JLy8gcGx1Z2luLnhtbAotCS8vIEV2ZW4gdGhvdWdoIHRoZSBwbHVnaW4ueG1sIHZhbHVlcyBhcmUgbm90IHVzZWQgdG8gY3JlYXRlIG5ldyBQcmVmZXJlbmNlIG9yIFByb2plY3QgbWFya2VycywKLQkvLyBtYWludGFpbmluZyBvbmUgbG9jYWwgbmFtZSBlbnN1cmVzIHRoYXQgdGhlcmUncyBubyBjb25mdXNpb24gd3JpdGluZyB0aGUgbWlncmF0aW9uIGNvZGUuCi0JLy8gVGhlc2UgYXJlIHRoZSBRdWFsaWZpZWROYW1lcyB1c2VkIHRvIHBlcnNpc3QgdGhlIHVzZXIncyBzZXR0aW5ncy4KLQlTdHJpbmcgRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUyA9ICJlbmFibGVkTWFudWFsVmFsaWRhdG9yTGlzdCI7IC8vJE5PTi1OTFMtMSQgLy8gU3RyaW5nCi0JU3RyaW5nIEVOQUJMRURfQlVJTERfVkFMSURBVE9SUyA9ICJlbmFibGVkQnVpbGRWYWxpZGF0b3JMaXN0IjsgLy8kTk9OLU5MUy0xJCAvLyBTdHJpbmcKLQlTdHJpbmcgREVMRUdBVEVfVkFMSURBVE9SUyA9ICJkZWxlZ2F0ZVZhbGlkYXRvckxpc3QiOyAvLyROT04tTkxTLTEkIC8vIFN0cmluZwotCVN0cmluZyBKMkVFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZSI7IC8vJE5PTi1OTFMtMSQgLy8gRm9yIDQuMDMsIHRoaXMgaXMgdGhlIHBsdWdpbiBpZCB0aGF0IHRoZSB2YWxpZGF0aW9uIGNvbnN0YW50cyB3ZXJlIGRlY2xhcmVkIGluLgotCVN0cmluZyBNQVhOVU1NRVNTQUdFUyA9ICJtYXhOdW1NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQgLy8gaW50ZWdlcgotCVN0cmluZyBQTFVHSU5fSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQlTdHJpbmcgUFJFRl9QUk9KRUNUU19DQU5fT1ZFUlJJREUgPSAicHJvamVjdHNDYW5PdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbgotCS8vIGVuZCB2YWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGNvbnN0YW50cwotCi0JLy8gUHJlZmVyZW5jZSBhbmQgUHJvamVjdCBjb25zdGFudHMKLQlTdHJpbmcgUFJFRkVSRU5DRV9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByZWZlcmVuY2VtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSl9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByb2plY3RtYXJrZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBleHRlbnNpb24gd2hpY2ggc2F2ZXMgdXNlciB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGZvciBhIHBhcnRpY3VsYXIgcHJvamVjdCAoZS5nLiB3aGljaCB2YWxpZGF0b3JzIHJ1biBvbiB0aGUgcHJvamVjdCkKLQlTdHJpbmcgUFJKX01BUktFUl80MDMgPSBKMkVFX1BMVUdJTl9JRCArICIucHJvamVjdG1hcmtlciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIGV4dGVuc2lvbiB3aGljaCBzYXZlcyB1c2VyIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0IChlLmcuIHdoaWNoIHZhbGlkYXRvcnMgcnVuIG9uIHRoZSBwcm9qZWN0KQotCVN0cmluZyBQUkpfT1ZFUlJJREVHTE9CQUwgPSAib3ZlcnJpZGVHbG9iYWxQcmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQgLy8gYm9vbGVhbiAoVXNlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZXMgb3Igb3ZlcnJpZGUpCi0KLQlRdWFsaWZpZWROYW1lIFVTRVJfUFJFRkVSRU5DRSA9IG5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgIlZhbGlkYXRpb25Db25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUmVzb3VyY2UKLQlRdWFsaWZpZWROYW1lIFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UgPSBuZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJWYWxpZGF0aW9uTWFudWFsQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGZvciB0aGUgSVJlc291cmNlCi0JUXVhbGlmaWVkTmFtZSBVU0VSX0JVSUxEX1BSRUZFUkVOQ0UgPSBuZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJWYWxpZGF0aW9uQnVpbGRDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUmVzb3VyY2UKLQlRdWFsaWZpZWROYW1lIERFTEVHQVRFU19QUkVGRVJFTkNFID0gbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAiVmFsaWRhdGlvbkRlbGVnYXRlc0NvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBmb3IgdGhlIElSZXNvdXJjZQotCi0JLy8gVmFsaWRhdGlvbiBtZXNzYWdlIG1hcmtlciBjb25zdGFudHMKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVIgPSBQTFVHSU5fSUQgKyAiLnByb2JsZW1tYXJrZXIiOyAvLyROT04tTkxTLTEkIC8vIFRoZSBleHRlbnNpb24gd2hpY2ggaXMgdXNlZCB0byBhZGQgdmFsaWRhdGlvbiBtYXJrZXJzIHRvIHRoZSB0YXNrIGxpc3QKLQlTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfR1JPVVAgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJCAvLyBGb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhpcyBmaWVsZCBhc3NvY2lhdGVzIGEgbWVzc2FnZSB3aXRoIGEgZ3JvdXAsIHNvIHRoYXQgYSBzdWJzZXQgb2YgbWVzc2FnZXMgbWF5IGJlIHJlbW92ZWQgZnJvbSBhIGZpbGUuCi0JU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRCA9ICJtZXNzYWdlSWQiOyAvLyROT04tTkxTLTEkIC8vIFBlcnNpc3QgdGhlIG1lc3NhZ2UgaWQgb2YgdGhlIG1lc3NhZ2UsIG5vdCBqdXN0IHRoZSB0cmFuc2xhdGVkIHRleHQuCi0KLQkvLyBUaGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgbWFya2VyIGFzIHNob3duIGluCi0JLy8gcGx1Z2luLnhtbAotCVN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIElWYWxpZGF0b3Igd2hvIG93bnMgdGhlIElNYXJrZXIgb24gdGhlIHRhc2sgbGlzdAotCVN0cmluZyBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWSA9ICJ2YWxpZGF0aW9uU2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkIC8vIG9uZSBvZiB0aGUgU2V2ZXJpdHlFbnVtIHZhbHVlcwotCVN0cmluZyBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QgPSAidGFyZ2V0T2JqZWN0IjsgLy8kTk9OLU5MUy0xJCAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSBJUmVzb3VyY2UsIHRoaXMgZmllbGQgaWRlbnRpZmllcyB3aGljaCB0YXJnZXRPYmplY3Qgb3ducyBhIHBhcnRpY3VsYXIgbWVzc2FnZS4KLQlTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gV1NBRCB2ZXJzaW9ucyB3aGljaCBjcmVhdGVkIG1hcmtlcnMgb2YgdGhlc2UgdHlwZXMKLQlTdHJpbmcgVkVSU0lPTjRfMDMgPSAiNC4wMyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkVSU0lPTjVfMCA9ICI1LjAiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZFUlNJT041XzAxID0gIjUuMC4xIjsgLy8kTk9OLU5MUy0xJAotCS8vIGVuZCBwcmVmZXJlbmNlIGFuZCBwcm9qZWN0IGRlZmF1bHRzCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjBkZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogT25seSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgY2FuIHVzZSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uTWFuYWdlciBpbnN0ID0gbnVsbDsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIoKSB7Ci0JCS8vRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCkgewotCQkJaW5zdCA9IG5ldyBDb25maWd1cmF0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgdmFsaWRhdGlvbiBtYXJrZXIsIHJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHZhbGlkYXRvciB3aG8gb3ducwotCSAqIHRoZSBtZXNzYWdlLiBJZiB0aGUgdmFsaWRhdG9yIGNhbm5vdCBiZSBmb3VuZCBvciBpZiB0aGUgbWFya2VyIGlzIG5vdCBhIHZhbGlkYXRpb24gbWFya2VyLAotCSAqIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKCFtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhWQUxJREFUSU9OX01BUktFUikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJT2JqZWN0IGF0dHJpYiA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJLy8gb3duZXIgbm90IHNldAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGF0dHJpYi50b1N0cmluZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJJbnRlcm5hbFByZWZlcmVuY2VNYW5hZ2VyLmdldFZhbGlkYXRvcihJTWFya2VyKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWFya2VyIGlzIGEgdmFsaWRhdGlvbiBtYXJrZXIuIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBtYXJrZXIuZ2V0VHlwZSgpLmVxdWFscyhWQUxJREFUSU9OX01BUktFUik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIkludGVybmFsUHJlZmVyZW5jZU1hbmFnZXIuaXNWYWxpZGF0aW9uTWFya2VyKElNYXJrZXIpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgdXNlIGJ5IHRoZSBUVlQgVmFsaWRhdGlvbiBwbHVnaW4gT05MWSEhISBObyBjb2RlIHNob3VsZCBhY2Nlc3MgdGhlCi0JICogdmFsaWRhdGlvbiBtYXJrZXJzIGluIHRoZSBsaXN0IGRpcmVjdGx5IGV4Y2VwdCBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCB0aGUgVFZUCi0JICogVmFsaWRhdGlvbiBwbHVnaW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVmFsaWRhdGlvbk1hcmtlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoKHByb2plY3QgPT0gbnVsbCkgfHwgKCFwcm9qZWN0LmlzT3BlbigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXByb2plY3QuZGVsZXRlTWFya2VycyhWQUxJREFUSU9OX01BUktFUiwgZmFsc2UsIERFUFRIX0lORklOSVRFKTsgLy8gZmFsc2UgbWVhbnMgb25seQotCQkJLy8gY29uc2lkZXIgVkFMSURBVElPTl9NQVJLRVIsIG5vdCB2YXJpYW50cyBvZiBWQUxJREFUSU9OX01BUktFUi4gCi0JCQkvL1NpbmNlIGFkZFRhc2sgb25seSBhZGRzIFZBTElEQVRJT05fTUFSS0VSLCB3ZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIGl0cyBzdWJ0eXBlcy4KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIENvdWxkbid0IHJldHJpZXZlIHRoZSBtYXJrZXJzIGZyb20gdGhlIHJlc291cmNlIGZvciBzb21lIHJlYXNvbi4uLgotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJXb3JrYmVuY2hNb25pdG9yLnJlbW92ZUFsbFZhbGlkYXRpb25NYXJrZXJzKElQcm9qZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZ2xvYmFsIHByZWZlcmVuY2VzIGZvciB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uIGdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5nZXRSb290KCk7Ci0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBudWxsOwotCQl0cnkgewotCQkJZ3AgPSAoR2xvYmFsQ29uZmlndXJhdGlvbikgcm9vdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCWlmIChncCA9PSBudWxsKSB7Ci0JCQkJZ3AgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihyb290KTsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlpZiggcHJlZnMgIT0gbnVsbCApewotCQkJCQlwcmVmcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGdwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZ3AuZ2V0VmVyc2lvbigpOyAvLyBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uJ3MgdmVyc2lvbiBhdHRyaWJ1dGUKLQkJCQlncC5sb2FkKCk7IC8vIGluaXRpYWxpemUgdGhpcyBpbnN0YW5jZSBmcm9tIHRoZSBzdG9yZWQgdmFsdWVzCi0JCQkJZ3AucGFzc2l2YXRlKCk7IC8vIHN0b3JlIHRoaXMgaW5zdGFuY2UgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgSVJlc291cmNlCi0JCQl9Ci0JCQlyZXR1cm4gZ3A7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtyb290LmdldE5hbWUoKX0pKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQcm9qZWN0Q29uZmlndXJhdGlvbiBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBudWxsOwotCQl0cnkgewotCQkJcHJqcCA9IChQcm9qZWN0Q29uZmlndXJhdGlvbikgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCWlmIChwcmpwID09IG51bGwgfHwgIXByanAuZ2V0UmVzb3VyY2UoKS5leGlzdHMoKSkgewotCQkJCXByanAgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJcHJqcC5nZXRWZXJzaW9uKCk7IC8vIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24ncyB2ZXJzaW9uIGF0dHJpYnV0ZQotCQkJCXByanAubG9hZCgpOyAvLyBpbml0aWFsaXplIHRoaXMgaW5zdGFuY2UgZnJvbSB0aGUgc3RvcmVkIHZhbHVlcwotCQkJCXByanAucGFzc2l2YXRlKCk7IC8vIHN0b3JlIHRoaXMgaW5zdGFuY2UgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgSVJlc291cmNlCi0JCQl9Ci0JCQlyZXR1cm4gcHJqcDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JfQotCi0JcHVibGljIFByb2plY3RDb25maWd1cmF0aW9uIGdldFByb2plY3RDb25maWd1cmF0aW9uV2l0aG91dE1pZ3JhdGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByanAgPSAoUHJvamVjdENvbmZpZ3VyYXRpb24pIHByb2plY3QuZ2V0U2Vzc2lvblByb3BlcnR5KFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQlpZiAocHJqcCA9PSBudWxsIHx8ICFwcmpwLmdldFJlc291cmNlKCkuZXhpc3RzKCkpIHsKLQkJCQlwcmpwID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCXByanAuZ2V0VmVyc2lvbigpOyAvLyBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uJ3MgdmVyc2lvbiBhdHRyaWJ1dGUKLQkJCQlwcmpwLmxvYWQoKTsgLy8gaW5pdGlhbGl6ZSB0aGlzIGluc3RhbmNlIGZyb20gdGhlIHN0b3JlZCB2YWx1ZXMKLQkJCQlwcmpwLnBhc3NpdmF0ZSgpOyAvLyBzdG9yZSB0aGlzIGluc3RhbmNlIGFzIGEgcHJvcGVydHkgb24gdGhlIElSZXNvdXJjZQotCQkJfQotCQkJcmV0dXJuIHByanA7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIG5hdHVyZSBvZiB0aGUgcHJvamVjdCBoYXMgY2hhbmdlZDsgdXBkYXRlIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9qZWN0TmF0dXJlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmVzZXRQcm9qZWN0TmF0dXJlKGdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGEgcHJvamVjdCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZmlyc3QgdGltZSwgaXRzIG5hdHVyZXMgbWF5IG5vdCBoYXZlIGJlZW4gY29tcGxldGUgYXQKLQkgKiB0aGUgdGltZSB0aGF0IHRoaXMgUHJlZmVyZW5jZSB3YXMgcmVjcmVhdGVkLiBDYWxsIHRoaXMgbWV0aG9kIHRvIHJlY2FsY3VsYXRlIHRoZSB2bWRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0UHJvamVjdE5hdHVyZShQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXByanAucmVzZXRQcm9qZWN0TmF0dXJlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2luZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNNaWdyYXRlZChwcm9qZWN0KSkgewotCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJaWYoIXByanAudXNlR2xvYmFsUHJlZmVyZW5jZSgpKQotCQkJCQlwcmpwLnN0b3JlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIkludGVybmFsUHJlZmVyZW5jZU1hbmFnZXI6OmNsb3NpbmcoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRpbmcoSVByb2plY3QgcHJvamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5pbmcoSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBEbyBub3QgbG9hZCBvciBtaWdyYXRlIHRoZSBwcm9qZWN0IGluIHRoaXMgbWV0aG9kOyBsZXQgdGhlIGdldENvbmZpZ3VyYXRpb24oSVByb2plY3QpCi0JCS8vIG1ldGhvZCBkbyB0aGF0LiBEbyBub3QgbG9hZCB0aGUgcHJvamVjdCBiZWZvcmUgaXQncyBuZWNlc3NhcnkuCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlcyBhcmUgYXQgdGhlIGN1cnJlbnQgbGV2ZWwgb2YgbWV0YWRhdGEsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbE1pZ3JhdGVkKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uZ2V0Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IChHbG9iYWxDb25maWd1cmF0aW9uKSByb290LmdldFNlc3Npb25Qcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKGdwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ3AuaXNWZXJzaW9uQ3VycmVudCgpOwotCQkJfQotCi0JCQlTdHJpbmcgc2VyaWFsaXplZFByanAgPSByb290LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX1BSRUZFUkVOQ0UpOwotCQkJaWYgKHNlcmlhbGl6ZWRQcmpwICE9IG51bGwpIHsKLQkJCQlncCA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKHJvb3QpOwotCQkJCWdwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJcmV0dXJuIGdwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SRVRSSUVWRSwgbmV3IFN0cmluZ1tde3Jvb3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyB0aGUgY3VycmVudCBsZXZlbCBvZiBtZXRhZGF0YSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlncmF0ZWQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IChQcm9qZWN0Q29uZmlndXJhdGlvbikgcHJvamVjdC5nZXRTZXNzaW9uUHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCQlpZiAocHJqcCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwcmpwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHNlcmlhbGl6ZWRQcmpwID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9QUkVGRVJFTkNFKTsKLQkJCQlpZiAoc2VyaWFsaXplZFByanAgIT0gbnVsbCkgewotCQkJCQlwcmpwID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQlwcmpwLmdldFZlcnNpb24oKTsgLy8gaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbidzCi0JCQkJCS8vIHZlcnNpb24gYXR0cmlidXRlCi0JCQkJCXJldHVybiBwcmpwLmlzVmVyc2lvbkN1cnJlbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleGMsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUkVUUklFVkUsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX0pKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V2ZW50TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9FdmVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMTcyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0V2ZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlDb250ZXh0RGV0ZXJtaW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudE1hbmFnZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRXZlbnRNYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gX3NodXRkb3duID0gZmFsc2U7IC8vIGZhbHNlIG1lYW5zIHRoYXQgZWNsaXBzZSBpcyBub3Qgc2h1dHRpbmcgZG93biwgYW5kIHRydWUKLQkvLyBtZWFucyB0aGF0IGl0IGlzIHNodXR0aW5nIGRvd24uIFVzZWQgaW4gdHdvIG1ldGhvZHM6Ci0JLy8gc2h1dGRvd24oKSxhbmQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCXByaXZhdGUgSVJlc291cmNlRGVsdGFWaXNpdG9yIF9wb3N0QXV0b0J1aWxkVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0FjdGl2ZSA9IGZhbHNlOyAvLyBoYXMgdGhlIHJlZ2lzdHJ5IGJlZW4gcmVhZD8KLQotCXByaXZhdGUgRXZlbnRNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRXZlbnRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBFdmVudE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIVZhbGlkYXRpb25QbHVnaW4uaXNBY3RpdmF0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gV2hlbiB0aGUgcHJvamVjdCBpcyBvcGVuZWQsIGNoZWNrIGZvciBhbnkgb3JwaGFuZWQgdGFza3MKLQkJLy8gb3IgdGFza3Mgd2hvc2Ugb3duZXJzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLm9wZW5pbmcocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2luZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIVZhbGlkYXRpb25QbHVnaW4uaXNBY3RpdmF0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaXNNaWdyYXRlZCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5pc01pZ3JhdGVkKHByb2plY3QpOwotCQkJLy8gSWYgaXQncyBub3QgbWlncmF0ZWQsIHRoZW4gaXQgaGFzbid0IGJlZW4gbG9hZGVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBsb2FkIHRoZQotCQkJLy8gdmFsaWRhdG9yIGFuZCBpdHMgcHJlcmVxdWlzaXRlIHBsdWdpbnMgdW50aWwgdGhleSdyZSBuZWVkZWQuCi0JCQlpZiAoaXNNaWdyYXRlZCkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5nZXRWYWxpZGF0b3JzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0KLQkJCQkJaWYgKCF2bWQuaXNBY3RpdmUoKSkgewotCQkJCQkJLy8gSWYgdGhpcyB2YWxpZGF0b3IgaGFzIG5vdCBiZWVuIGFjdGl2YXRlZCwgb3IgaWYgaXQgaGFzIGJlZW4gc2h1dCBkb3duLAotCQkJCQkJLy8gZG9uJ3QgYWN0aXZhdGUgaXQgYWdhaW4uCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQloZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJaGVscGVyLmNsb3NpbmcoKTsKLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0KLQkJCQkJCS8vIExvZyB0aGUgcmVhc29uIGZvciB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yCi0JCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFdmVudE1hbmFnZXI6OmNsb3NpbmcoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgaGVscGVyLCBsb2cgdGhlIGVycm9yIGFuZAotCQkJCQkJLy8gY29udGludWUKLQkJCQkJCS8vIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRXZlbnRNYW5hZ2VyOjpjbG9zaW5nKElQcm9qZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuY2xvc2luZyhwcm9qZWN0KTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiRXZlbnRNYW5hZ2VyOjpjbG9zaW5nKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlib29sZWFuIGlzTWlncmF0ZWQgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNNaWdyYXRlZChwcm9qZWN0KTsKLQkJCS8vIElmIGl0J3Mgbm90IG1pZ3JhdGVkLCB0aGVuIGl0IGhhc24ndCBiZWVuIGxvYWRlZCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gbG9hZCB0aGUKLQkJCS8vIHZhbGlkYXRvciBhbmQgaXRzIHByZXJlcXVpc2l0ZSBwbHVnaW5zIHVudGlsIHRoZXkncmUgbmVlZGVkLgotCQkJaWYgKGlzTWlncmF0ZWQpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCkuZ2V0VmFsaWRhdG9ycygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCi0JCQkJCWlmICghdm1kLmlzQWN0aXZlKCkpIHsKLQkJCQkJCS8vIElmIHRoaXMgdmFsaWRhdG9yIGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQsIG9yIGlmIGl0IGhhcyBiZWVuIHNodXQgZG93biwKLQkJCQkJCS8vIGRvbid0IGFjdGl2YXRlIGl0IGFnYWluLgotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaGVscGVyID0gdm1kLmdldEhlbHBlcihwcm9qZWN0KTsKLQkJCQkJCWhlbHBlci5kZWxldGluZygpOwotCQkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQotCQkJCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkV2ZW50TWFuYWdlcjo6ZGVsZXRpbmcoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgaGVscGVyLCBsb2cgdGhlIGVycm9yIGFuZAotCQkJCQkJLy8gY29udGludWUKLQkJCQkJCS8vIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRXZlbnRNYW5hZ2VyOjpkZWxldGluZyhJUHJvamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmRlbGV0aW5nKHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJFdmVudE1hbmFnZXI6OmRlbGV0aW5nKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiBhIHByb2plY3QncyBkZXNjcmlwdGlvbiBjaGFuZ2VzLCBUaGUgcHJvamVjdCBtYXkgaGF2ZSBjaGFuZ2VkIGl0cyBuYXR1cmUuIFVwZGF0ZSB0aGUgY2FjaGUKLQkgKiB0byByZWZsZWN0IHRoZSBuZXcgbmF0dXJlcy4gVGhlIHByb2plY3QgY291bGQgYmUgb3BlbmluZy4gTWlncmF0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9zdEF1dG9DaGFuZ2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKF9wb3N0QXV0b0J1aWxkVmlzaXRvciA9PSBudWxsKSB7Ci0JCQlfcG9zdEF1dG9CdWlsZFZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHN1YmRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gc3ViZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJaWYgKChzdWJkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pID09IElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLy8gZmx1c2ggZXhpc3RpbmcgImVuYWJsZWQgdmFsaWRhdG9yIiBzZXR0aW5ncyBhbmQgcmVzZXQgdG8gZGVmYXVsdAotCQkJCQkJCQlDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkucmVzZXRQcm9qZWN0TmF0dXJlKHByb2plY3QpOyAvLyAKLQkJCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIkV2ZW50TWFuYWdlcjo6cG9zdEF1dG9DaGFuZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQkJCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgoc3ViZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pID09IElSZXNvdXJjZURlbHRhLk9QRU4pIHsKLQkJCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJCQkvLyBQcm9qZWN0IHdhcyBqdXN0IG9wZW5lZC4gSWYgcHJvamVjdC5pc09wZW4oKSBoYWQgcmV0dXJuZWQgZmFsc2UsCi0JCQkJCQkJCS8vIHByb2plY3QKLQkJCQkJCQkJLy8gd291bGQganVzdCBoYXZlIGJlZW4gY2xvc2VkLgotCQkJCQkJCQlvcGVuaW5nKHByb2plY3QpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBjbG9zaW5nIGlzIGNhbGxlZCBieSBQUkVfQ0xPU0UgaW4gcmVzb3VyY2VDaGFuZ2VkCi0JCQkJCQkJLy8JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8JCQkJCQkJCWNsb3NpbmcocHJvamVjdCk7Ci0JCQkJCQkJLy8JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlkZWx0YS5hY2NlcHQoX3Bvc3RBdXRvQnVpbGRWaXNpdG9yLCB0cnVlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHNvbWUgcmVzb3VyY2UgY2hhbmdlcyBoYXZlIGhhcHBlbmVkIG9uIHRoZSBwbGF0Zm9ybS4gSWYgdGhlIGNoYW5nZQotCSAqIGlzIGEgcHJvamVjdCBkZWxldGlvbiwgdGhhdCBwcm9qZWN0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgotCSAqIAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEKLQkgKiBAc2VlIElSZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoX3NodXRkb3duICYmICghaXNBY3RpdmUoKSkpIHsKLQkJCS8vIElmIHdlJ3JlIHNodXR0aW5nIGRvd24sIGFuZCBub3RoaW5nIGhhcyBiZWVuIGFjdGl2YXRlZCwgZG9uJ3QgbmVlZCB0bwotCQkJLy8gZG8gYW55dGhpbmcuCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOyBidWZmZXIuYXBwZW5kKCJJUmVzb3VyY2VDaGFuZ2VFdmVudCB0eXBlID0gIik7Ci0JCSAqIGJ1ZmZlci5hcHBlbmQoZXZlbnQuZ2V0VHlwZSgpKTsgYnVmZmVyLmFwcGVuZCgiLCByZXNvdXJjZSA9ICIpOwotCQkgKiBidWZmZXIuYXBwZW5kKGV2ZW50LmdldFJlc291cmNlKCkpOyBidWZmZXIuYXBwZW5kKCIsIHNvdXJjZSA9ICIpOwotCQkgKiBidWZmZXIuYXBwZW5kKGV2ZW50LmdldFNvdXJjZSgpKTsgYnVmZmVyLmFwcGVuZCgiLCBkZWx0YSA9ICIpOwotCQkgKiBidWZmZXIuYXBwZW5kKGV2ZW50LmdldERlbHRhKCkpOyBTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkgKi8KLQotCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSB7Ci0JCQlpZiAoKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKSAmJiAoZXZlbnQuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewotCQkJCWRlbGV0aW5nKChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9IGVsc2UgaWYgKChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFKSAmJiAoZXZlbnQuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewotCQkJCWNsb3NpbmcoKElQcm9qZWN0KSBldmVudC5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpIHsKLQkJCQlwb3N0QXV0b0NoYW5nZShldmVudC5nZXREZWx0YSgpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBtYW5hZ2VyIHRoYXQgdGhlIFZhbGlkYXRpb25QbHVnaW4gaXMgc2h1dHRpbmcgZG93bi4gKFVzdWFsbHkgaW1wbGllcyB0aGF0Ci0JICogZWl0aGVyIHRoZSBwbHVnaW4gY291bGQgbm90IGxvYWQsIG9yIHRoYXQgdGhlIHdvcmtiZW5jaCBpcyBzaHV0dGluZyBkb3duLikKLQkgKiAKLQkgKiBUaGUgbWFuYWdlciB3aWxsIHRoZW4gbm90aWZ5IGFsbCBhY3RpdmUgaGVscGVycyBvZiB0aGUgc2h1dGRvd24sIHNvIHRoYXQgdGhleSBtYXkgcGVyZm9ybSBhbnkKLQkgKiBsYXN0LW1pbnV0ZSB3cml0ZXMgdG8gZGlzaywgY2xlYW51cCwgZXRjLgotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQl0cnkgewotCQkJX3NodXRkb3duID0gdHJ1ZTsgLy8gcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KSBuZWVkcyB0byBrbm93IHdoZW4gYSBzaHV0ZG93bgotCQkJLy8gaGFzIHN0YXJ0ZWQuCi0KLQkJCS8qCi0JCQkgKiBpZiggIWlzSGVhZGxlc3MoKSAmJiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNHbG9iYWxNaWdyYXRlZCgpKSB7Ci0JCQkgKiBHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCSAqIGdwLnN0b3JlKCk7IC8vIEZpcnN0LCBzZWUgaWYgYW55IHZhbGlkYXRvcnMgYXJlIGxvYWRlZC4gSWYgbm9uZSBhcmUsIHRoZXJlIGlzIG5vdGhpbmcKLQkJCSAqIHRvIC8vIGNsZWFuIHVwLiBpZihncC5udW1iZXJPZlZhbGlkYXRvcnMoKSA9PSAwKSB7IHJldHVybjsgfSB9Ci0JCQkgKi8KLQotCQkJLy8gSWYgdGhlIHZhbGlkYXRvcnMgYXJlIGxvYWRlZCwgdGhlbiBmb3IgZXZlcnkgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLAotCQkJLy8gd2UgbXVzdCBzZWUgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBJZiBpdCBoYXMsIGV2ZXJ5IGVuYWJsZWQgSVdvcmtiZW5jaENvbnRleHQKLQkJCS8vIG11c3QgYmUgY2FsbGVkIHRvIGNsZWFuIHVwLiBJZiB0aGUgcHJvamVjdCBoYXNuJ3QgYmVlbiBsb2FkZWQsIHRoZW4gbm8KLQkJCS8vIElXb3JrYmVuY2hDb250ZXh0IGJ1aWx0IGFueXRoaW5nLCBhbmQgdGhlcmUncyBub3RoaW5nIHRvIGNsZWFuIHVwLgotCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gbnVsbDsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJLy8gSWYgdGhlIHByb2plY3QgaXNuJ3Qgb3BlbmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gY2xlYW4gdXAuCi0JCQkJCS8vIElmIHRoZSBwcm9qZWN0IHdhcyBvcGVuZWQsIGl0IHdvdWxkIGhhdmUgYmVlbiBtaWdyYXRlZCwgYW5kIHRoZXJlJ3Mgc29tZXRoaW5nCi0JCQkJCS8vIHRvIGNsZWFuIHVwLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlib29sZWFuIGlzTWlncmF0ZWQgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNNaWdyYXRlZChwcm9qZWN0KTsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWlncmF0ZWQsIHRoZW4gaXQgaGFzbid0IGJlZW4gbG9hZGVkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBsb2FkCi0JCQkJCS8vIHRoZQotCQkJCQkvLyB2YWxpZGF0b3IgYW5kIGl0cyBwcmVyZXF1aXNpdGUgcGx1Z2lucyB1bnRpbCB0aGV5J3JlIG5lZWRlZC4KLQkJCQkJaWYgKGlzTWlncmF0ZWQpIHsKLQkJCQkJCXByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJCQkvL05vIG5lZWQgdG8gc2F2ZSBwcm9qZWN0IGxldmVsIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgYXQgc2h1dGRvd24uYgotCQkJCQkJLy9pZighcHJqcC51c2VHbG9iYWxQcmVmZXJlbmNlKCkpCi0JCQkJCQkvLwlwcmpwLnN0b3JlKCk7Ci0KLQkJCQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kTGlzdCA9IHByanAuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCQkJCS8vIGlmIHZtZExpc3QgaXMgbnVsbCwgSVByb2plY3QgaGFzIG5ldmVyIGJlZW4gbG9hZGVkLCBzbyBub3RoaW5nIHRvIGNsZWFuCi0JCQkJCQkvLyB1cAotCQkJCQkJaWYgKHZtZExpc3QgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdm1kTGlzdC5sZW5ndGg7IGorKykgewotCQkJCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRMaXN0W2pdOwotCi0JCQkJCQkJCWlmICghdm1kLmlzQWN0aXZlKCkpIHsKLQkJCQkJCQkJCS8vIElmIHRoaXMgdmFsaWRhdG9yIGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQsIG9yIGlmIGl0IGhhcyBiZWVuCi0JCQkJCQkJCQkvLyBzaHV0IGRvd24sIGRvbid0IGFjdGl2YXRlIGl0IGFnYWluLgotCQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHByb2plY3QpOwotCQkJCQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaGVscGVyLnNodXRkb3duKCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJCQkJLy8gU2luY2Ugd2UncmUgc2h1dHRpbmcgZG93biwgaWdub3JlIHRoZSBleGNlcHRpb24uCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIkV2ZW50TWFuYWdlcjo6c2h1dGRvd24oIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJLy8gU2luY2Ugd2UncmUgc2h1dHRpbmcgZG93biwgaWdub3JlIHRoZSBleGNlcHRpb24uCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJLy8gSGF2ZSB0byB1c2UgdGhpcyBjb252b2x1dGVkIHRlY2huaXF1ZSBmb3IgdGhlIHNodXRkb3duIHByb2JsZW0uCi0JCS8vIGkuZS4sIHdoZW4gZWNsaXBzZSBpcyBzaHV0IGRvd24sIGlmIHZhbGlkYXRpb24gcGx1Z2luIGhhc24ndCBiZWVuIGxvYWRlZCwKLQkJLy8gdGhlIEV2ZW50TWFuYWdlciBpcyBhY3RpdmF0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgaXQKLQkJLy8gc2VuZHMgbWFueSBleGNlcHRpb25zIHRvIHRoZSAubG9nLiBBdCBmaXJzdCwgSSB3cm90ZSBhCi0JCS8vIHN0YXRpYyBtZXRob2Qgb24gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLCB3aGljaCByZXR1cm5lZCB0cnVlCi0JCS8vIGlmIHRoZSByZWdpc3RyeSBoYWQgYmVlbiByZWFkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBIb3dldmVyLAotCQkvLyB0aGF0IGRpZG4ndCBzb2x2ZSB0aGUgZXhjZXB0aW9uIHByb2JsZW0sIGJlY2F1c2UgZWNsaXBzZSdzCi0JCS8vIGNsYXNzIGxvYWRlciBmYWlsZWQgdG8gbG9hZCB0aGUgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGNsYXNzLgotCQkvLwotCQkvLyBUaGUgZml4IGlzIHRvIGtlZXAgYWxsIHNodXRkb3duIG1lY2hhbmlzbXMgaW4gdGhpcyBjbGFzcy4KLQkJLy8gVHJhY2sgZXZlcnl0aGluZyBpbiBoZXJlLgotCQlyZXR1cm4gX2lzQWN0aXZlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIG9uY2UgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuCi0JICogcmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmUoYm9vbGVhbiBiKSB7Ci0JCV9pc0FjdGl2ZSA9IGI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB3b3JrYmVuY2ggaXMgcnVubmluZyBpbiBVSSBvciBIZWFkbGVzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hlYWRsZXNzKCkgewotCQlib29sZWFuIHJldCA9IFVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSA9PSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQ7Ci0JCXJldHVybiByZXQ7Ci0JCS8vcmV0dXJuIFVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSA9PQotCQkvLyBVSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9GaWx0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ZpbHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNDA4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ZpbHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlclV0aWwgewotCXByaXZhdGUgc3RhdGljIFZNRERlbHRhVmlzaXRvciBfZGVsdGFWaXNpdG9yID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBWTURSZXNvdXJjZVZpc2l0b3IgX3Jlc291cmNlVmlzaXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTURSZWNvcmRlciB7Ci0JCXB1YmxpYyBNYXAgZ2V0UmVzdWx0KCk7Ci0KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoU2V0IGVuYWJsZWRWYWxpZGF0b3JzKTsKLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBWTUREZWx0YVZpc2l0b3IgZXh0ZW5kcyBWTURSZWNvcmRlciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy9jb25zdHJ1Y3RvcgotCX0KLQotCXByaXZhdGUgaW50ZXJmYWNlIFZNRFJlc291cmNlVmlzaXRvciBleHRlbmRzIFZNRFJlY29yZGVyLCBJUmVzb3VyY2VWaXNpdG9yIHsKLQkJLy9jb25zdHJ1Y3RvcgotCX0KLQotCS8qKgotCSAqIERvbid0IGxldCBhbnlvbmUgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBGaWx0ZXJVdGlsKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIFNldCBvZiBlbmFibGVkIFZhbGlkYXRvck1ldGFEYXRhLCBjcmVhdGUgYSBNYXAgd2l0aCBlYWNoIFZhbGlkYXRvck1ldGFEYXRhIGFzIGEga2V5Ci0JICogd2l0aCBhbiBhc3NvY2lhdGVkIG51bGwgdmFsdWUuCi0JICovCi0Jc3RhdGljIE1hcCB3cmFwSW5NYXAoU2V0IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzID09IG51bGwpIHx8IChlbmFibGVkVmFsaWRhdG9ycy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVuYWJsZWRWYWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJlc3VsdC5wdXQoaXRlcmF0b3IubmV4dCgpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgTWFwIG9mIFZNRCA8PT5TZXQoSUZpbGVEZWx0YSksIGVpdGhlciByZXR1cm4gdGhlIGV4aXN0aW5nIFNldCBvciBjcmVhdGUgYSBTZXQgYW5kCi0JICogcmV0dXJuIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBnZXRSZXNvdXJjZURlbHRhcyhNYXAgZW5hYmxlZFZhbGlkYXRvcnMsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTZXQgZmlsZURlbHRhcyA9IChTZXQpIGVuYWJsZWRWYWxpZGF0b3JzLmdldCh2bWQpOwotCQlpZiAoZmlsZURlbHRhcyA9PSBudWxsKSB7Ci0JCQlmaWxlRGVsdGFzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWVuYWJsZWRWYWxpZGF0b3JzLnB1dCh2bWQsIGZpbGVEZWx0YXMpOwotCQl9Ci0JCXJldHVybiBmaWxlRGVsdGFzOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBJRmlsZURlbHRhIHR5cGUsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBJUmVzb3VyY2VEZWx0YSB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRSZXNvdXJjZURlbHRhVHlwZShpbnQgaWZpbGVEZWx0YVR5cGUpIHsKLQkJc3dpdGNoIChpZmlsZURlbHRhVHlwZSkgewotCQkJY2FzZSAoSUZpbGVEZWx0YS5BRERFRCkgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkRFTEVURUQpIDogewotCQkJCXJldHVybiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwotCQkJfQotCi0JCQljYXNlIChJRmlsZURlbHRhLkNIQU5HRUQpIDoKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJcmV0dXJuIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgSVJlc291cmNlRGVsdGEgdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIElGaWxlRGVsdGEgdHlwZS4KLQkgKi8KLQlzdGF0aWMgaW50IGdldEZpbGVEZWx0YVR5cGUoaW50IGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQlzd2l0Y2ggKGlyZXNvdXJjZURlbHRhVHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5BRERFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogLy8gcmVzb3VyY2VzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCXJldHVybiBJRmlsZURlbHRhLkNIQU5HRUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDogLy8gaW5jb21pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuQURERUQ7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDogLy8gb3V0Z29pbmcgd29ya2JlbmNoIHJlc291cmNlCi0JCQl7Ci0JCQkJcmV0dXJuIElGaWxlRGVsdGEuREVMRVRFRDsKLQkJCX0KLQotCQkJZGVmYXVsdCA6IHsKLQkJCQlyZXR1cm4gSUZpbGVEZWx0YS5DSEFOR0VEOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwgKGFzIHN0b3JlZCBpbgotCSAqIGdldFByb2plY3QoKSksIGFuZCBlbmFibGVkIGJ5IHRoZSB1c2VyIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlzdGF0aWMgdm9pZCBhZGRGaWxlRGVsdGEoTWFwIGVuYWJsZWRWYWxpZGF0b3JzLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFdvcmtiZW5jaEZpbGVEZWx0YSBmaWxlRGVsdGEpIHsKLQkJU2V0IGZpbGVEZWx0YXMgPSBnZXRSZXNvdXJjZURlbHRhcyhlbmFibGVkVmFsaWRhdG9ycywgdm1kKTsKLQkJZmlsZURlbHRhcy5hZGQoZmlsZURlbHRhKTsKLQkJZW5hYmxlZFZhbGlkYXRvcnMucHV0KHZtZCwgZmlsZURlbHRhcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTWFwIHdyYXBwZXIsIHdpdGggZWFjaCBWTUQgZnJvbSBlbmFibGVkVmFsaWRhdG9ycyBhcyB0aGUga2V5LCBhbmQgdGhlIHZhbHVlIGEgU2V0IG9mCi0JICogSUZpbGVEZWx0YSB3cmFwcGVyIGFyb3VuZCB0aGUgY2hhbmdlZCBPYmplY3RbXS4KLQkgKiAKLQkgKiBJZiBmaWx0ZXJJbiBpcyB0cnVlLCBkbyBub3QgY2hlY2sgaWYgdGhlIHJlc291cmNlcyBhcmUgZmlsdGVyZWQgaW4gYnkgdGhlIHZhbGlkYXRvci4gSWYKLQkgKiBmaWx0ZXJJbiBpcyBmYWxzZSwgY2hlY2sgaWYgdGhlIHJlc291cmNlcyBhcmUgZmlsdGVyZWQgaW4gYnkgdGhlIHZhbGlkYXRvciAocmVjb21tZW5kZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEZpbGVEZWx0YXMoU2V0IGVuYWJsZWRWYWxpZGF0b3JzLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGZpbHRlckluKSB7Ci0JCS8vIGJ5IGRlZmF1bHQgYXNzdW1lIHRoYXQgdGhlIHJlc291cmNlcyBoYXZlIGNoYW5nZWQsIGkuZS4gbm90IGFkZGVkIG9yIGRlbGV0ZWQKLQkJcmV0dXJuIGdldEZpbGVEZWx0YXMoZW5hYmxlZFZhbGlkYXRvcnMsIGNoYW5nZWRSZXNvdXJjZXMsIElGaWxlRGVsdGEuQ0hBTkdFRCwgZmlsdGVySW4pOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLCB3aXRoIGVhY2ggZGVsdGEgb2YgdHlwZSBkZWx0YVR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RmlsZURlbHRhcyhTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMsIGludCBpZmlsZURlbHRhVHlwZSkgewotCQkvLyBieSBkZWZhdWx0IGNoZWNrIGlmIHRoZSBPYmplY3RzIGFyZSBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdG9yCi0JCXJldHVybiBnZXRGaWxlRGVsdGFzKGVuYWJsZWRWYWxpZGF0b3JzLCBjaGFuZ2VkUmVzb3VyY2VzLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UpOyAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgd3JhcHBlciwgd2l0aCBlYWNoIFZNRCBmcm9tIGVuYWJsZWRWYWxpZGF0b3JzIGFzIHRoZSBrZXksIGFuZCB0aGUgdmFsdWUgYSBTZXQgb2YKLQkgKiBJRmlsZURlbHRhIHdyYXBwZXIgYXJvdW5kIHRoZSBjaGFuZ2VkIE9iamVjdFtdLgotCSAqIAotCSAqIElmICJmb3JjZSIgaXMgdHJ1ZSwgdGhlbiBkb24ndCBjaGVjayBpZiB0aGUgb2JqZWN0IGlzIGZpbHRlcmVkIGluIGJ5IHRoZSB2YWxpZGF0b3Igb3Igbm90LgotCSAqIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBjYW4gdXNlIHZhbGlkYXRvcnMgdGhhdCBkb24ndCBmaWx0ZXIgaW4gdGhlc2UgcGFydGljdWxhciByZXNvdXJjZXMsCi0JICogYnV0IGNhbiB1c2UgYSBkZWZhdWx0RXh0ZW5zaW9uJ3MgdmFsaWRhdG9ycyBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEZpbGVEZWx0YXMoU2V0IGVuYWJsZWRWYWxpZGF0b3JzLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBpbnQgaWZpbGVEZWx0YVR5cGUsIGJvb2xlYW4gZm9yY2UpIHsKLQkJTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWxpZGF0b3JzLnNpemUoKSA9PSAwKSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW5hYmxlZFZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBjYW5ub3RMb2FkID0gZmFsc2U7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlTZXQgZGVsdGFzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gY2hhbmdlZFJlc291cmNlc1tpXTsKLQkJCQkJV29ya2JlbmNoRmlsZURlbHRhIHdmZCA9IG51bGw7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQkJCQlpZiAoZm9yY2UgfHwgIWZpbHRlck91dChtb25pdG9yLCB2bWQsIHJlcywgZ2V0UmVzb3VyY2VEZWx0YVR5cGUoaWZpbGVEZWx0YVR5cGUpKSkgewotCQkJCQkJCWhlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzLmdldFByb2plY3QoKSk7Ci0KLQkJCQkJCQl3ZmQgPSBnZXRGaWxlRGVsdGEoaGVscGVyLCB2bWQsIHJlcywgZ2V0UmVzb3VyY2VEZWx0YVR5cGUoaWZpbGVEZWx0YVR5cGUpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXdmZCA9IG5ldyBXb3JrYmVuY2hGaWxlRGVsdGEob2JqKTsKLQkJCQkJfQotCi0JCQkJCWlmICh3ZmQgIT0gbnVsbCkgewotCQkJCQkJZGVsdGFzLmFkZCh3ZmQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdC5wdXQodm1kLCBkZWx0YXMpOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQljYW5ub3RMb2FkID0gdHJ1ZTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJGaWx0ZXJVdGlsOjpnZXRGaWxlRGVsdGFzKFNldCwgT2JqZWN0W10sIGludCwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQl9Ci0KLQkJaWYgKGNhbm5vdExvYWQpIHsKLQkJCS8vIFNvbWUgb2YgdGhlIHZhbGlkYXRvcnMgc2hvdWxkIG5vdCBiZSBpbiB0aGUgcmVzdWx0IHNldCBiZWNhdXNlIGVpdGhlciB0aGVpcgotCQkJLy8gdmFsaWRhdG9yIGNsYXNzIG9yIGhlbHBlciBjbGFzcyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkLgotCQkJT2JqZWN0W10gdm1kcyA9IGVuYWJsZWRWYWxpZGF0b3JzLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgdm1kc1tpXTsKLQkJCQlpZiAodm1kLmNhbm5vdExvYWQoKSkgewotCQkJCQlyZXN1bHQucmVtb3ZlKHZtZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya2JlbmNoRmlsZURlbHRhIGdldEZpbGVEZWx0YShJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVJlc291cmNlIHJlc291cmNlLCBpbnQgaXJlc291cmNlRGVsdGFUeXBlKSB7Ci0JCS8vIHN0cmlwIG9mZiB0aGUgZWNsaXBzZS1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBoZWxwZXIuZ2V0UG9ydGFibGVOYW1lKHJlc291cmNlKTsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwpIHsKLQkJCS8vIFRoZSByZXNvdXJjZSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCi0JCQkvLyBDYW4ndCBzZWUgaG93IHRoaXMgd291bGQgaGFwcGVuLCBidXQgY2hlY2sgZm9yIGl0IGFueXdheS4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIkZpbHRlclV0aWw6OmdldEZpbGVEZWx0YShJV29ya2JlbmNoQ29udGV4dCwgVmFsaWRhdG9yTWV0YURhdGEsIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0TWVzc2FnZVR5cGVJRChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1NZTlRBWF9OVUxMX05BTUUpOwotCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1NZTlRBWF9OVUxMX05BTUUpLCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCWVudHJ5LnNldFRleHQocmVzdWx0KTsKLQkJCQkvL2VudHJ5LnNldFRva2VucyhuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCkgewotCQkJCS8vIFNpbmNlIG51bGwgZmlsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQsIGRlZmF1bHQgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotCQkJCS8vIHJlc291cmNlLgotCQkJCWZpbGVOYW1lID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkZpbHRlclV0aWw6OmdldEZpbGVEZWx0YShJV29ya2JlbmNoQ29udGV4dCwgVmFsaWR0YW9yTWV0YURhdGEsIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRleHQoInBvcnRhYmxlTmFtZSBpcyBudWxsIGFuZCBwYXRoIGlzIG51bGwgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWludCBpZmlsZURlbHRhVHlwZSA9IGdldEZpbGVEZWx0YVR5cGUoaXJlc291cmNlRGVsdGFUeXBlKTsKLQkJcmV0dXJuIG5ldyBXb3JrYmVuY2hGaWxlRGVsdGEoZmlsZU5hbWUsIGlmaWxlRGVsdGFUeXBlLCByZXNvdXJjZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGQgdGhlIElSZXNvdXJjZSB0byB0aGUgdm1kJ3MgbGlzdCBvZiByZXNvdXJjZXMgdG8gdmFsaWRhdGUuIFJldHVybiB0cnVlIGlmIHRoZSBhZGQgd2FzCi0JICogc3VjY2Vzc2Z1bCBvciBmYWxzZSBpZiB0aGUgYWRkIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGRUb0ZpbGVMaXN0KE1hcCBlbmFibGVkVmFsaWRhdG9ycywgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlc291cmNlRGVsdGEsIGJvb2xlYW4gaXNGdWxsQnVpbGQpIHsKLQkJaWYgKCh2bWQgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaGVscGVyLnJlZ2lzdGVyUmVzb3VyY2UocmVzb3VyY2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBIb3cgdG8gbG9nIHRoaXM/Pz8/Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJGaWx0ZXJVdGlsLmFkZFRvRmlsZUxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQotCQkJSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5hZGRJbnRlcm5hbEVycm9yVGFzayhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZtZCwgZXhjKTsKLQotCQkJLy8gRG9uJ3QgcmV0dXJuIC4uLiBldmVuIHRob3VnaCB0aGUgcmVnaXN0ZXIgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGF0J3Mgbm90IHRvIHNheQotCQkJLy8gdGhhdCB0aGUgdmFsaWRhdG9yIGNhbid0IHZhbGlkYXRlLgotCQl9Ci0KLQkJaWYgKGlzRnVsbEJ1aWxkKSB7Ci0JCQkvLyBUbyBpbmRpY2F0ZSBhIGZ1bGwgYnVpbGQgdG8gdGhlIHZhbGlkYXRvciwgZG9uJ3QgYnVpbGQgdXAgYSBsaXN0IG9mIGZpbGVzOwotCQkJLy8gcGFzcyBpbiBudWxsIGluc3RlYWQuIEdpdmVuIHRoYXQgdGhlIGxpc3Qgb2YgZmlsZXMgc2hvdWxkIG5vdCBiZSB1c2VkLAotCQkJLy8gZG9uJ3QgY2FsY3VsYXRlIGl0LgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBnZXRGaWxlRGVsdGEoaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhKTsKLQkJaWYgKG5ld0ZpbGVEZWx0YSAhPSBudWxsKSB7Ci0JCQkvLyBpZiBkZWx0YSBpcyBudWxsLCBnZXRGaWxlRGVsdGEgd2lsbCBoYXZlIGxvZ2dlZCB0aGUgcHJvYmxlbSBhbHJlYWR5Ci0JCQlhZGRGaWxlRGVsdGEoZW5hYmxlZFZhbGlkYXRvcnMsIHZtZCwgbmV3RmlsZURlbHRhKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0JCXJldHVybiAhKHZtZC5pc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgcmVzb3VyY2VEZWx0YSkpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgYSBmdWxsIHZlcmlmaWNhdGlvbiBvciBhIGRlbHRhIHZlcmlmaWNhdGlvbiBpcyBpbiBwcm9ncmVzcywgYm90aCB3aWxsIGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZXNvdXJjZS4gVGhpcyBtZXRob2QgY2FsbHMgdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIGZpbHRlciB0aGUKLQkgKiByZXNvdXJjZSAoaS5lLiwgdGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgcmVzb3VyY2UgZmFpbHMgdGhlIGZpbHRlciB0ZXN0KS4KLQkgKiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBhbHNvIHNlbmRzIG91dHB1dCB0byB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4sIGFuZCBjYWxscwotCSAqIHRoZSBjdXJyZW50IFZhbGlkYXRvciB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UuCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIHZvaWQgZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGVuYWJsZWRWYWxpZGF0b3JzLCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhLCBib29sZWFuIGlzRnVsbEJ1aWxkKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoZWNrQ2FuY2VsZWQobW9uaXRvcik7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmFibGVkVmFsaWRhdG9ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlib29sZWFuIGNhbm5vdExvYWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJY2hlY2tDYW5jZWxlZChtb25pdG9yKTsKLQotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmICghZmlsdGVyT3V0KG1vbml0b3IsIHZtZCwgcmVzb3VyY2UsIHJlc291cmNlRGVsdGEpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gTm90aWZ5IHRoZSBoZWxwZXIgdGhhdCBhIHJlc291cmNlIGlzIGFib3V0IHRvIGJlIGZpbHRlcmVkIGluCi0JCQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQkJYWRkVG9GaWxlTGlzdChlbmFibGVkVmFsaWRhdG9ycywgaGVscGVyLCB2bWQsIHJlc291cmNlLCByZXNvdXJjZURlbHRhLCBpc0Z1bGxCdWlsZCk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJY2Fubm90TG9hZCA9IHRydWU7Ci0KLQkJCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkJCS8vIExvZyB0aGUgcmVhc29uIGZvciB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yCi0JCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkZpbHRlclV0aWw6OmZpbHRlck91dChJUHJvZ3Jlc3NNb25pdG9yLCBNYXAsIElSZXNvdXJjZSwgaW50LCBib29sZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjYW5ub3RMb2FkKSB7Ci0JCQkvLyBTb21lIG9mIHRoZSB2YWxpZGF0b3JzIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXQgYmVjYXVzZSB0aGUgdmFsaWRhdG9yCi0JCQkvLyBvciBoZWxwZXIgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLQkJCU9iamVjdFtdIHZtZHMgPSBlbmFibGVkVmFsaWRhdG9ycy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIHZtZHNbaV07Ci0JCQkJaWYgKHZtZC5jYW5ub3RMb2FkKCkpIHsKLQkJCQkJZW5hYmxlZFZhbGlkYXRvcnMucmVtb3ZlKHZtZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciBhIGZ1bGwgdmVyaWZpY2F0aW9uIG9yIGEgZGVsdGEgdmVyaWZpY2F0aW9uIGlzIGluIHByb2dyZXNzLCBib3RoIHdpbGwgY2FsbCB0aGlzCi0JICogbWV0aG9kIHRvIHByb2Nlc3MgdGhlIHJlc291cmNlLiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gZmlsdGVyIHRoZQotCSAqIHJlc291cmNlIChpLmUuLCB0aGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSByZXNvdXJjZSBmYWlscyB0aGUgZmlsdGVyIHRlc3QpLgotCSAqIDxjb2RlPnByb2Nlc3M8L2NvZGU+IGFsc28gc2VuZHMgb3V0cHV0IHRvIHRoZSA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPiwgYW5kIGNhbGxzCi0JICogdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGFuIGluY3JlbWVudGFsLCBub3QgYSBmdWxsLCB2YWxpZGF0aW9uLiBUaGUgZnVsbCB2YWxpZGF0aW9uCi0JICogZmFrZXMgYW4gSVJlc291cmNlRGVsdGEsIGFuZCB0aGUgaW5jcmVtZW50YWwgbmVlZHMgdG8gY2hlY2sgdGhhdCB0aGUgZGVsdGEgaXMgb25lIG9mIHRoZQotCSAqIGRlbHRhcyB3aGljaCBpcyBmaWx0ZXJlZCBpbiBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICogCi0JICogQHNlZSBmaWx0ZXJPdXQoSVJlc291cmNlRGVsdGEpCi0JICogCi0JICogVG8gcHJvY2VzcyBhIHJlc291cmNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdGVwczogMS4gY2hlY2sgaWYgdGhlIHJlc291cmNlIGlzIHJlZ2lzdGVyZWQgZm9yCi0JICogdGhpcyB2YWxpZGF0b3IgKGkuZS4sIHRoZSB2YWxpZGF0b3IgaGFzIGVpdGhlciBzcGVjaWZpZWQgaXQgaW4gYSBmaWx0ZXIsIG9yIGhhcyBub3QgZmlsdGVyZWQKLQkgKiBpdCBvdXQgZXhwbGljaXRseSkgMi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCi0JICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgotCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQotCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCi0JICovCi0Jc3RhdGljIHZvaWQgZmlsdGVyT3V0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGVuYWJsZWRWYWxpZGF0b3JzLCBJUmVzb3VyY2UgcmVzb3VyY2UsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCS8vIGZpbHRlciBpbiBvbmx5IHJlc291cmNlcyB3aGljaCBoYXZlIGJlZW4gYWRkZWQsIGRlbGV0ZWQsIG9yIGl0cyBjb250ZW50IGNoYW5nZWQuCi0JCS8vIG1vdmVzIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBhbiBhZGQgJiBkZWxldGUgY29tYmluYXRpb24KLQkJaWYgKGZpbHRlck91dChkZWx0YSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmaWx0ZXJPdXQobW9uaXRvciwgZW5hYmxlZFZhbGlkYXRvcnMsIHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCksIGZhbHNlKTsgLy8gZmFsc2UgPQotCQkvLyBpbmNyZW1lbnRhbAotCQkvLyBidWlsZAotCX0KLQotCS8qKgotCSAqIEZpbHRlciBvdXQgcmVzb3VyY2UgZGVsdGFzIHdoaWNoIGRvbid0IGNvcnJlc3BvbmQgdG8gY2hhbmdlcyB0aGF0IHZhbGlkYXRvcnMgY2FuIHZhbGlkYXRlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmlsdGVyIGluIGRlbHRhcyBvbmx5IGlmIHRoZSBkZWx0YSBpcyBhbiBhZGQsIGEgZGVsZXRlLCBvciBpZiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlIGhhcyBjaGFuZ2VkLgotCSAqIAotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBkZWx0YSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LCBhbmQgZmFsc2UgaWYgd2Ugc2hvdWxkIHZhbGlkYXRlIGl0LgotCSAqIAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBmaWx0ZXJPdXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOiAvLyByZXNvdXJjZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgd29ya2JlbmNoCi0JCQl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOiAvLyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIHdvcmtiZW5jaAotCQkJewotCQkJCS8vIElmIHRoZSBkZWx0YSBpcyBhbiBJUHJvamVjdCwgYW5kIHRoZSBJUHJvamVjdCBpcyBnZXR0aW5nIGRlbGV0ZWQgb3IgY2xvc2VkLCBkb24ndAotCQkJCS8vIHZhbGlkYXRlIGl0IG9yIGl0cyBjaGlsZHJlbi4KLQkJCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IC8vIHJlc291cmNlcyBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2gKLQkJCXsKLQkJCQkvLyBXZSB3YW50IHRvIGFkZCB0aGUgZW50ZXJwcmlzZSBiZWFuIG9ubHkgaWYgaXRzIHNvdXJjZSBmaWxlJ3MKLQkJCQkvLyBjb250ZW50cyBoYXZlIGNoYW5nZWQuIChmb3IgZXhhbXBsZSwgaWYgYSBmb2xkZXIgaGFzIGJlZW4KLQkJCQkvLyBhZGRlZCB0byB0aGUgcHJvamVjdCwgdGhlIElGaWxlIHdpbGwgYmUgY2hhbmdlZCBiZWNhdXNlCi0JCQkJLy8gaXRzIHBvc2l0aW9uIGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JCQkJLy8gZG9lc24ndCBuZWVkIHRvIGJlIHJlZGVwbG95ZWQuIFNlZSBJUmVzb3VyY2VEZWx0YS5nZXRGbGFncygpCi0JCQkJLy8gZm9yIG1vcmUgaW5mb3JtYXRpb24uKQotCQkJCS8vCi0JCQkJLy8gT3IsIGlmIGVqYi1qYXIueG1sIGhhcyBjaGFuZ2VkLCB0aGUgRUpCSmFyIGlzIGRlc3Ryb3llZCAmIGNyZWF0ZWQKLQkJCQkvLyBmcm9tIHNjcmF0Y2gsIHNvIHRoZSBsaXN0IG9mIEVudGVycHJpc2VCZWFuIGlzIG5ldy4gUHVyZ2UgdGhlIG9sZAotCQkJCS8vIEVKQkphciBmcm9tIHRoZSBFSkJDYWNoZSAoc2luY2UgaXQgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGFnYWluKSwKLQkJCQkvLyBhbmQgbG9hZCB0aGUgbmV3IEVKQkphciBpbnRvIHRoZSBjYWNoZS4KLQkJCQlpZiAoKGRlbHRhLmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4gc2hvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUKLQkgKiB2YWxpZGF0b3JzLiBUaGF0IGlzLCB0aGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiBjaGFuZ2VzIHdoaWNoIGNhbiBvY2N1ciB0byBhbiBJUHJvamVjdCB3aGljaAotCSAqIHNob3VsZCBub3QgdHJpZ2dlciBhIHJldmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCBvciBpdHMgY2hpbGRyZW4uIChlLmcuIHByb2plY3QgaXMgZGVsZXRlZCBvcgotCSAqIGNsb3NlZC4pIEZvciB0aG9zZSBjYXNlcywgb3IgaWYgdGhlIElSZXNvdXJjZURlbHRhIGlzIGludmFsaWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlCi0JICogKGRvIG5vdCB2YWxpZGF0ZSB0aGUgSVByb2plY3Qgb3IgaXRzIGNoaWxkcmVuKS4gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZSAodmFsaWRhdGUgdGhlIHJlc291cmNlICYKLQkgKiBpdHMgY2hpbGRyZW4pLiBJZiBhbiBJUHJvamVjdCBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLCBidXQgb25lIG9mIGl0cyBjaGlsZHJlbiBoYXMKLQkgKiAoZGVsdGEuZ2V0S2luZCgpIG9mIE5PX0NIQU5HRSksIHRoZW4gcmV0dXJuIHRydWUgc28gdGhhdCB0aGUgY2hpbGRyZW4gYXJlIHZhbGlkYXRlZC4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBzaG91bGRQcm9jZXNzKElSZXNvdXJjZSByZXNvdXJjZSwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaWYgKChyZXNvdXJjZSAhPSBudWxsKSAmJiAhKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChkZWx0YSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgd29ya2JlbmNoOyBtYXkgYmUgcGFydAotCQkJLy8gb2YgYSBtb3ZlCi0JCQl7Ci0JCQkJaWYgKDAgIT0gKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSkgewotCQkJCQkvLyBJZiBpdCdzIGJlaW5nIG1vdmVkLCBkb24ndCByZXZhbGlkYXRlIGl0cyBjaGlsZHJlbi4gSWYgaXQncyBiZWluZyBhZGRlZCwgZmFsbAotCQkJCQkvLyB0aHJvdWdoIHRvIHRoZSAicmV0dXJuIHRydWU7IiBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOiAvLyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIHdvcmtiZW5jaDsgbWF5IGJlCi0JCQkvLyBwYXJ0IG9mIGEgbW92ZQotCQkJewotCQkJCS8vIFdoZXRoZXIgaXQncyBiZWluZyBkZWxldGVkIG9yIG1vdmVkLCBkb24ndCByZXZhbGlkYXRlIGl0cyBjaGlsZHJlbi4KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IC8vIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIHdvcmtiZW5jaDsgbWF5IGJlIHBhcnQKLQkJCS8vIG9mIGEgbW92ZQotCQkJewotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApIHsKLQkJCQkJLy8gQ2hhbmdlIGlzIHJlbGF0ZWQgdG8gdGhlIE9QRU4gYml0LiBXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjbG9zZWQgYW5kIGlzIG5vdwotCQkJCQkvLyBvcGVuLAotCQkJCQkvLyBvciB0aGUgcHJvamVjdCB3YXMgb3BlbiBhbmQgaXMgbm93IGNsb3NlZCwgZG9uJ3QgbmVlZCB0byByZXZhbGlkYXRlIHRoZQotCQkJCQkvLyBjaGlsZHJlbi4KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJCQkvLyBwcm9qZWN0IHdhcyBtb3ZlZAotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBWTURSZXNvdXJjZVZpc2l0b3IgZ2V0UmVzb3VyY2VWaXNpdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU2V0IGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWlmIChfcmVzb3VyY2VWaXNpdG9yID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZVZpc2l0b3IgPSBuZXcgVk1EUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCXByaXZhdGUgTWFwIF92bWREZWx0YXMgPSBudWxsOwotCQkJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCQkJCXB1YmxpYyBNYXAgZ2V0UmVzdWx0KCkgewotCQkJCQlyZXR1cm4gX3ZtZERlbHRhczsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQgdmFsaWRhdG9ycykgewotCQkJCQlfdm1kRGVsdGFzID0gd3JhcEluTWFwKHZhbGlkYXRvcnMpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJCQkJcmV0dXJuIF9wcm9ncmVzc01vbml0b3I7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbSkgewotCQkJCQlfcHJvZ3Jlc3NNb25pdG9yID0gbTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCUZpbHRlclV0aWwuY2hlY2tDYW5jZWxlZChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0byBmaWx0ZXIgb3V0IGFueXRoaW5nLCBiZWNhdXNlIGEgZnVsbCB2YWxpZGF0aW9uCi0JCQkJCS8vIGlzIGFib3V0IHRvIGJlIHBlcmZvcm1lZC4KLQkJCQkJZmlsdGVyT3V0KGdldFByb2dyZXNzTW9uaXRvcigpLCBfdm1kRGVsdGFzLCByZXMsIElSZXNvdXJjZURlbHRhLkNIQU5HRUQsIHRydWUpOwotCi0JCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbiBhcyB3ZWxsCi0JCQkJfQotCQkJfTsKLQkJfQotCQlfcmVzb3VyY2VWaXNpdG9yLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJX3Jlc291cmNlVmlzaXRvci5zZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkVmFsaWRhdG9ycyk7Ci0KLQkJcmV0dXJuIF9yZXNvdXJjZVZpc2l0b3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVk1ERGVsdGFWaXNpdG9yIGdldERlbHRhVmlzaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFNldCBlbmFibGVkVmFsaWRhdG9ycykgewotCQlpZiAoX2RlbHRhVmlzaXRvciA9PSBudWxsKSB7Ci0JCQlfZGVsdGFWaXNpdG9yID0gbmV3IFZNRERlbHRhVmlzaXRvcigpIHsKLQkJCQlwcml2YXRlIE1hcCBfdm1kRGVsdGFzID0gbnVsbDsKLQkJCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgX3Byb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkJCQlwdWJsaWMgTWFwIGdldFJlc3VsdCgpIHsKLQkJCQkJcmV0dXJuIF92bWREZWx0YXM7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoU2V0IHZhbGlkYXRvcnMpIHsKLQkJCQkJX3ZtZERlbHRhcyA9IHdyYXBJbk1hcCh2YWxpZGF0b3JzKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQkJCXJldHVybiBfcHJvZ3Jlc3NNb25pdG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJCQkJX3Byb2dyZXNzTW9uaXRvciA9IG07Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgc3ViZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJY2hlY2tDYW5jZWxlZChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gc3ViZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigic3ViZGVsdGEgb2YgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiBpcyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChzdWJkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiIHJlc291cmNlIGV4aXN0cz8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQocmVzb3VyY2UuZXhpc3RzKCkpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiIHJlc291cmNlLmlzUGhhbnRvbT8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZChyZXNvdXJjZS5pc1BoYW50b20oKSk7Ci0KLQkJCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJGaWx0ZXJVdGlsOjp2aXNpdChJUmVzb3VyY2VEZWx0YSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVudHJ5LnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0KLQkJCQkJLy8gSWYgdGhlIGRlbHRhIGlzIGFuIElQcm9qZWN0LCBhbmQgdGhlIElQcm9qZWN0IGlzIGdldHRpbmcgZGVsZXRlZCBvciBjbG9zZWQsCi0JCQkJCS8vIGRvbid0IHZhbGlkYXRlIGl0IG9yIGl0cyBjaGlsZHJlbi4KLQkJCQkJaWYgKHNob3VsZFByb2Nlc3MocmVzb3VyY2UsIHN1YmRlbHRhKSkgewotCQkJCQkJZmlsdGVyT3V0KGdldFByb2dyZXNzTW9uaXRvcigpLCBfdm1kRGVsdGFzLCByZXNvdXJjZSwgc3ViZGVsdGEpOwotCQkJCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSBkZWx0YSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGRvIG5vdCB2aXNpdCB0aGUgZGVsdGEncyBjaGlsZHJlbgotCQkJCX0KLQkJCX07Ci0JCX0KLQkJX2RlbHRhVmlzaXRvci5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCV9kZWx0YVZpc2l0b3Iuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCi0JCXJldHVybiBfZGVsdGFWaXNpdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWFwIGxvYWREZWx0YXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVZNRERlbHRhVmlzaXRvciB2aXNpdG9yID0gZ2V0RGVsdGFWaXNpdG9yKG1vbml0b3IsIGVuYWJsZWRWYWxpZGF0b3JzKTsKLQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUgcGhhbnRvbSByZXNvdXJjZXMKLQkJcmV0dXJuIHZpc2l0b3IuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNYXAgbG9hZERlbHRhcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIFNldCBlbmFibGVkVmFsaWRhdG9ycywgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWTURSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IGdldFJlc291cmNlVmlzaXRvcihtb25pdG9yLCBlbmFibGVkVmFsaWRhdG9ycyk7Ci0JCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tCi0JCS8vIHJlc291cmNlcwotCQlyZXR1cm4gdmlzaXRvci5nZXRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0dsb2JhbENvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvR2xvYmFsQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTAzN2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvR2xvYmFsQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBnbG9iYWwgUHJlZmVyZW5jZXMgYXMgc2V0IG9uIHRoZSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxDb25maWd1cmF0aW9uIGV4dGVuZHMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gewotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFX0RFRkFVTFQgPSB0cnVlOwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZfU0FWRV9BVVRPTUFUSUNBTExZX0RFRkFVTFQgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBfY2FuUHJvamVjdHNPdmVycmlkZSA9IGdldENhblByb2plY3RzT3ZlcnJpZGVEZWZhdWx0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIF9zYXZlQXV0b21hdGljYWxseSA9IGdldFNhdmVBdXRvbWF0aWNhbGx5RGVmYXVsdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpbiBhbGwgY2FzZXMgZXhjZXB0IGZvciB0aGUgUHJlZmVyZW5jZSBwYWdlJ3MgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb25maWd1cmF0aW9uKElXb3Jrc3BhY2VSb290IHJvb3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIocm9vdCwgY29udmVydFRvQXJyYXkoVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldEFsbFZhbGlkYXRvcnMoKSkpOwotCi0JCS8vIENhbid0IHB1dCB0aGUgY2FsbCB0byBsb2FkKCkgYW5kIHBhc3NpdmF0ZSgpIGluIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3RvcgotCQkvLyBkdWUKLQkJLy8gdG8gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uLgotCQkvLyAgICAxLiBGaXJzdCB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IgaXMgY2FsbGVkLCBhbmQgdGhhdCBsb2FkcyB0aGUgc3RvcmVkCi0JCS8vIHZhbHVlcy4KLQkJLy8gICAgMi4gVGhlbiB0aGlzIGNsYXNzJ3MgPGluaXQ+IG1ldGhvZCBpcyBjYWxsZWQsIGFuZCB0aGF0IGluaXRpYWxpemVzIHRoZSAib3ZlcnJpZGUiIGZpZWxkCi0JCS8vIHRvIHRoZSBkZWZhdWx0LAotCQkvLyAgICAgICB3aGljaCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHN0b3JlZCB2YWx1ZS4KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBQcmVmZXJlbmNlIHBhZ2UsIHNvIHRoYXQgdGhlIHBhZ2UgY2FuIHN0b3JlIHZhbHVlcwotCSAqIHdpdGhvdXQgcGVyc2lzdGluZyB0aGVtIChpLmUuLCBpZiB0aGUgdXNlciBwcmVzc2VzIENhbmNlbCB0aGVuIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4pCi0JICovCi0JcHVibGljIEdsb2JhbENvbmZpZ3VyYXRpb24oR2xvYmFsQ29uZmlndXJhdGlvbiBvcmlnaW5hbCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQlvcmlnaW5hbC5jb3B5VG8odGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUHJvamVjdHNPdmVycmlkZSgpIHsKLQkJcmV0dXJuIF9jYW5Qcm9qZWN0c092ZXJyaWRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhblByb2plY3RzT3ZlcnJpZGUoYm9vbGVhbiBjYW4pIHsKLQkJX2NhblByb2plY3RzT3ZlcnJpZGUgPSBjYW47Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFNhdmVBdXRvbWF0aWNhbGx5KCkgewotCQlyZXR1cm4gX3NhdmVBdXRvbWF0aWNhbGx5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTYXZlQXV0b21hdGljYWxseShib29sZWFuIHNhdmUpIHsKLQkJX3NhdmVBdXRvbWF0aWNhbGx5ID0gc2F2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldFRvRGVmYXVsdCgpICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXNldERpc2FibGVBbGxWYWxpZGF0aW9uKGdldERpc2FibGVWYWxpZGF0aW9uRGVmYXVsdCgpKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnNEZWZhdWx0KCkpOwotCQlzZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQlzZXRDYW5Qcm9qZWN0c092ZXJyaWRlKGdldENhblByb2plY3RzT3ZlcnJpZGVEZWZhdWx0KCkpOwotCQlzZXRTYXZlQXV0b21hdGljYWxseShnZXRTYXZlQXV0b21hdGljYWxseURlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdERlbGVnYXRlcyhnZXRWYWxpZGF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGV4aXN0cyBvbmx5IGZvciBtaWdyYXRpb24gcHVycG9zZXMuIFRoZSByb290IG1hcmtlciBtdXN0IGJlIGRlbGV0ZWQgYWZ0ZXIKLQkgKiBtaWdyYXRpb24gaXMgY29tcGxldGUuCi0JICovCi0JcHJvdGVjdGVkIElNYXJrZXJbXSBnZXRNYXJrZXIoKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gZ2V0Um9vdCgpOwotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByb290LmZpbmRNYXJrZXJzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJFRkVSRU5DRV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfT05FKTsKLQotCQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDEpIHsKLQkJCQlyZXR1cm4gbWFya2VyczsKLQkJCX0KLQkJCS8vIGpvYiBpcyBkb25lLiBOb3RoaW5nIHRvIG1pZ3JhdGUuCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJLy8gQ2FuJ3QgZmluZCB0aGUgSU1hcmtlcj8gQXNzdW1lIGl0J3MgZGVsZXRlZC4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiR2xvYmFsQ29uZmlndXJhdGlvbi5nZXRNYXJrZXIoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIDUuMCBwcmVmZXJlbmNlcyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyLCBhbmQgdGhlIGN1cnJlbnQucHJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbgotCQkvLyBQZXJzaXN0ZW50UHJvcGVydGllcyBvbiB0aGUgSVJlc291cmNlLgotCQkvLyBBIDUuMCByb290IGNhbiBoYXZlIG5vIG1hcmtlciB2YWx1ZXMgaWYgdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcyBwYWdlLCBhbmQKLQkJLy8gdmFsaWRhdGlvbiB3ZXJlIG5ldmVyIHZpZXdlZCBvciBydW4uCi0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gZ2V0Um9vdCgpOwotCQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJLy8gVGhlcmUgd2VyZSBubyBnbG9iYWwgcHJlZmVyZW5jZXMgaW4gNC4wMywgc28gdGhlIG1pZ3JhdGlvbiBpcyB0byBjcmVhdGUgc29tZS4KLQkJCQlyZXNldFRvRGVmYXVsdCgpOyAvLyBhc3NpZ24gdGhlIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBuZXcgR2xvYmFsIFByZWZlcmVuY2UKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlNYXJrZXIgcm9vdE1hcmtlciA9IG1hcmtlclswXTsgLy8gZ2V0TWFya2VyKCkgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlJ3MgYSBtYXJrZXIKLQkJCS8vIGluIHRoZSBhcnJheQotLy8JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gbnVsbDsKLS8vCQkJU3RyaW5nIGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX1ZBTElEQVRPUlMpOwotLy8JCQlpZiAoZW5hYmxlZFZhbGlkYXRvcnNTdHJpbmcgPT0gbnVsbCkgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotLy8JCQl9IGVsc2UgewotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBnZXRTdHJpbmdBc0VuYWJsZWRFbGVtZW50c0FycmF5KGVuYWJsZWRWYWxpZGF0b3JzU3RyaW5nKTsKLS8vCQkJfQotLy8KLS8vCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCQkJU3RyaW5nIGVuYWJsZWRNYW51YWxWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQkJCXNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMpKTsKLQkJCVN0cmluZyBlbmFibGVkQnVpbGRWYWxpZGF0b3JzID0gKFN0cmluZykgZ2V0VmFsdWUocm9vdE1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX0JVSUxEX1ZBTElEQVRPUlMpOwotCQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShlbmFibGVkQnVpbGRWYWxpZGF0b3JzKSk7Ci0vLwkJCWlmIChlbmFibGVkTWFudWFsVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkgfHwgZW5hYmxlZEJ1aWxkVmFsaWRhdG9ycy5lcXVhbHMobnVsbCkpIAotLy8JCQkJZW5hYmxlZFZhbGlkYXRvcnMgPSBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRU5BQkxFRF9WQUxJREFUT1JTOwotCQkJc2V0Q2FuUHJvamVjdHNPdmVycmlkZShnZXRWYWx1ZShyb290TWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlBSRUZfUFJPSkVDVFNfQ0FOX09WRVJSSURFLCBQUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERV9ERUZBVUxUKSk7Ci0JCQlyb290LmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMobWFya2VyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiR2xvYmFsQ29uZmlndXJhdGlvbi5sb2FkVjUwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5VG8oR2xvYmFsQ29uZmlndXJhdGlvbiBncCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlzdXBlci5jb3B5VG8oZ3ApOwotCi0JCS8vIE5lZWQgdG8gaGF2ZSBhIGRpc3RpbmN0IG1ldGhvZCBmb3IgdGhpcyBjaGlsZCBjbGFzcyAoaS5lLiwgdGhlIHBhcmFtZXRlcgotCQkvLyBpcyBub3QgYSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbikgYmVjYXVzZSBpZiB0aGlzIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNhbGxlZCBhcyBwYXJ0IG9mIFZhbGlkYXRpb25Db25maWd1cmF0aW9uJ3MgY29uc3RydWN0b3IsIHRoZW4gdGhlIHZhbHVlIG9mCi0JCS8vIHRoaXMgZmllbGQgaXMgb3ZlcndyaXR0ZW4uIEZpZWxkcyBvZiB0aGlzIGNsYXNzIGFyZSBpbml0aWFsaXplZCB0byB0aGUKLQkJLy8gZGVmYXVsdCBhZnRlciB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gcGFyZW50IGlzIGNyZWF0ZWQuCi0JCWdwLnNldENhblByb2plY3RzT3ZlcnJpZGUoY2FuUHJvamVjdHNPdmVycmlkZSgpKTsKLQkJZ3Auc2V0U2F2ZUF1dG9tYXRpY2FsbHkoZ2V0U2F2ZUF1dG9tYXRpY2FsbHkoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENhblByb2plY3RzT3ZlcnJpZGVEZWZhdWx0KCkgewotCQlyZXR1cm4gUFJFRl9QUk9KRUNUU19DQU5fT1ZFUlJJREVfREVGQVVMVDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNhdmVBdXRvbWF0aWNhbGx5RGVmYXVsdCgpIHsKLQkJcmV0dXJuIFBSRUZfU0FWRV9BVVRPTUFUSUNBTExZX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNkZXNlcmlhbGl6ZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuZGVzZXJpYWxpemUoc3RvcmVkQ29uZmlndXJhdGlvbik7Ci0KLQkJaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJLy8gSWYgaXQncyBudWxsLCB0aGVuIHN1cGVyLmRlc2VyaWFsaXplIGhhcyBhbHJlYWR5IGNhbGxlZCByZXNldFRvRGVmYXVsdCB0byBpbml0aWFsaXplCi0JCQkvLyB0aGlzIGluc3RhbmNlLgotCQkJaW50IGNhbk92ZXJyaWRlSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERSk7Ci0JCQlpbnQgZGlzYWJsZUFsbFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORyk7Ci0JCQlpbnQgc2F2ZUF1dG9tYXRpY2FsbHlJbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBVkVfQVVUT01BVElDQUxMWV9TRVRUSU5HKTsKLQkJCWlmIChkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGNhbk92ZXJyaWRlID0gc3RvcmVkQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoY2FuT3ZlcnJpZGVJbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJFRl9QUk9KRUNUU19DQU5fT1ZFUlJJREUubGVuZ3RoKCksIGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXgpOwotCQkJCXNldENhblByb2plY3RzT3ZlcnJpZGUoQm9vbGVhbi52YWx1ZU9mKGNhbk92ZXJyaWRlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCQlpZihzYXZlQXV0b21hdGljYWxseUluZGV4ICE9IC0xKQotCQkJewotCQkJCVN0cmluZyBzYXZlQXV0b21hdGljYWxseSA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKHNhdmVBdXRvbWF0aWNhbGx5SW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBVkVfQVVUT01BVElDQUxMWV9TRVRUSU5HLmxlbmd0aCgpLCBjYW5PdmVycmlkZUluZGV4KTsKLQkJCQlzZXRTYXZlQXV0b21hdGljYWxseShCb29sZWFuLnZhbHVlT2Yoc2F2ZUF1dG9tYXRpY2FsbHkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5hdHRyaWJ1dGUuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jc2VyaWFsaXplKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLlNBVkVfQVVUT01BVElDQUxMWV9TRVRUSU5HKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRTYXZlQXV0b21hdGljYWxseSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkVGX1BST0pFQ1RTX0NBTl9PVkVSUklERSk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoY2FuUHJvamVjdHNPdmVycmlkZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIuc2VyaWFsaXplKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JUHJvamVjdFZhbGlkYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5OTg4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0lQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIFZhbGlkYXRvckhlbHBlciBleHRlbnNpb25zIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciB7Ci0JCi0JcHVibGljIElDb250YWluZXJbXSBnZXRPdXRwdXRDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpOwotCQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0U291cmNlQ29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KTsKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlSW5zdGFuY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjkyYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgYnkgZXh0ZW5zaW9ucyB0byBhZGQgdmFsaWQgdmFsaWRhdGlvbiB0eXBlcyB0byB0aGUgdmFsaWRhdGUKLSAqIG1lbnUgYWN0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2YWxpZCBJUmVzb3VyY2UgdHlwZSBmb3IgdGhlIGV4dGVuc2libGUgb2JqZWN0IHNlbGVjdGlvbiwKLQkgKiBzaG91bGQgYmUgaW5zdGFuY2Ugb2YgSUZvbGRlciwgSUZpbGUsIG9yIElQcm9qZWN0IGlmIHRoaXMgZXh0ZW5zaW9uIGtub3dzCi0JICogaG93IHRvIGhhbmRsZSB0aGUgc2VsZWN0aW9uLCBvdGhlcndpc2UgaXQgc2hvdWxkIHJldHVybiBudWxsCi0JICovIAotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0QmFzZVZhbGlkYXRpb25UeXBlKE9iamVjdCBzZWxlY3Rpb24pOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGNsYXNzbmFtZSBvZiB0aGUgdmFsaWRhdGlvbiB0eXBlIHRvIHJlZ2lzdGVyIGZvciB2YWxpZGF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpOwotCQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25UeXBlU3RyaW5nKFN0cmluZyB2YWxpZGF0aW9uVHlwZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ludGVybmFsVmFsaWRhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2Y2RhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0ludGVybmFsVmFsaWRhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIgX2luc3QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUF9HUk9VUCA9ICJWYWxpZGF0aW9uT3BlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJCAvLyB3aGVuIHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uCi0KLQkvLyBhZGRzIGEgbWVzc2FnZSB0byB0aGUgdGFzawotCS8vIGxpc3Q7IGUuZy4gY2FuY2VsLCBvciBpbnRlcm5hbAotCS8vIGVycm9yLCB0aGlzIGdyb3VwIG5hbWUgaXMgdXNlZAotCS8vIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCi0JLy8gbWVzc2FnZXMgdGhhdCB0aGUgdmFsaWRhdG9yCi0JLy8gaXRzZWxmIHB1dCwgYW5kIHRoZSBvbmVzIHdoaWNoCi0JLy8gdGhlIHZhbGlkYXRvciBvd25zLCBidXQgdGhlCi0JLy8gb3BlcmF0aW9uIHB1dC4gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIoKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IG5ldyBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IFNldCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQgd3JhcEluU2V0KE9iamVjdFtdIG9iaikgewotCQlTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKChvYmogPT0gbnVsbCkgfHwgKG9iai5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZChvYmpbaV0pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB2YWxpZGF0b3IgdGhyb3dzIGEgVGhyb3dhYmxlLCBsb2cgdGhlIGludGVybmFsIGVycm9yIHRvIHRoZSB0YXNrIGxpc3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnRlcm5hbEVycm9yVGFzayhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFRocm93YWJsZSBleGMpIHsKLQkJYWRkT3BlcmF0aW9uVGFzayhwcm9qZWN0LCB2bWQsIFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfSU5URVJOQUwsIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksICgoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsKSA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIElmIHRoZSB1c2VyIGlzIGNhbmNlbGxpbmcgdmFsaWRhdGlvbiBvbiB0aGUgY3VycmVudCBwcm9qZWN0L3Jlc291cmNlLCBBZGQgYW4gaW5mb3JtYXRpb24gdGFzawotCSAqIHRvIHRoZSB0YXNrIGxpc3QgaW5mb3JtaW5nIHRoZSB1c2VyIHRoYXQgdmFsaWRhdGlvbiBoYXMgbm90IGJlZW4gcnVuIG9uIHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHRocm93cyBhIFRocm93YWJsZSwgbG9nIHRoZSBpbnRlcm5hbCBlcnJvciB0byB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvblRhc2soSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5MT1dfU0VWRVJJVFkpOwotCQltZXNzYWdlLnNldElkKG1lc3NhZ2VJZCk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKHBhcm1zKTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoT1BfR1JPVVApOwotCi0JCS8vIEFsdGhvdWdoIHRoZSBtZXNzYWdlIGlzIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IsIHRoZSBzdHJpbmcgb2YgdGhlIG1lc3NhZ2UgaGFzIHRvIGJlCi0JCS8vIGxvYWRlZCBieSB0aGlzIGNsYXNzJyBDbGFzc0xvYWRlcgotCQlXb3JrYmVuY2hSZXBvcnRlci5hZGRNZXNzYWdlKHByb2plY3QsIHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgbWVzc2FnZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIHByZXZpb3VzIHZhbGlkYXRpb24gd2l0aCB0aGlzIHZhbGlkYXRvciwgb3IgaWYgdGhlcmUgd2FzIGEKLQkgKiBUaHJvd2FibGUgY2F1Z2h0IGR1cmluZyB0aGUgbGFzdCBleGVjdXRpb24gb2YgdGhpcyB2YWxpZGF0b3IsIGFuZCB0aGUgdmFsaWRhdG9yIGlzIGluIHRoZQotCSAqIHByb2Nlc3Mgb2YgdmFsaWRhdGluZyBub3csIHJlbW92ZSB0aGUgZm9ybWVyIGluZm9ybWF0aW9uIHRhc2sgbWVzc2FnZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uVGFza3MoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCVdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQocHJvamVjdCwgdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSwgT1BfR1JPVVApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHZtZHNbaV0uZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQl0ZW1wLmFkZChuYW1lc1tqXSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmdbXSB2bWROYW1lcyA9IG5ldyBTdHJpbmdbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkodm1kTmFtZXMpOwotCQlyZXR1cm4gdm1kTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZXMgb2YgdGhlIHZhbGlkYXRvciBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0b3JOYW1lcyhDb2xsZWN0aW9uIHZtZHMpIHsKLQkJU2V0IHRlbXAgPSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZtZHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykgewotCQkJCXRlbXAuYWRkKG5hbWVzW2pdKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHZtZE5hbWVzID0gbmV3IFN0cmluZ1t0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheSh2bWROYW1lcyk7Ci0JCXJldHVybiB2bWROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9yc0ZvckV4dGVuc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQotCQkJLy8gR2V0IGFsbCBvZiB0aGUgdmFsaWRhdG9ycyBjb25maWd1cmVkIG9uIHRoZSBwcm9qZWN0IGZvciB0aGUgZ2l2ZW4gZmlsZSBleHRlbnNpb24KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0VmFsaWRhdG9ycygpOwotCi0JCQkvLyBDb25zdHJ1Y3QgYSBmYWtlIElGaWxlIHR5cGUgdG8gcmVwcmVzZW50IGEgZmlsZSB3aXRoIHRoaXMgZXh0ZW5zaW9uLgotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJvamVjdC5nZXROYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZChJUGF0aC5TRVBBUkFUT1IpOwotCQkJYnVmZmVyLmFwcGVuZChmaWxlRXh0ZW5zaW9uKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCi0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbdm1kcy5sZW5ndGhdOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQkJaWYgKHZtZC5pc0FwcGxpY2FibGVUbyhmaWxlKSkgewotCQkJCQl0ZW1wW2NvdW50KytdID0gdm1kOwotCQkJCX0KLQkJCX0KLQotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjo6Z2V0VmFsaWRhdG9yc0ZvckV4dGVuc2lvbigiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiLCAiICsgZmlsZUV4dGVuc2lvbiArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMF07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHZhbGlkYXRvciBuYW1lcyB0aGF0IHZhbGlkYXRlIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXNGb3JFeHRlbnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gZ2V0VmFsaWRhdG9yc0ZvckV4dGVuc2lvbihwcm9qZWN0LCBmaWxlRXh0ZW5zaW9uKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbdm1kcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lc1tpXSA9IHZtZHNbaV0uZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2plY3RDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2plY3RDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTUzZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIFByb2plY3QgUHJlZmVyZW5jZXMgYXMgc2V0IG9uIHRoZSBQcm9qZWN0J3MgVmFsaWRhdGlvbiBQcm9wZXJ0aWVzIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q29uZmlndXJhdGlvbiBleHRlbmRzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHsKLQkKLQkvKiogZmFsc2UgLSBJZiB0aGUgdXNlciBoYXMgbmV2ZXIgc2V0IGEgcHJlZmVyZW5jZSBiZWZvcmUsIHRoaXMgaXMgdGhlIG92ZXJyaWRlIGRlZmF1bHQgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkpfT1ZFUlJJREVHTE9CQUxfREVGQVVMVCA9IGZhbHNlOyAKLQlwcml2YXRlIGJvb2xlYW4gX2RvZXNQcm9qZWN0T3ZlcnJpZGUgPSBnZXREb2VzUHJvamVjdE92ZXJyaWRlRGVmYXVsdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpbiBhbGwgY2FzZXMgZXhjZXB0IGZvciB0aGUgUHJvcGVydGllcyBwYWdlJ3MgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0Q29uZmlndXJhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMgbWV0aG9kIGV4dHJhY3RzIGp1c3QgdGhpcyBwcm9qZWN0J3MgdmFsaWRhdG9ycyBmcm9tIHRoZQotCQkvLyBnbG9iYWwgbGlzdC4KLQkJc3VwZXIocHJvamVjdCwgZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKGNvbnZlcnRUb0FycmF5KFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRBbGxWYWxpZGF0b3JzKCkpLCBwcm9qZWN0KSk7Ci0KLQkJLy8gQ2FuJ3QgcHV0IHRoZSBjYWxsIHRvIGxvYWQoKSBhbmQgcGFzc2l2YXRlKCkgaW4gdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbnN0cnVjdG9yCi0JCS8vIGR1ZQotCQkvLyB0byB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24uCi0JCS8vICAgIDEuIEZpcnN0IHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIGFuZCB0aGF0IGxvYWRzIHRoZSBzdG9yZWQKLQkJLy8gdmFsdWVzLgotCQkvLyAgICAyLiBUaGVuIHRoaXMgY2xhc3MncyA8aW5pdD4gbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHRoYXQgaW5pdGlhbGl6ZXMgdGhlICJvdmVycmlkZSIgZmllbGQKLQkJLy8gdG8gdGhlIGRlZmF1bHQsCi0JCS8vICAgICAgIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgc3RvcmVkIHZhbHVlLgotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIFByb3BlcnRpZXMgcGFnZSwgc28gdGhhdCB0aGUgcGFnZSBjYW4gc3RvcmUgdmFsdWVzCi0JICogd2l0aG91dCBwZXJzaXN0aW5nIHRoZW0gKGkuZS4sIGlmIHRoZSB1c2VyIHByZXNzZXMgQ2FuY2VsIHRoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lLikKLQkgKi8KLQlwdWJsaWMgUHJvamVjdENvbmZpZ3VyYXRpb24oUHJvamVjdENvbmZpZ3VyYXRpb24gb3JpZ2luYWwpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJb3JpZ2luYWwuY29weVRvKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdG8gdXNlLCB3aGV0aGVyIGdsb2JhbCBvciBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVzZUdsb2JhbFByZWZlcmVuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChncCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoIWdwLmNhblByb2plY3RzT3ZlcnJpZGUoKSkgewotCQkJCS8vIElmIHByb2plY3QncyBjYW4ndCBvdmVycmlkZSB0aGUgZ2xvYmFsLCB1c2UgdGhlIGdsb2JhbAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvLyBJZiB0aGUgcHJvamVjdCBvdmVycmlkZXMsIHRoZW4gZG9uJ3QgdXNlIHRoZSBnbG9iYWwuCi0JCQkvLyBJZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBvdmVycmlkZSwgdXNlIHRoZSBnbG9iYWwuCi0JCQlyZXR1cm4gIV9kb2VzUHJvamVjdE92ZXJyaWRlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJQcm9qZWN0Q29uZmlndXJhdGlvbi51c2VyR2xvYmFsUHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9lc1Byb2plY3RPdmVycmlkZSgpIHsKLQkJLy8gSWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIGRvZXNuJ3QgYWxsb3cgcHJvamVjdHMgdG8gb3ZlcnJpZGUsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlCi0JCS8vIHZhbHVlIG9mIF9kb2VzUHJvamVjdE92ZXJyaWRlIGlzLgotCQlyZXR1cm4gIXVzZUdsb2JhbFByZWZlcmVuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2VzUHJvamVjdE92ZXJyaWRlKGJvb2xlYW4gZG9lcykgewotCQlfZG9lc1Byb2plY3RPdmVycmlkZSA9IGRvZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHByZWZlcmVuY2VzIHNob3VsZCBiZSB1c2VkIHRoZW4gdGhlIHByZWZlcmVuY2Ugc2V0dGluZ3MgYXJlIHJldHVybmVkOyBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIHByb2plY3Qgc2V0dGluZ3MuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkVmFsaWRhdG9ycygpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiAgewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXREaXNhYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXREaXNhYmxlZFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERpc2FibGVkVmFsaWRhdG9ycygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5wcmVmZXJlbmNlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2dldFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRWYWxpZGF0b3JzKCksIGdldFJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2dldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkKLQkgKi8KLSAgcHVibGljIE1hcCBnZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0gICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhib29sZWFuIGluY3JlbWVudGFsKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKGluY3JlbWVudGFsKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoaW5jcmVtZW50YWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5wcmVmZXJlbmNlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2lzRW5hYmxlZChWYWxpZGF0b3JNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmlzRW5hYmxlZCh2bWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0VuYWJsZWQodm1kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkRpc2FibGVkVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkRpc2FibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZEaXNhYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLnByZWZlcmVuY2UuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jbnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpCi0JICovCi0JcHVibGljIGludCBudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCkubnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwucHJlZmVyZW5jZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNudW1iZXJPZlZhbGlkYXRvcnMoKQotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZlZhbGlkYXRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIubnVtYmVyT2ZWYWxpZGF0b3JzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY291bGQgYmUgY2FsbGVkIHdpdGggdGhlIHByb2plY3QncyB2YWx1ZXMsIG9yIHdpdGggdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkgKiBWYWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdCB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCXN1cGVyLnNldEVuYWJsZWRWYWxpZGF0b3JzKGV4dHJhY3RQcm9qZWN0VmFsaWRhdG9ycyh2bWRzLCBnZXRSZXNvdXJjZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY291bGQgYmUgY2FsbGVkIHdpdGggdGhlIHByb2plY3QncyB2YWx1ZXMsIG9yIHdpdGggdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkgKiBWYWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdCB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHsKLQkJc3VwZXIuc2V0VmFsaWRhdG9ycyhleHRyYWN0UHJvamVjdFZhbGlkYXRvcnModm1kcywgZ2V0UmVzb3VyY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc2V0IG9mIHZhbGlkYXRvcnMsIHVzdWFsbHkgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHNldCwgY2hhbmdlIHRoZSBzZXQgc28gdGhhdCBpdAotCSAqIGNvbnRhaW5zIG9ubHkgdGhlIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiB0aGlzIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQkJaW50IGxlbmd0aCA9ICh2bWRzID09IG51bGwpID8gMCA6IHZtZHMubGVuZ3RoOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbGVuZ3RoXTsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGVtcDsKLQkJfQotCi0JCWludCBjb3VudCA9IDA7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAocmVhZGVyLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCX0KLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJdGVtcCA9IG51bGw7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldFRvRGVmYXVsdCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gVGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBwcm9qZWN0IGlzIHdoYXRldmVyIHRoZSBwcmVmZXJlbmNlIHZhbHVlcyBhcmUKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0KLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ3AuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoZ3AuZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKTsKLSAgICBzZXREZWxlZ2F0aW5nVmFsaWRhdG9ycyhncC5nZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpKTsKLQkJCi0JCS8vIGV4Y2VwdCBmb3IgdGhpcyBmaWVsZCwgd2hpY2ggaXMgdW5pcXVlIHRvIHRoZSBwcm9qZWN0IHByZWZlcmVuY2VzCi0JCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZ2V0RG9lc1Byb2plY3RPdmVycmlkZURlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRUb0RlZmF1bHRGb3JQcm9qZWN0RGVzY3JpcHRpb25DaGFuZ2UoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIFRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgcHJvamVjdCBpcyB3aGF0ZXZlciB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgYXJlCi0JCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQlzZXRFbmFibGVkTWFudWFsVmFsaWRhdG9ycyhncC5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycygpKTsKLQkJc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhncC5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotICAgIHNldERlbGVnYXRpbmdWYWxpZGF0b3JzKGdwLmdldERlbGVnYXRpbmdWYWxpZGF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9qZWN0J3MgbmF0dXJlIGhhcyBjaGFuZ2VkLCBzbyByZWNhbGN1bGF0ZSB0aGUgdmFsaWRhdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIG9uIHRoZQotCSAqIHByb2plY3QsIGFuZCByZXNldCB0aGUgdmFsdWVzIG9mIHRoZSBwcm9qZWN0IHRvIHRoZSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvamVjdE5hdHVyZSgpIHsKLQkJLyoKLQkJICogV2UgZG8gbm90IHdhbnQgdG8gcGVyZm9ybSB0aGUgcmVzZXR0aW5nIHRoZSBvZiB0aGUgdmFsaWRhdG9ycyBhcyB0aGUgbmF0dXJlIG5ldmVyIGdldHMKLQkJICogcmVzZXQgZHVlIHRvIGNoYW5nZSBpbiB0aGUgcHJvamVjdCByZWZlcmVuY2VzIC0gVktCIEdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPQotCQkgKiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkgKiBzZXRWYWxpZGF0b3JzKGdwLmdldFZhbGlkYXRvcnMoKSk7IC8vIFJlc2V0IHRoZSB2YWxpZGF0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgb24gdGhlCi0JCSAqIHByb2plY3QgKHRoZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBhdXRvbWF0aWNhbGx5IHNhdmVzIG9ubHkgdGhlIHZhbGlkYXRvcnMgdGhhdCBhcmUKLQkJICogY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCkuIHJlc2V0VG9EZWZhdWx0KCk7IC8vIEdpdmVuIHRoYXQgdGhlIHByb2plY3QgaXMgIm5ldyIsIHJlc2V0Ci0JCSAqIGl0cyB2YWx1ZXMgdG8gdGhlIFByZWZlcmVuY2VzLgotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleGlzdHMgb25seSBmb3IgbWlncmF0aW9uIHB1cnBvc2VzLiBUaGUgcHJvamVjdCBtYXJrZXIgbXVzdCBiZSBkZWxldGVkIGFmdGVyCi0JICogbWlncmF0aW9uIGlzIGNvbXBsZXRlLgotCSAqLwotCXByb3RlY3RlZCBJTWFya2VyW10gZ2V0TWFya2VyKCkgewotCQl0cnkgewotCQkJLy8gRmlyc3QgdHJ5IHRvIGZpbmQgdGhlIDQuMDMgcHJvamVjdCBtYXJrZXIuCi0JCQlJTWFya2VyW10gYWxsTWFya2VycyA9IGdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfTUFSS0VSXzQwMywgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQotCQkJLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiB0aGlzIG1pZ2h0IGJlIGEgNS4wIHByb2plY3QgbWFya2VyLgotCQkJaWYgKChhbGxNYXJrZXJzID09IG51bGwpIHx8IChhbGxNYXJrZXJzLmxlbmd0aCA9PSAwKSkgewotCQkJCWFsbE1hcmtlcnMgPSBnZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuUFJKX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCX0KLQotCQkJLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHByb2plY3RtYXJrZXIuCi0JCQlpZiAoYWxsTWFya2Vycy5sZW5ndGggPT0gMSkgewotCQkJCXJldHVybiBhbGxNYXJrZXJzOwotCQkJfQotCQkJLy8gSm9iIGlzIGRvbmUuIE5vdGhpbmcgdG8gbWlncmF0ZS4KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJLy8gQ2FuJ3QgZmluZCB0aGUgSU1hcmtlcj8gQXNzdW1lIGl0J3MgZGVsZXRlZC4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiUHJvamVjdENvbmZpZ3VyYXRpb246OmdldE1hcmtlciIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHsKLQkJLy8gNC4wMyBwcm9qZWN0IHByZWZlcmVuY2VzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBpbiB0aGUgZm9sbG93aW5nIHdheXM6Ci0JCS8vICAgIDEuIE9ubHkgcHJlZmVyZW5jZXMgdGhhdCBjb3VsZCBiZSBzZXQgd2VyZSB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGFuZCB0aGUgYXV0by12YWxpZGF0ZQotCQkvLyBvcHRpb24uCi0JCS8vICAgIDIuIFRoZSBwcmVmZXJlbmNlcyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyIGluc3RlYWQgb2YgYSBQZXJzaXN0ZW50UHJvcGVydHkuCi0JCS8vIFRoZSA1LjAgcHJvamVjdCBzZXR0aW5ncyB3ZXJlIHN0b3JlZCBpbiBhbiBJTWFya2VyLCBhbmQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXJlIHN0b3JlZAotCQkvLyBpbiBhIFBlcnNpc3RlbnRQcm9wZXJ0eS4KLQkJLy8gQSA1LjAgcHJvamVjdCBjb3VsZCBoYXZlIGEgbnVsbCB2YWxpZGF0aW9uIG1hcmtlciBpZiB0aGUgdmFsaWRhdGlvbiBwYWdlIHdhcyBuZXZlcgotCQkvLyBvcGVuZWQgb24gaXQsIGFuZCBpZiB2YWxpZGF0aW9uIHdhcyBuZXZlciBydW4uCi0JCXRyeSB7Ci0JCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCQkvLyBBc3N1bWUgZGVmYXVsdCB2YWx1ZXMKLQkJCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSU1hcmtlciBwcmpNYXJrZXIgPSBtYXJrZXJbMF07IC8vIGdldFByb2plY3RNYXJrZXIoKSBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUncyBhCi0JCQkvLyBtYXJrZXIgaW4gdGhlIGFycmF5Ci0vLwkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCi0vLwkJCVN0cmluZyBlbmFibGVkVmFsU3RyID0gKFN0cmluZykgZ2V0VmFsdWUocHJqTWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfVkFMSURBVE9SUyk7Ci0vLwkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbCA9IG51bGw7Ci0vLwkJCWlmIChlbmFibGVkVmFsU3RyID09IG51bGwpIHsKLS8vCQkJCWVuYWJsZWRWYWwgPSBncC5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJZW5hYmxlZFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZFZhbFN0cik7Ci0vLwkJCX0KLS8vCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFZhbCk7Ci0JCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZE1hbmF1YWxWYWwgPSBudWxsOwotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkQnVpbGRWYWwgPSBudWxsOwotCQkJU3RyaW5nIGVuYWJsZWRNYW51YWxWYWxTdHIgPSAoU3RyaW5nKSBnZXRWYWx1ZShwcmpNYXJrZXIsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUyk7Ci0JCQlTdHJpbmcgZW5hYmxlZEJ1aWxkVmFsU3RyID0gKFN0cmluZykgZ2V0VmFsdWUocHJqTWFya2VyLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0vLwkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbCA9IG51bGw7Ci0vLwkJCWlmIChlbmFibGVkTWFudWFsVmFsU3RyLmVxdWFscyhudWxsKSB8fCBlbmFibGVkQnVpbGRWYWxTdHIuZXF1YWxzKG51bGwpKSB7Ci0vLwkJCQllbmFibGVkVmFsID0gZ3AuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLS8vCQkJfSBlbHNlIHsKLQkJCWlmICghZW5hYmxlZE1hbnVhbFZhbFN0ci5lcXVhbHMobnVsbCkgJiYgIWVuYWJsZWRCdWlsZFZhbFN0ci5lcXVhbHMobnVsbCkpIHsKLQkJCQllbmFibGVkTWFuYXVhbFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbFN0cik7Ci0JCQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZW5hYmxlZE1hbmF1YWxWYWwpOwotCQkJCWVuYWJsZWRCdWlsZFZhbCA9IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoZW5hYmxlZE1hbnVhbFZhbFN0cik7Ci0JCQkJc2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycyhlbmFibGVkQnVpbGRWYWwpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGxvYWRWZXJzaW9uKG1hcmtlcik7IC8vIEluIDQuMDMsIGV2ZXJ5IHByb2plY3QgaGFkIGl0cyBvd24gdmFsaWRhdG9ycyAmCi0JCQkvLyBhdXRvLXZhbGlkYXRlIHNldHRpbmdzLgotCQkJQm9vbGVhbiBib29sVmFsID0gKEJvb2xlYW4pIGdldFZhbHVlKHByak1hcmtlciwgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwpOwotCQkJaWYgKChib29sVmFsID09IG51bGwpICYmICh2ZXJzaW9uLmVxdWFscyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT040XzAzKSkpIHsKLQkJCQkvLyBEaWZmZXJlbnQgZGVmYXVsdCBmb3IgNC4wMy4gSW4gNC4wMywgYWxsIHByb2plY3RzIG92ZXJyb2RlIHRoZSBnbG9iYWwsIGJlY2F1c2UKLQkJCQkvLyB0aGUKLQkJCQkvLyBnbG9iYWwgcHJlZmVyZW5jZXMgZGlkbid0IGV4aXN0LgotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKGJvb2xWYWwgPT0gbnVsbCkgewotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZ2V0RG9lc1Byb2plY3RPdmVycmlkZURlZmF1bHQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoYm9vbFZhbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCWdldFJlc291cmNlKCkuZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJQcm9qZWN0Q29uZmlndXJhdGlvbi5sb2FkTWFya2VyICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJQcm9qZWN0Q29uZmlndXJhdGlvbi5sb2FkTWFya2VyIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlUbyhQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNvcHlUbyhwcmpwKTsKLQotCQkvLyBOZWVkIHRvIGhhdmUgYSBkaXN0aW5jdCBtZXRob2QgZm9yIHRoaXMgY2hpbGQgY2xhc3MgKGkuZS4sIHRoZSBwYXJhbWV0ZXIKLQkJLy8gaXMgbm90IGEgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24pIGJlY2F1c2UgaWYgdGhpcyBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjYWxsZWQgYXMgcGFydCBvZiBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbidzIGNvbnN0cnVjdG9yLCB0aGVuIHRoZSB2YWx1ZSBvZgotCQkvLyB0aGlzIGZpZWxkIGlzIG92ZXJ3cml0dGVuLiBGaWVsZHMgb2YgdGhpcyBjbGFzcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlCi0JCS8vIGRlZmF1bHQgYWZ0ZXIgdGhlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHBhcmVudCBpcyBjcmVhdGVkLgotCQlwcmpwLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZG9lc1Byb2plY3RPdmVycmlkZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RG9lc1Byb2plY3RPdmVycmlkZURlZmF1bHQoKSB7Ci0JCXJldHVybiBQUkpfT1ZFUlJJREVHTE9CQUxfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGhhdmUgbm90IGNoYW5nZWQgc2luY2UgdGhpcyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB3YXMKLQkgKiBjb25zdHJ1Y3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAoVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciB0aGUgUHJvcGVydGllcyBhbmQgUHJlZmVyZW5jZSBwYWdlczsKLQkgKiBpZiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIGhhc24ndCBjaGFuZ2VkLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSB0YXNrIGxpc3Q7Ci0JICogdXBkYXRpbmcgdGhlIHRhc2sgbGlzdCBpcyBhIGNvc3RseSBvcGVyYXRpb24uKQotCSAqIAotCSAqIFRoZSAiYWxsb3ciIHBhcmFtZXRlciByZXByZXNlbnRzIHdoZXRoZXIgb3Igbm90IHRoZSBnbG9iYWwgImFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIiBoYXMKLQkgKiBiZWVuIGNoYW5nZWQ6IC0gVFJVRSBtZWFucyB0aGF0IHRoZSBwcmVmZXJlbmNlICJhbGxvdyIgcGFyYW1ldGVyIGhhcyBiZWVuIGNoYW5nZWQgLSBGQUxTRQotCSAqIG1lYW5zIHRoYXQgdGhlIHByZWZlcmVuY2UgImFsbG93IiBwYXJhbXRlciBoYXMgbm90IGJlZW4gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuYWJsZWRWYWxpZGF0b3JzQ2hhbmdlZChWYWxpZGF0b3JNZXRhRGF0YVtdIG9sZEVuYWJsZWRWbWQsIGJvb2xlYW4gYWxsb3cpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgY2hlY2sgdGhlIG9idmlvdXM6IGlzIGV2ZXJ5IGVuYWJsZWQgdmFsaWRhdG9yIHN0aWxsIGVuYWJsZWQsIGFuZCBpcwotCQkvLyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlPyBJZiBub3QsIHJldHVybiB0cnVlLgotCQlpZiAoc3VwZXIuaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKG9sZEVuYWJsZWRWbWQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0KLQkJLy8gSWYgdGhlIGdsb2JhbCBwcmVmZXJlbmNlIHZhbGlkYXRvcnMgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoZSB0YXNrIGxpc3QgbmVlZCB0byBiZSB1cGRhdGVkPwotCQkvLyBQUkVGIHwgUFJPSiB8IFVQREFURQotCQkvLyBBTExPVyB8IE9WRVJSSURFIHwgVEFTSyBMSVNUCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAwIHwgMCB8IDEKLQkJLy8gICAgIDAgfCAxIHwgMQotCQkvLyAgICAgMSB8IDAgfCAxCi0JCS8vICAgICAxIHwgMSB8IDAKLQkJLy8KLQkJLy8gSWYgdGhlIGdsb2JhbCAiYWxsb3ciIHByZWZlcmVuY2UgY2hhbmdlcyBmcm9tICJhbGxvdyIgdG8gImRvbid0IGFsbG93Iiwgb3IgdmljZSB2ZXJzYSwKLQkJLy8gYW5kIHRoZSBwcm9qZWN0IG92ZXJyaWRlcyB0aGUgcHJlZmVyZW5jZXMsIGFuZCB0aGUgdmFsaWRhdG9ycyBkaWZmZXIgYmV0d2VlbiB0aGUgcHJvamVjdAotCQkvLyBhbmQgdGhlIHByZWZlcmVuY2VzLCB0aGVuIHRoZSB0YXNrIGxpc3QgbXVzdCBiZSB1cGRhdGVkLgotCQlpZiAoYWxsb3cpIHsKLQkJCS8vICJhbGxvdyIgaGFzIGNoYW5nZWQsIHNvIHNlZSBpZiB0aGUgcHJlZmVyZW5jZSBhbmQgdGhlIHByb2plY3QgdmFsaWRhdG9ycyBtYXRjaC4KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gcHJvakVuYWJsZWRWbWQgPSBzdXBlci5nZXRFbmFibGVkVmFsaWRhdG9ycygpOyAvLyBieXBhc3MgdGhlIGNoZWNrCi0JCQkvLyBmb3Igd2hldGhlciB0aGUKLQkJCS8vIGdsb2JhbCBwcmVmZXJlbmNlcwotCQkJLy8gYXJlIHRvIGJlIHVzZWQgb3IKLQkJCS8vIG5vdAotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBncCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlyZXR1cm4gZ3AuaGFzRW5hYmxlZFZhbGlkYXRvcnNDaGFuZ2VkKHByb2pFbmFibGVkVm1kKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGF2ZURlbGVnYXRlc0NoYW5nZWQoTWFwIG9sZERlbGVnYXRlcywgYm9vbGVhbiBhbGxvdykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0gICAgaWYgKHN1cGVyLmhhdmVEZWxlZ2F0ZXNDaGFuZ2VkKG9sZERlbGVnYXRlcykpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChhbGxvdykgewotICAgICAgTWFwIHByb2pEZWxlZ2F0ZXMgPSBzdXBlci5nZXREZWxlZ2F0aW5nVmFsaWRhdG9ycygpOyAKLSAgICAgIEdsb2JhbENvbmZpZ3VyYXRpb24gZ3AgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotICAgICAgcmV0dXJuIGdwLmhhdmVEZWxlZ2F0ZXNDaGFuZ2VkKHByb2pEZWxlZ2F0ZXMpOwotICAgIH0KLSAgICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI2Rlc2VyaWFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZShTdHJpbmcgc3RvcmVkQ29uZmlndXJhdGlvbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAoc3RvcmVkQ29uZmlndXJhdGlvbiA9PSBudWxsIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkgPT0gMCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmVxdWFscygiZGVmYXVsdF92YWx1ZSIpKSB7Ci0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQl9IGVsc2UgaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJaW50IHByak92ZXJyaWRlSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwpOwotCQkJaW50IGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcpOwotCQkJaW50IHZlcnNpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQkJaWYgKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcubGVuZ3RoKCksIHZlcnNpb25JbmRleCk7Ci0JCQkJc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oQm9vbGVhbi52YWx1ZU9mKGRpc2FibGVBbGxWYWxpZGF0aW9uKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldERpc2FibGVBbGxWYWxpZGF0aW9uKGZhbHNlKTs7Ci0JCQl9Ci0JCQkvLyBwcm9qZWN0IGRvZXNuJ3Qgb3ZlcnJpZGUgdGhlIGdsb2JhbAotCQkJaWYgKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgcHJqT3ZlcnJpZGUgPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhwcmpPdmVycmlkZUluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwubGVuZ3RoKCksIGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXgpOwotCQkJCXNldERvZXNQcm9qZWN0T3ZlcnJpZGUoQm9vbGVhbi52YWx1ZU9mKHByak92ZXJyaWRlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuYXR0cmlidXRlLlZhbGlkYXRpb25Db25maWd1cmF0aW9uI3NlcmlhbGl6ZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBzZXJpYWxpemUoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5QUkpfT1ZFUlJJREVHTE9CQUwpOwotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGRvZXNQcm9qZWN0T3ZlcnJpZGUoKSkpOwotCQlpZiAoZG9lc1Byb2plY3RPdmVycmlkZSgpKSB7Ci0JCQkvLyBTdG9yZSBjb21tb24gdmFsdWVzIGZvciB0aGUgUHJvamVjdCBjb25maWd1cmF0aW9uIG9ubHkgaWYgdGhleSBkaWZmZXIgZnJvbSB0aGUgZ2xvYmFsCi0JCQlidWZmZXIuYXBwZW5kKHN1cGVyLnNlcmlhbGl6ZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGJvb2xlYW4gZnVsbEJ1aWxkKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhmdWxsQnVpbGQpLCBnZXRSZXNvdXJjZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHNldCBvZiB2YWxpZGF0b3JzLCB1c3VhbGx5IHRoZSBnbG9iYWwgcHJlZmVyZW5jZSBzZXQsIGNoYW5nZSB0aGUgc2V0IHNvIHRoYXQgaXQKLQkgKiBjb250YWlucyBvbmx5IHRoZSB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gdGhpcyBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhW10gZXh0cmFjdFByb2plY3RWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcywgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIG9ubHlSZWZlcmVuY2VkKSB7Ci0JCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0JCWludCBsZW5ndGggPSAodm1kcyA9PSBudWxsKSA/IDAgOiB2bWRzLmxlbmd0aDsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0ZW1wID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2xlbmd0aF07Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRlbXA7Ci0JCX0KLQotCQlpbnQgY291bnQgPSAwOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCQkJaWYgKHJlYWRlci5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBwcm9qZWN0KSkgewotCQkJCWlmICghb25seVJlZmVyZW5jZWQgfHwgdm1kLmlzRGVwZW5kZW50VmFsaWRhdG9yKCkpCi0JCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQl9Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXRlbXAgPSBudWxsOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLmF0dHJpYnV0ZS5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiNnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGJvb2xlYW4gZnVsbEJ1aWxkLCBib29sZWFuIG9ubHlSZWZlcmVuY2VkKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhmdWxsQnVpbGQpLCBnZXRSZXNvdXJjZSgpLCBvbmx5UmVmZXJlbmNlZCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVuYWJsZWRGdWxsQnVpbGRWYWxpZGF0b3JzKGZ1bGxCdWlsZCwgb25seVJlZmVyZW5jZWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5hdHRyaWJ1dGUuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCkKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCXJldHVybiBleHRyYWN0UHJvamVjdFZhbGlkYXRvcnMoQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5nZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSwgZ2V0UmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEluY3JlbWVudGFsVmFsaWRhdG9ycygpOwotCX0KLQotCXB1YmxpYyBpbnQgbnVtYmVyT2ZNYW51YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5udW1iZXJPZk1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm51bWJlck9mTWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uewotCQlpZiAodXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKS5pc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKTsKLQl9CQotCi0gIHB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZ2V0RGVsZWdhdGVEZXNjcmlwdG9yKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIGlmICh1c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLSAgICAgIHJldHVybiBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldERlbGVnYXRlRGVzY3JpcHRvcih2bWQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0RGVsZWdhdGVEZXNjcmlwdG9yKHZtZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHN0b3JlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRSZXNvdXJjZSgpOwotCQlJU2NvcGVDb250ZXh0IHByb2plY3RDb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmID0gcHJvamVjdENvbnRleHQuZ2V0Tm9kZShWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWlmIChwcmVmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcHJlZi5wdXQoVVNFUl9QUkVGRVJFTkNFLCBzZXJpYWxpemUoKSk7Ci0JCQkJcHJlZi5wdXQoVVNFUl9NQU5VQUxfUFJFRkVSRU5DRSwgc2VyaWFsaXplTWFudWFsU2V0dGluZygpKTsKLQkJCQlwcmVmLnB1dChVU0VSX0JVSUxEX1BSRUZFUkVOQ0UsIHNlcmlhbGl6ZUJ1aWxkU2V0dGluZygpKTsKLQkJCQlwcmVmLnB1dChERUxFR0FURVNfUFJFRkVSRU5DRSwgc2VyaWFsaXplRGVsZWdhdGVzU2V0dGluZygpKTsKLQkJCQlwcmVmLmZsdXNoKCk7Ci0JCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gYnNlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhic2UpOwotCQkJfQotCQl9Ci0JfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgbG9hZFByZWZlcmVuY2UoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFJlc291cmNlKCk7Ci0JCUlTY29wZUNvbnRleHQgcHJvamVjdENvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOwotCQlmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gcHJvamVjdENvbnRleHQuZ2V0Tm9kZShWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWlmIChwcmVmcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RvcmVkQ29uZmlnID0gcHJlZnMuZ2V0KFVTRVJfUFJFRkVSRU5DRSwiZGVmYXVsdF92YWx1ZSIpOwotCQkJZGVzZXJpYWxpemUoc3RvcmVkQ29uZmlnKTsKLQkJCVN0cmluZyBzdG9yZWRNYW51YWxDb25maWcgPSBwcmVmcy5nZXQoVVNFUl9NQU5VQUxfUFJFRkVSRU5DRSwiZGVmYXVsdF92YWx1ZSIpOwotCQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkTWFudWFsQ29uZmlnKTsKLQkJCVN0cmluZyBzdG9yZWRCdWlsZENvbmZpZyA9IHByZWZzLmdldChVU0VSX0JVSUxEX1BSRUZFUkVOQ0UsImRlZmF1bHRfdmFsdWUiKTsKLQkJCWRlc2VyaWFsaXplQnVpbGQoc3RvcmVkQnVpbGRDb25maWcpOwotCQkJU3RyaW5nIHN0b3JlZERlbGVnYXRlc0NvbmZpZ3VyYXRpb24gPSBwcmVmcy5nZXQoREVMRUdBVEVTX1BSRUZFUkVOQ0UsImRlZmF1bHRfdmFsdWUiKTsKLQkJCWRlc2VyaWFsaXplRGVsZWdhdGVzKHN0b3JlZERlbGVnYXRlc0NvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjUyZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMywgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3I7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCXByaXZhdGUgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIGluc3RhbmNlOwotCXByaXZhdGUgYm9vbGVhbiBlcnJvckNvbmRpdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCi0JLyoqIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04gPSAicmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBydW4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU4gPSAicnVuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBpZCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogY2xhc3MgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCAmJiAhZXJyb3JDb25kaXRpb24pCi0JCQkJaW5zdGFuY2UgPSAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUlVOKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWVycm9yQ29uZGl0aW9uID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZighUkVGX0ZJTEVfVkFMSURBVE9SX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyBtdXN0IGJlIG9mIHRoZSB0eXBlIFwiIiArIFJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04gKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuaWQgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEyYTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDMsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQlzdGF0aWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIgaW5zdGFuY2UgPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zOwotCi0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcihWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCwgInJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uLlJFRl9GSUxFX1ZBTElEQVRPUl9FWFRFTlNJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJYWRkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4dGVuc2lvbiBwb2ludC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RXh0ZW5zaW9uCi0JICogICAgICAgICAgICBUaGUgZXh0ZW5zaW9ucyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IG5ld0V4dGVuc2lvbikgewotCi0gICAgCS8vYWRkIHRvIHRoZSBsaXN0IG9mIHBvc3QgdmFsaWRhdG9yIGV4dGVuc2lvbnMgb25seSBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBhZGRlZCB5ZXQKLSAgICAJYm9vbGVhbiBjb250YWluc0V4dCA9IHRydWU7Ci0gICAgCUxpc3QgZXh0ZW5zaW9ucyA9IGdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCk7Ci0gICAgCUl0ZXJhdG9yIGl0ID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgIAl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAJCVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiBleHQgPSAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKWl0Lm5leHQoKTsKLSAgICAJCWlmKCFleHQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgiaWQiKS5lcXVhbHMobmV3RXh0ZW5zaW9uLmdldEF0dHJpYnV0ZSgiaWQiKSkpCi0gICAgCQkJY29udGFpbnNFeHQgPSBmYWxzZTsKLSAgICAJfQotICAgIAlpZighY29udGFpbnNFeHQgfHxnZXRSZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucygpLmlzRW1wdHkoKSkKLSAgICAJCWdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCkuYWRkKG5ldyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24obmV3RXh0ZW5zaW9uKSk7Ci0gICAgCi0JCWdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zKCkuYWRkKG5ldyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24obmV3RXh0ZW5zaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBuZXdFeHRlbnNpb24KLQkgKiAgICAgICAgICAgIFRoZSBleHRlbnNpb25zIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvblBvaW50KFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckV4dGVuc2lvbiBuZXdFeHRlbnNpb24pIHsKLQkJaWYgKHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRpb25FeHRlbnNpb25zID09IG51bGwpCi0JCQlyZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMuYWRkKG5ld0V4dGVuc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIHByb2plY3QgYmFzZWQgb24gcHJpb3JpdGllcyBvZiB0aG9zZSB3aGljaCBhcmUKLQkgKiAgICAgICAgIGF2YWlsYWJsZSBhbmQgZW5hYmxlZAotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yKCkgewotCQlSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JFeHRlbnNpb24gcmVmRmlsZVZhbEV4dDsKLQkJZm9yIChJdGVyYXRvciByZWZGaWxlVmFsSXRyID0gZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOyByZWZGaWxlVmFsSXRyLmhhc05leHQoKTspIHsKLQkJCXJlZkZpbGVWYWxFeHQgPSAoUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yRXh0ZW5zaW9uKSByZWZGaWxlVmFsSXRyLm5leHQoKTsKLQkJCXJldHVybiByZWZGaWxlVmFsRXh0LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlcigpOwotCQkJaW5zdGFuY2UucmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckV4dGVuc2lvbnMuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMoKSB7Ci0JCWlmIChyZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcmVmZXJlbmNpYWxGaWxlVmFsaWRhdGlvbkV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZWZlcmVuY2lhbEZpbGVWYWxpZGF0aW9uRXh0ZW5zaW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVnaXN0cnlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVnaXN0cnlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhNzhiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1JlZ2lzdHJ5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVJ1bGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotCi0vKioKLSAqIFZhbGlkYXRpb24gY29uc3RhbnRzIG5lZWRlZCB0byBkZWNsYXJlIGFuIGV4dGVuc2lvbiBwb2ludCwgYW5kIHRvIGltcGxlbWVudCBhbiBleHRlbnNpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaXN0cnlDb25zdGFudHMgewotCVN0cmluZyBQTFVHSU5fSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQkKLQkvKiogdmFsaWRhdG9yIC0gZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgKi8KLQlTdHJpbmcgVkFMSURBVE9SX0VYVF9QVF9JRCA9ICJ2YWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogcnVuIC0gaWRlbnRpZmllcyB0aGUgVmFsaWRhdG9yIGNsYXNzICovCi0JU3RyaW5nIFRBR19SVU5fQ0xBU1MgPSAicnVuIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiBmaWx0ZXIgLSBpZGVudGlmaWVzIGEgZmlsdGVyIC0tIHR5cGUgYW5kL29yIG5hbWUgLS0gdXNlZCB0byBmaWx0ZXIgb3V0IHJlc291cmNlcyB3aGljaCBhcmUKLQkgKiBub3QgdG8gYmUgdmFsaWRhdGVkLiAoaS5lLiwgaWYgdGhlIHJlc291cmNlIGRvZXNuJ3QgcGFzcyB0aGlzIGZpbHRlciB0ZXN0LCBkb24ndCB2YWxpZGF0ZSBpdC4pIAotCSAqLyAKLQlTdHJpbmcgVEFHX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogaWRlbnRpZmllcyBhIGZpbHRlciAtLSB0eXBlIGFuZC9vciBuYW1lIC0tIHVzZWQgdG8gZmlsdGVyIG91dCByZXNvdXJjZXMgd2hpY2ggYXJlIG5vdCB0byBiZSB2YWxpZGF0ZWQuIChpLmUuLCBpZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBwYXNzIHRoaXMgZmlsdGVyIHRlc3QsIGRvbid0IHZhbGlkYXRlIGl0LikKLQkgKi8KLQlTdHJpbmcgVEFHX0NPTlRFTlRUWVBFID0gImNvbnRlbnRUeXBlQmluZGluZyI7IC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqCi0JICogIGlkZW50aWZpZXMgYSB0eXBlCi0JICovCi0JU3RyaW5nIEFUVF9DT05URU5UVFlQRUlEID0gImNvbnRlbnRUeXBlSWQiOyAvLyROT04tTkxTLTEkIAotCS8qKiBoZWxwZXIgLSBJVmFsaWRhdGlvbkNvbnRleHQgd2hpY2ggbG9hZHMgdGhlIE1PRiBtb2RlbCBmb3IgdGhlIElWYWxpZGF0b3IgKi8gCi0JU3RyaW5nIFRBR19IRUxQRVJfQ0xBU1MgPSAiaGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBwcm9qZWN0TmF0dXJlIC0gaWRlbnRpZmllcyB0aGUgcHJvamVjdHMgd2hpY2ggdGhlIHZhbGlkYXRvciBzaG91bGQgcnVuIG9uICovCi0JU3RyaW5nIFRBR19QUk9KRUNUX05BVFVSRSA9ICJwcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiBhZ2dyZWdhdGVWYWxpZGF0b3IgLSBpZGVudGlmaWVzIGEgdmFsaWRhdG9yKHMpIHdoaWNoIHRoaXMgdmFsaWRhdG9yIGFnZ3JlZ2F0ZXMuIFRoaXMgdmFsdWUgaXMgdXNlZCAKLQkgKiB0byByZW1vdmUgYWxsIG1lc3NhZ2VzIG93bmVkIGJ5IGEgcGFydGljdWxhciB2YWxpZGF0b3IuIEFnZ3JlZ2F0ZSB2YWxpZGF0b3JzIGNhbm5vdCBiZSBzaGFyZWQuIAotCSAqIG9ubHkgb25lIHZhbGlkYXRvciBtYXkgdXNlIGFuIGFnZ3JlZ2F0ZSBvZiB0aGF0IHR5cGUuICovCi0JU3RyaW5nIFRBR19BR0dSRUdBVEVfVkFMSURBVE9SUyA9ICJhZ2dyZWdhdGVWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkIAotCi0JLyoqIG9iamVjdENsYXNzIC0gaWRlbnRpZmllcyBhIHR5cGUgKi8gCi0JU3RyaW5nIEFUVF9PQkpFQ1RfQ0xBU1MgPSAib2JqZWN0Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIG5hbWVGaWx0ZXIgLSBpZGVudGlmaWVzIGEgbmFtZSAobWF5IGluY2x1ZGUgdGhlICcqJyB3aWxkY2FyZCBhbnl3aGVyZSBpbiB0aGUgbmFtZSkgKi8KLQlTdHJpbmcgQVRUX05BTUVfRklMVEVSID0gIm5hbWVGaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGlkIC0gaWRlbnRpZmllcyBhIHVuaXF1ZSBpZCB0byBmaWx0ZXIgb24gKi8KLQlTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBjbGFzcyAtIGlkZW50aWZpZXMgYSBjbGFzcyBuYW1lIG9mIGEgdGFnLCBlLmcuICJoZWxwZXIgY2xhc3MiLCBvciAicnVuIGNsYXNzIiAqLwotCVN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGFjdGlvbiAtIGlkZW50aWZpZXMgdGhlIGluY3JlbWVudGFsIHZhbGlkYXRpb24gYWN0aW9ucyBmb3Igd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgZmlsdGVyZWQgaW4gKi8gCi0JU3RyaW5nIEFUVF9BQ1RJT05fRklMVEVSID0gImFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogCi0JICogaW5jcmVtZW50YWwgLSBpZGVudGlmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMgaW5jcmVtZW50YWwgYnVpbGQgdmFsaWRhdGlvbi4gCi0JICogRGVmYXVsdCBpcyB0cnVlIChpLmUuLCBpbmNyZW1lbnRhbCBidWlsZHMgYXJlIHN1cHBvcnRlZCkuIAotCSAqLwotCVN0cmluZyBBVFRfSU5DUkVNRU5UQUwgPSAiaW5jcmVtZW50YWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRydWUgLSBUaGUgaW5jcmVtZW50YWwgZGVmYXVsdC4gKi8KLQlib29sZWFuIEFUVF9JTkNSRU1FTlRBTF9ERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKiogCi0JICogZnVsbEJ1aWxkIC0gaWRlbnRpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsaWRhdG9yIHN1cHBvcnRzIGZ1bGwgYnVpbGQgdmFsaWRhdGlvbi4gCi0JICogRGVmYXVsdCBpcyB0cnVlIChpLmUuLCBmdWxsIGJ1aWxkIHZhbGlkYXRpb24gaXMgc3VwcG9ydGVkKS4KLQkgKi8gCi0JU3RyaW5nIEFUVF9GVUxMQlVJTEQgPSAiZnVsbEJ1aWxkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogdHJ1ZSAtIFRoZSBidWlsZCBkZWZhdWx0LiAqLwotCWJvb2xlYW4gQVRUX0ZVTExCVUlMRF9ERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKiogZW5hYmxlZCAtIGlkZW50aWZpZXMgd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIERlZmF1bHQgaXMgInRydWUiIChlbmFibGVkKS4gKi8gCi0JU3RyaW5nIEFUVF9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRydWUgLSBUaGUgImVuYWJsZWQiIGRlZmF1bHQuICovCi0JYm9vbGVhbiBBVFRfRU5BQkxFRF9ERUZBVUxUID0gdHJ1ZTsKLQkKLQkvKiogaW5jbHVkZSAtIEluY2x1ZGUgcHJvamVjdHMgd2l0aCB0aGlzIG5hdHVyZSAqLwotCVN0cmluZyBBVFRfSU5DTFVERSA9ICJpbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiAKLQkgKiB0cnVlIC0gQnkgZGVmYXVsdCwgaWYgImluY2x1ZGUiIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHByb2plY3ROYXR1cmUgZWxlbWVudCwgCi0JICogdGhlbiBhc3N1bWUgdGhhdCB0aGUgbmF0dXJlIGlzIGluY2x1ZGVkLiAqLwotCWJvb2xlYW4gQVRUX0lOQ0xVREVfREVGQVVMVCA9IHRydWU7Ci0JCi0JLyoqIAotCSAqIHJ1bGVHcm91cCAtIGlkZW50aWZpZXMgdGhlIGRpZmZlcmVudCB2YWxpZGF0aW9uIHBhc3NlcyB3aGljaCB0aGlzIHZhbGlkYXRvciByZWNvZ25pemVzLiAKLQkgKiBUaGUgdmFsdWVzIGFyZSBpZGVudGlmaWVkIGluIElSdWxlR3JvdXAuCi0JICovCi0JU3RyaW5nIEFUVF9SVUxFX0dST1VQID0gInJ1bGVHcm91cCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogdGhlIGRlZmF1bHQgcGFzcyBpbmNsdWRlcyBvbmx5IHRoZSBGQVNUIFBBU1MuIEZVTEwgY2FuIGJlIGludm9rZWQgb25seSBleHBsaWNpdGx5IGJ5IGFuIG9wZXJhdGlvbi4gKi8KLQlpbnQgQVRUX1JVTEVfR1JPVVBfREVGQVVMVCA9IElSdWxlR3JvdXAuUEFTU19GQVNUOwotCQotCS8qKiBjYXNlU2Vuc2l0aXZlICovCi0JU3RyaW5nIEFUVF9DQVNFX1NFTlNJVElWRSA9ICJjYXNlU2Vuc2l0aXZlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBhc3luYyAtIElzIHRoZSB2YWxpZGF0b3IgdGhyZWFkLXNhZmU/ICovCi0JU3RyaW5nIEFUVF9BU1lOQyA9ICJhc3luYyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZmFsc2UgLSBUaGUgImNhbiB2YWxpZGF0b3IgcnVuIGFzeW5jaHJvbm91c2x5IiBkZWZhdWx0LiBJbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGNoYW5nZWQgdG8gdHJ1ZS4gKi8KLQlib29sZWFuIEFUVF9BU1lOQ19ERUZBVUxUID0gZmFsc2U7Ci0KLQkvKiogbWlncmF0ZSAtIHRoZSAibWlncmF0ZSIgc2VjdGlvbiBvZiB0aGUgdmFsaWRhdG9yICovCi0JU3RyaW5nIFRBR19NSUdSQVRFID0gIm1pZ3JhdGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHZhbGlkYXRvciAtIHRoZSAidmFsaWRhdG9yIiBlbGVtZW50IG9mIHRoZSAibWlncmF0ZSIgc2VjdGlvbiAqLwotCVN0cmluZyBUQUdfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZnJvbSAtIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgZm9ybWVyIHZhbGlkYXRvciBjbGFzcyAqLwotCVN0cmluZyBBVFRfRlJPTSA9ICJmcm9tIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiB0byAtIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY3VycmVudCB2YWxpZGF0b3IgY2xhc3MgKi8KLQlTdHJpbmcgQVRUX1RPID0gInRvIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERVBfVkFMSURBVE9SID0gImRlcGVuZGVudFZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVQX1ZBTF9WQUxVRSA9ICJkZXBWYWxWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTUFSS0VSX0lEID0gIm1hcmtlcklkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNQVJLRVJfSURfVkFMVUUgPSAibWFya2VySWRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlib29sZWFuIERFUF9WQUxfVkFMVUVfREVGQVVMVCA9IGZhbHNlOwotCVN0cmluZyBGQUNFVCA9ICJmYWNldCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkFDRVRfSUQgPSJmYWNldElkIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWU2Y2JiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVzb3VyY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgdG8gYWNjZXNzIHRoZSBzdHJpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGx1Z2luLgotICogCi0gKiBTZWUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUsIGluIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnksIGZvciB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VDb25zdGFudHMgewotCS8vIEEgbWFya2VyIGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9BRERfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX0FERF9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBtYXJrZXIgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFzayBsaXN0LgotCVN0cmluZyBWQkZfRVhDX0NBTk5PVF9SRU1PVkVfTUFSS0VSID0gIlZCRl9FWENfQ0FOTk9UX1JFTU9WRV9NQVJLRVIiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotCVN0cmluZyBWQkZfRVhDX0lOVEVSTkFMID0gIlZCRl9FWENfSU5URVJOQUwiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gSWYgdGhlIHZhbGlkYXRvciBjYW5ub3QgYmUgbG9hZGVkIGJlY2F1c2UgaXQgZGlkbid0IHNwZWNpZnkgYSBoZWxwZXIKLQlTdHJpbmcgVkJGX0VYQ19IRUxQRVJfTUlTU0lORyA9ICJWQkZfRVhDX0hFTFBFUl9NSVNTSU5HIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGxvYWRlZCBiZWNhdXNlIGl0cyBoZWxwZXIgY2Fubm90IGJlIGxvYWRlZAotCVN0cmluZyBWQkZfRVhDX0hFTFBFUl9DQU5OT1RMT0FEID0gIlZCRl9FWENfSEVMUEVSX0NBTk5PVExPQUQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gQSBqYXZhLmxhbmcuUnVudGltZSBlcnJvciBoYXMgb2NjdXJlZCBkdXJpbmcgdGhlIGJ1aWxkLgotCVN0cmluZyBWQkZfRVhDX1JVTlRJTUUgPSAiVkJGX0VYQ19SVU5USU1FIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSAiVmFsaWRhdG9yIiBleHRlbnNpb24gcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwbHVnaW4ueG1sIGZpbGUuCi0JU3RyaW5nIFZCRl9FWENfTUlTU0lOR19WQUxJREFUT1JfRVAgPSAiVkJGX0VYQ19NSVNTSU5HX1ZBTElEQVRPUl9FUCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGludmFsaWQgdHlwZSBmaWx0ZXIgaW4gdGhlaXIgcGx1Z2luLnhtbCBmaWxlLgotCS8vIGkuZS4sIGl0IGlzbid0IGFuIGluc3RhbmNlIG9mIElSZXNvdXJjZS4KLQlTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1RZUEVfRklMVEVSID0gIlZCRl9FWENfSU5WQUxJRF9UWVBFX0ZJTFRFUiI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBUaGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBoYXMgbWFkZSBhIG1pc3Rha2UgaW4gaXRzIHBsdWdpbi54bWwncyBwcm9qZWN0TmF0dXJlIHRhZwotCVN0cmluZyBWQkZfRVhDX01JU1NJTkdfUFJPSkVDVE5BVFVSRV9JRCA9ICJWQkZfRVhDX01JU1NJTkdfUFJPSkVDVE5BVFVSRV9JRCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBUaGUgdmFsaWRhdG9yIGV4dGVuc2lvbiBoYXMgbWFkZSBhIG1pc3Rha2UgaW4gaXRzIHBsdWdpbi54bWwncyBzeW50YXguCi0JU3RyaW5nIFZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMID0gIlZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIFRpdGxlIGZvciB0aGUgSVByb2dyZXNzTW9uaXRvci4KLQlTdHJpbmcgVkJGX1NUQVRVU19QUk9HUkVTU01PTklUT1JfVElUTEUgPSAiVkJGX1NUQVRVU19QUk9HUkVTU01PTklUT1JfVElUTEUiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gU3RhdHVzIGxpbmUgZm9yIHRoZSBJUHJvZ3Jlc3NNb25pdG9yCi0JU3RyaW5nIFZCRl9TVEFUVVNfSU5JVElBTElaSU5HID0gIlZCRl9TVEFUVVNfSU5JVElBTElaSU5HIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSB1c2VyIGhhcyBjYW5jZWxsZWQgdmFsaWRhdGlvbiwgZWFjaCB2YWxpZGF0b3IgbWlnaHQgaGF2ZSBjbGVhbnVwIHRvIGRvLiBUaGlzIG1lc3NhZ2UKLQkvLyBpcyBzaG93biB0byB0ZWxsIHRoZSB1c2VyIHdoaWNoIHZhbGlkYXRvciBpcyBiZWluZyBjbGVhbmVkIHVwIGF0IHRoZSBtb21lbnQuCi0JU3RyaW5nIFZCRl9TVEFUVVNfVkFMSURBVE9SX0NMRUFOVVAgPSAiVkJGX1NUQVRVU19WQUxJREFUT1JfQ0xFQU5VUCI7IC8vJE5PTi1OTFMtMSQgCi0KLQkvLyBJZiB0aGUgdXNlciBjYW5jZWxsZWQgdmFsaWRhdGlvbiwgcmVtb3ZlIGFsbCBvZiB0aGUgdmFsaWRhdG9yJ3MgdGFza3MgZnJvbSB0aGUgdGFzayBsaXN0LCBhbmQKLQkvLyBwdXQgYW4gZW50cnkgc2F5aW5nIHRoYXQgdmFsaWRhdGlvbiBvbiB7cHJvamVjdH0gdXNpbmcge3ZhbGlkYXRvcn0gd2FzIGNhbmNlbGxlZC4KLQlTdHJpbmcgVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCA9ICJWQkZfU1RBVFVTX1ZBTElEQVRPUl9URVJNSU5BVEVEIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIEJlZm9yZSBhIHZhbGlkYXRvciBpcyBiZWd1biwgdGhpcyBtZXNzYWdlIGluZm9ybXMgdGhlIHVzZXIgdGhhdCB2YWxpZGF0aW9uLCB1c2luZyBhCi0JLy8gcGFydGljdWxhciB2YWxpZGF0b3IsIGhhcyBiZWd1bgotCVN0cmluZyBWQkZfU1RBVFVTX1NUQVJUSU5HX1ZBTElEQVRJT04gPSAiVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIEFmdGVyIGEgdmFsaWRhdG9yIGlzIGZpbmlzaGVkLCB0aGlzIG1lc3NhZ2UgaW5mb3JtcyB0aGUgdXNlciB0aGF0IHZhbGlkdGFpb24sIHVzaW5nIGEKLQkvLyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgaGFzIGNvbXBsZXRlZC4KLQlTdHJpbmcgVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTiA9ICJWQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIGEgdmFsaWRhdG9yIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCB0aGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCVN0cmluZyBWQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFkgPSAiVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZIjsgLy8kTk9OLU5MUy0xJCAKLQotCS8vIElmIHRoZSBidWlsZCdzIGdldERlbHRhKGdldFByb2plY3QoKSkgbWV0aG9kIHJldHVybnMgbnVsbCwgbGV0IHRoZSB1c2VyIGtub3cgdGhhdCBhIGZ1bGwKLQkvLyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlcmUncyBubyBkZWx0YSBpbmZvcm1hdGlvbi4KLQlTdHJpbmcgVkJGX1NUQVRVU19OVUxMX0RFTFRBID0gIlZCRl9TVEFUVVNfTlVMTF9ERUxUQSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTlVMTF9OQU1FID0gIlZCRl9FWENfU1lOVEFYX05VTExfTkFNRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU1lOVEFYX05PX0hFTFBFUiA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVIiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfQ0xBU1MgPSAiVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX0NMQVNTIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRSA9ICJWQkZfRVhDX1NZTlRBWF9OT19IRUxQRVJfVEhST1dBQkxFIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1JVTiA9ICJWQkZfRVhDX1NZTlRBWF9OT19WQUxfUlVOIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19TWU5UQVhfTk9fVkFMX0NMQVNTID0gIlZCRl9FWENfU1lOVEFYX05PX1ZBTF9DTEFTUyI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU1lOVEFYX05PX1ZBTF9USFJPV0FCTEUgPSAiVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU1lOVEFYX05PX1ZBTF9OVUxMID0gIlZCRl9FWENfU1lOVEFYX05PX1ZBTF9OVUxMIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFID0gIlZCRl9FWENfSU5WQUxJRF9SRVNPVVJDRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19OVUxMQ1JFQVRFID0gIlZCRl9FWENfTlVMTENSRUFURSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfTlVMTFNBVkUgPSAiVkJGX0VYQ19OVUxMU0FWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfU0FWRSA9ICJWQkZfRVhDX1NBVkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX05VTExSRVRSSUVWRSA9ICJWQkZfRVhDX05VTExSRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIFZCRl9FWENfUkVUUklFVkUgPSAiVkJGX0VYQ19SRVRSSUVWRSI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX0VYQ19CQURWTUQgPSAiVkJGX0VYQ19CQURWTUQiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09QRU5QUkogPSAiVkJGX0VYQ19PUEVOUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19FWElTVFBSSiA9ICJWQkZfRVhDX0VYSVNUUFJKIjsgLy8kTk9OLU5MUy0xJCAKLQlTdHJpbmcgVkJGX0VYQ19CQURQUkogPSAiVkJGX0VYQ19CQURQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX01VTFRJUFJKID0gIlZCRl9FWENfTVVMVElQUkoiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0JBRFZBTCA9ICJWQkZfRVhDX0JBRFZBTCI7IC8vJE5PTi1OTFMtMSQgCi0KLQlTdHJpbmcgVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19TVEFSVF9SRU1PVklOR19PTERfTUVTU0FHRVMiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMgPSAiVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTIjsgLy8kTk9OLU5MUy0xJCAKLQotCVN0cmluZyBWQkZfVEFTS19XQVJOX01FU1NBR0VfTElNSVRfVkFMID0gIlZCRl9UQVNLX1dBUk5fTUVTU0FHRV9MSU1JVF9WQUwiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFZCRl9WQUxJREFUSU9OX0pPQl9NU0cgPSAiVkJGX1ZBTElEQVRJT05fSk9CX01TRyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVWID0gIlZCRl9FWENfRElTQUJMRVYiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX0RJU0FCTEVIID0gIlZCRl9FWENfRElTQUJMRUgiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfRVhDX09SUEhBTl9JVkFMSURBVE9SID0gIlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IiOyAvLyROT04tTkxTLTEkIAotCi0JU3RyaW5nIFZCRl9TVEFUVVNfTE9PS0lORyA9ICJWQkZfU1RBVFVTX0xPT0tJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX0xPT0tJTkdET05FID0gIlZCRl9TVEFUVVNfTE9PS0lOR0RPTkUiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HID0gIlZCRl9TVEFUVVNfUkVNT1ZJTkciOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSA9ICJWQkZfU1RBVFVTX1JFTU9WSU5HRE9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0JU3RyaW5nIFZCRl9XUk9OR19DT05URVhUX0ZPUl9ERUxFR0FURSA9ICJWQkZfV1JPTkdfQ09OVEVYVF9GT1JfREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9OT19ERUxFR0FURSA9ICJWQkZfTk9fREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZCRl9DQU5OT1RfSU5TVEFOVElBVEVfREVMRUdBVEUgPSAiVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSI7IC8vJE5PTi1OTFMtMSQgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNGVmMjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJldHJpZXZlcyB0aGUgU3RyaW5ncyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlIGFwcHJvcHJpYXRlIGZvciB0aGUgbWFjaGluZSdzIExvY2FsZS4KLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0JLy9UT0RPIE1ha2UgdGhpcyBjbGFzcyBmaW5hbCBvbmNlIHRoZSBwdWJsaWMgUmVzb3VyY2VIYW5kbGVyIGhhcyBiZWVuIGRlbGV0ZWQuCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgX2J1bmRsZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VIYW5kbGVyKCkgewotCQkvL1RPRE8gTWFrZSB0aGlzIG1ldGhvZCBwcml2YXRlIG9uY2UgdGhlIHB1YmxpYyBSZXNvdXJjZUhhbmRsZXIgaGFzIGJlZW4gZGVsZXRlZC4KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZXMsIGFzIGlkZW50aWZpZWQgYnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJaWYgKF9idW5kbGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlfYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZhbGlkYXRpb25QbHVnaW4uZ2V0QnVuZGxlTmFtZSgpKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlfYnVuZGxlID0gbnVsbDsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXIuZ2V0QnVuZGxlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJDYW5ub3QgZmluZCBidW5kbGUgIiArIFZhbGlkYXRpb25QbHVnaW4uZ2V0QnVuZGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9idW5kbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoKTsKLQkJCWlmIChidW5kbGUgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLmludGVybmFsLlJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZykiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUZXh0KCJSZXNvdXJjZSBidW5kbGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJfQotCQkJCXJldHVybiBrZXk7Ci0JCQl9Ci0KLQkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMudWkuUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiQ2Fubm90IGZpbmQgbWVzc2FnZSBpZCAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2Uoa2V5KSwgcGFybXMpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcsIFN0cmluZ1tdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiQ2Fubm90IGZpbmQgbWVzc2FnZSBpZCAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nLCBTdHJpbmdbXSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoIkNhbm5vdCBmb3JtYXQgbWVzc2FnZSBpZCAiICsga2V5ICsgIiB3aXRoICIgKyBwYXJtcy5sZW5ndGggKyAiIHBhcmFtZXRlcnMuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UYXNrTGlzdFV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVGFza0xpc3RVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjA5NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9UYXNrTGlzdFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgY2FsbGVkIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBUaGlzIHNpbmdsZXRvbiBpbnRlcmFjdHMgd2l0aCB0aGUgZWNsaXBzZSB3b3JrYmVuY2gncyBUYXNrIGxpc3QuIFRhc2tMaXN0VXRpbGl0eSBhZGRzIGFuZCByZW1vdmVzCi0gKiB0YXNrcyBmcm9tIHRoZSBsaXN0LgotICogCi0gKiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBvciBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIE1hbnkKLSAqIHJlc291cmNlIGRlbHRhcyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdFV0aWxpdHkgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVBUSF9JTkZJTklURSA9IElSZXNvdXJjZS5ERVBUSF9JTkZJTklURTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERVBUSF9aRVJPID0gSVJlc291cmNlLkRFUFRIX1pFUk87Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUID0gInRhcmdldE9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJTWFya2VyW10gTk9fTUFSS0VSUyA9IG5ldyBJTWFya2VyWzBdOwotCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRSb290KCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaGVyZSBmb3IgdXNlIGJ5IHRoZSBTQUJFUiB2YWxpZGF0b3IncyByZXBvcnRlciBpbnN0YW5jZSBPTkxZLiBEbyBub3QgdXNlLiBTZWUKLQkgKiBkZWZlY3QgMjYwMTQ0IGZvciBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1hcmtlciBzZXRQcmlvcml0eShJTWFya2VyIGl0ZW0sIGludCBwcmlvcml0eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXAgYXR0cmliID0gaXRlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYi5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIocHJpb3JpdHkpKTsKLQkJaXRlbS5zZXRBdHRyaWJ1dGVzKGF0dHJpYik7Ci0JCXJldHVybiBpdGVtOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWFya2VyIGFkZFRhc2soU3RyaW5nIHBsdWdpbklkLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgbWFya2VyTmFtZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSB8fCAoIXJlc291cmNlLmV4aXN0cygpKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBnZXRTZXZlcml0eShtYXJrZXJUeXBlKTsKLQotCQkvLyBBbGxvdyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgdGFzayBsaXN0LgotCQkvLyBQcmlvciB0byBhIGZ1bGwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwgcmVtb3ZlIGFsbCBtZXNzYWdlcyBvd25lZAotCQkvLyBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0JCS8vIFByaW9yIHRvIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsIHJlbW92ZSBhbGwgbWVzc2FnZXMsCi0JCS8vIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLCBvd25lZCBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMgaW52b2tlZC4KLQkJLy8gCi0JCS8vIEl0IGlzIHVwIHRvIHRoZSB2YWxpZGF0b3IgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IGFkZGluZyB0aGUgc2FtZSBtZXNzYWdlCi0JCS8vIGluIG1vcmUgdGhhbiBvbmUgcGxhY2UsIGFuZCBhbHNvIHRvIGNsZWFyIG91dCBhbnkgb2xkIG1lc3NhZ2VzIHdoaWNoIGFyZSBub3QgY2xlYXJlZAotCQkvLyBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JCUlNYXJrZXIgaXRlbSA9IG51bGw7Ci0JCWlmKG1hcmtlck5hbWUgIT0gbnVsbCAmJiBtYXJrZXJOYW1lLmxlbmd0aCgpID4wICkKLQkJCSBpdGVtID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKG1hcmtlck5hbWUpOyAvLyBhZGQgYSB2YWxpZGF0aW9uIG1hcmtlcgotCQllbHNlCi0JCSAgICAgaXRlbSA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihWQUxJREFUSU9OX01BUktFUik7IC8vIGFkZCBhIHZhbGlkYXRpb24gbWFya2VyCi0KLQkJLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlcGxhY2UgdGhlIG11bHRpcGxlIHNldEF0dHJpYnV0ZQotCQkvLyBjYWxscyBhYm92ZSB3aXRoIGEgc2luZ2xlIHNldEF0dHJpYnV0ZXMgY2FsbC4KLQkJYm9vbGVhbiBvZmZzZXRTZXQgPSAoKG9mZnNldCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpICYmIChsZW5ndGggIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSk7Ci0JCWludCBzaXplID0gKG9mZnNldFNldCkgPyAxMCA6IDg7IC8vIGFkZCBDSEFSX1NUQVJULCBDSEFSX0VORCBvbmx5IGlmIHRoZSBvZmZzZXQgaXMgc2V0LiBJZgotCQkvLyB0aGUgb2Zmc2V0IGlzIHNldCwgaXQgdGFrZXMgcHJlY2VuZGVuY2Ugb3ZlciB0aGUgbGluZQotCQkvLyBudW1iZXIuIChlY2xpcHNlJ3MgcnVsZSwgbm90IG1pbmUuKQotCQlTdHJpbmdbXSBhdHRyaWJOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCU9iamVjdFtdIGF0dHJpYlZhbHVlcyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0KLQkJLy8gVmVyeSBmaXJzdCB0aGluZywgYWRkIHRoZSBvd25lci4gVGhhdCB3YXksIGlmIHRoZSBjb2RlIGRpZXMKLQkJLy8gYmVmb3JlIHRoaW5ncyBhcmUgcGVyc2lzdGVkLCBob3BlZnVsbHkgdGhpcyBtYXJrZXIgd2lsbCBiZSBwZXJzaXN0ZWQuCi0JCS8vIEhvcGVmdWxseSwgZWNsaXBzZSBXSUxMIHBlcnNpc3QgdGhpcyBmaWVsZCwgYXMgcmVxdWVzdGVkLgotCQlhdHRyaWJOYW1lc1swXSA9IFZBTElEQVRJT05fTUFSS0VSX09XTkVSOwotCQlhdHRyaWJWYWx1ZXNbMF0gPSBwbHVnaW5JZDsKLQkJYXR0cmliTmFtZXNbMV0gPSBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWTsgLy8gdGhpcyB2YWxpZGF0aW9uIHNldmVyaXR5IGlzIHN0b3JlZCwgaW4KLQkJLy8gYWRkaXRpb24gdG8gdGhlIG1hcmtlciBzZXZlcml0eSwgdG8gZW5hYmxlCi0JCS8vIG1vcmUgdGhhbiBvbmUgc2V2ZXJpdHkgb2YgbWVzc2FnZSB0byBiZQotCQkvLyBkaXNwbGF5ZWQuIGUuZy4gRVJST1IgfCBXQVJOSU5HICh1c2luZwotCQkvLyBiaW5hcnkgT1IpLiBUaGUgSU1hcmtlciBjb25zdGFudHMgYXJlCi0JCS8vIHJlZ3VsYXIgZGVjaW1hbCBjb25zdGFudHMuCi0JCWF0dHJpYlZhbHVlc1sxXSA9IG5ldyBJbnRlZ2VyKG1hcmtlclR5cGUpOwotCQlhdHRyaWJOYW1lc1syXSA9IFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVDsgLy8gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtZXNzYWdlcyB3aGljaAotCQkvLyBhcmUgcmVnaXN0ZXJlZCBvbiBhbiBJUmVzb3VyY2UsIGJ1dAotCQkvLyBhZ2FpbnN0IGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cwotCQlhdHRyaWJWYWx1ZXNbMl0gPSAoKHRhcmdldE9iamVjdE5hbWUgPT0gbnVsbCkgPyAiIiA6IHRhcmdldE9iamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzNdID0gVkFMSURBVElPTl9NQVJLRVJfR1JPVVA7Ci0JCWF0dHJpYlZhbHVlc1szXSA9ICgoZ3JvdXBOYW1lID09IG51bGwpID8gIiIgOiBncm91cE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYk5hbWVzWzRdID0gSU1hcmtlci5NRVNTQUdFOwotCQlhdHRyaWJWYWx1ZXNbNF0gPSBtZXNzYWdlOwotCQlhdHRyaWJOYW1lc1s1XSA9IFZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRDsKLQkJYXR0cmliVmFsdWVzWzVdID0gbWVzc2FnZUlkOwotCi0JCWF0dHJpYk5hbWVzWzZdID0gSU1hcmtlci5TRVZFUklUWTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLAotCQkvLyBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJYXR0cmliVmFsdWVzWzZdID0gbmV3IEludGVnZXIoc2V2ZXJpdHkpOwotCQl0cnkgewotCQkJLy8gSWYgdGhlIGxvY2F0aW9uIGlzIGEgbGluZSBudW1iZXIsIHN0b3JlIGl0IGFzIGEgbGluZSBudW1iZXIKLQkJCUludGVnZXIgbGluZU51bWJlciA9IEludGVnZXIudmFsdWVPZihsb2NhdGlvbik7Ci0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTElORV9OVU1CRVI7Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsaW5lTnVtYmVyOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBPdGhlcndpc2UsIHN0b3JlIGl0IGFzIGEgdGV4dCBsb2NhdGlvbgotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxPQ0FUSU9OOwotCQkJYXR0cmliVmFsdWVzWzddID0gbG9jYXRpb247Ci0JCX0KLQotCQlpZiAob2Zmc2V0U2V0KSB7Ci0JCQlhdHRyaWJOYW1lc1s4XSA9IElNYXJrZXIuQ0hBUl9TVEFSVDsKLQkJCWF0dHJpYlZhbHVlc1s4XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCk7Ci0JCQlhdHRyaWJOYW1lc1s5XSA9IElNYXJrZXIuQ0hBUl9FTkQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOV0gPSBuZXcgSW50ZWdlcihvZmZzZXQgKyBsZW5ndGgpOwotCQl9Ci0KLQkJaXRlbS5zZXRBdHRyaWJ1dGVzKGF0dHJpYk5hbWVzLCBhdHRyaWJWYWx1ZXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkgfHwgKCFyZXNvdXJjZS5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gZ2V0U2V2ZXJpdHkobWFya2VyVHlwZSk7Ci0KLQkJLy8gQWxsb3cgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIHRhc2sgbGlzdC4KLQkJLy8gUHJpb3IgdG8gYSBmdWxsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQKLQkJLy8gYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLgotCQkvLyBQcmlvciB0byBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbCByZW1vdmUgYWxsIG1lc3NhZ2VzLAotCQkvLyBvbiBlYWNoIG9mIHRoZSBjaGFuZ2VkIHJlc291cmNlcywgb3duZWQgYnkgYSB2YWxpZGF0b3IgYmVmb3JlIGl0IGlzIGludm9rZWQuCi0JCS8vIAotCQkvLyBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdG9yIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCBhZGRpbmcgdGhlIHNhbWUgbWVzc2FnZQotCQkvLyBpbiBtb3JlIHRoYW4gb25lIHBsYWNlLCBhbmQgYWxzbyB0byBjbGVhciBvdXQgYW55IG9sZCBtZXNzYWdlcyB3aGljaCBhcmUgbm90IGNsZWFyZWQKLQkJLy8gYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCQlJTWFya2VyIGl0ZW0gPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoVkFMSURBVElPTl9NQVJLRVIpOyAvLyBhZGQgYSB2YWxpZGF0aW9uIG1hcmtlcgotCi0JCS8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCByZXBsYWNlIHRoZSBtdWx0aXBsZSBzZXRBdHRyaWJ1dGUKLQkJLy8gY2FsbHMgYWJvdmUgd2l0aCBhIHNpbmdsZSBzZXRBdHRyaWJ1dGVzIGNhbGwuCi0JCWJvb2xlYW4gb2Zmc2V0U2V0ID0gKChvZmZzZXQgIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSAmJiAobGVuZ3RoICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkpOwotCQlpbnQgc2l6ZSA9IChvZmZzZXRTZXQpID8gMTAgOiA4OyAvLyBhZGQgQ0hBUl9TVEFSVCwgQ0hBUl9FTkQgb25seSBpZiB0aGUgb2Zmc2V0IGlzIHNldC4gSWYKLQkJLy8gdGhlIG9mZnNldCBpcyBzZXQsIGl0IHRha2VzIHByZWNlbmRlbmNlIG92ZXIgdGhlIGxpbmUKLQkJLy8gbnVtYmVyLiAoZWNsaXBzZSdzIHJ1bGUsIG5vdCBtaW5lLikKLQkJU3RyaW5nW10gYXR0cmliTmFtZXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlPYmplY3RbXSBhdHRyaWJWYWx1ZXMgPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vIFZlcnkgZmlyc3QgdGhpbmcsIGFkZCB0aGUgb3duZXIuIFRoYXQgd2F5LCBpZiB0aGUgY29kZSBkaWVzCi0JCS8vIGJlZm9yZSB0aGluZ3MgYXJlIHBlcnNpc3RlZCwgaG9wZWZ1bGx5IHRoaXMgbWFya2VyIHdpbGwgYmUgcGVyc2lzdGVkLgotCQkvLyBIb3BlZnVsbHksIGVjbGlwc2UgV0lMTCBwZXJzaXN0IHRoaXMgZmllbGQsIGFzIHJlcXVlc3RlZC4KLQkJYXR0cmliTmFtZXNbMF0gPSBWQUxJREFUSU9OX01BUktFUl9PV05FUjsKLQkJYXR0cmliVmFsdWVzWzBdID0gcGx1Z2luSWQ7Ci0JCWF0dHJpYk5hbWVzWzFdID0gVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFk7IC8vIHRoaXMgdmFsaWRhdGlvbiBzZXZlcml0eSBpcyBzdG9yZWQsIGluCi0JCS8vIGFkZGl0aW9uIHRvIHRoZSBtYXJrZXIgc2V2ZXJpdHksIHRvIGVuYWJsZQotCQkvLyBtb3JlIHRoYW4gb25lIHNldmVyaXR5IG9mIG1lc3NhZ2UgdG8gYmUKLQkJLy8gZGlzcGxheWVkLiBlLmcuIEVSUk9SIHwgV0FSTklORyAodXNpbmcKLQkJLy8gYmluYXJ5IE9SKS4gVGhlIElNYXJrZXIgY29uc3RhbnRzIGFyZQotCQkvLyByZWd1bGFyIGRlY2ltYWwgY29uc3RhbnRzLgotCQlhdHRyaWJWYWx1ZXNbMV0gPSBuZXcgSW50ZWdlcihtYXJrZXJUeXBlKTsKLQkJYXR0cmliTmFtZXNbMl0gPSBWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1Q7IC8vIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWVzc2FnZXMgd2hpY2gKLQkJLy8gYXJlIHJlZ2lzdGVyZWQgb24gYW4gSVJlc291cmNlLCBidXQKLQkJLy8gYWdhaW5zdCBkaWZmZXJlbnQgdGFyZ2V0IG9iamVjdHMKLQkJYXR0cmliVmFsdWVzWzJdID0gKCh0YXJnZXRPYmplY3ROYW1lID09IG51bGwpID8gIiIgOiB0YXJnZXRPYmplY3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1szXSA9IFZBTElEQVRJT05fTUFSS0VSX0dST1VQOwotCQlhdHRyaWJWYWx1ZXNbM10gPSAoKGdyb3VwTmFtZSA9PSBudWxsKSA/ICIiIDogZ3JvdXBOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1s0XSA9IElNYXJrZXIuTUVTU0FHRTsKLQkJYXR0cmliVmFsdWVzWzRdID0gbWVzc2FnZTsKLQkJYXR0cmliTmFtZXNbNV0gPSBWQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQ7Ci0JCWF0dHJpYlZhbHVlc1s1XSA9IG1lc3NhZ2VJZDsKLQotCQlhdHRyaWJOYW1lc1s2XSA9IElNYXJrZXIuU0VWRVJJVFk7IC8vIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywKLQkJLy8gSU1hcmtlci5TRVZFUklUWV9JTkZPCi0JCWF0dHJpYlZhbHVlc1s2XSA9IG5ldyBJbnRlZ2VyKHNldmVyaXR5KTsKLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBsb2NhdGlvbiBpcyBhIGxpbmUgbnVtYmVyLCBzdG9yZSBpdCBhcyBhIGxpbmUgbnVtYmVyCi0JCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YobG9jYXRpb24pOwotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxJTkVfTlVNQkVSOwotCQkJYXR0cmliVmFsdWVzWzddID0gbGluZU51bWJlcjsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gT3RoZXJ3aXNlLCBzdG9yZSBpdCBhcyBhIHRleHQgbG9jYXRpb24KLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MT0NBVElPTjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxvY2F0aW9uOwotCQl9Ci0KLQkJaWYgKG9mZnNldFNldCkgewotCQkJYXR0cmliTmFtZXNbOF0gPSBJTWFya2VyLkNIQVJfU1RBUlQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOF0gPSBuZXcgSW50ZWdlcihvZmZzZXQpOwotCQkJYXR0cmliTmFtZXNbOV0gPSBJTWFya2VyLkNIQVJfRU5EOwotCQkJYXR0cmliVmFsdWVzWzldID0gbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKTsKLQkJfQotCi0JCWl0ZW0uc2V0QXR0cmlidXRlcyhhdHRyaWJOYW1lcywgYXR0cmliVmFsdWVzKTsKLQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBvbmUgb2YgdGhlIFNldmVyaXR5RW51bSBzZXZlcml0aWVzLCByZXR1cm4gdGhlIElNYXJrZXIgc2V2ZXJpdHkgaW50IHRoYXQgaXMgaXRzCi0JICogZXF1aXZhbGVudC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMgZm9yIHRoZSBTYWJlclJlcG9ydGVyLiBObyBvbmUgb3RoZXIgdGhhbiBUYXNrTGlzdFV0aWxpdHksIG9yIHRoZQotCSAqIFNhYmVyUmVwb3J0ZXIsIHNob3VsZCB1c2UgdGhpcyBtZXRob2QhCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJc3dpdGNoIChzZXZlcml0eUVudW1WYWx1ZSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfRVJST1I7Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5BTExfTUVTU0FHRVMpIDoKLQkJCWNhc2UgKElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HKSA6Ci0JCQlkZWZhdWx0IDogewotCQkJCS8vIGFzc3VtZSBpdCdzIGEgd2FybmluZy4KLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlcHRoKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIERFUFRIX0lORklOSVRFOyAvLyBERVBUSF9JTkZJTklURSBtZWFucyBnZXQgdGhpcyBwcm9qZWN0J3MgbWFya2VycywgYW5kIHRoZQotCQkJLy8gbWFya2VycyBiZWxvbmdpbmcgdG8gdGhlIHByb2plY3QncyBjaGlsZHJlbi4KLQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQkvLyBOZWVkZWQgZm9yIHRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2hlbiBpdCBjaGVja3MgZm9yIG9ycGhhbiB0YXNrcy4KLQkJCXJldHVybiBERVBUSF9JTkZJTklURTsgLy8gREVQVEhfSU5GSU5JVEUgbWVhbnMgZ2V0IGFsbCBvZiB0aGUgbWFya2VycyBpbiB0aGUgd29ya3NwYWNlCi0JCX0KLQotCQlyZXR1cm4gREVQVEhfWkVSTzsgLy8gREVQVEhfWkVSTyBtZWFucyBqdXN0IHRoaXMgcmVzb3VyY2UsIG5vdCBpdHMgY2hpbGRyZW4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoaW50IHNldmVyaXR5LCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCB0aGlzIHByb2plY3QncyBtYXJrZXJzLCBhbmQgdGhlIG1hcmtlcnMKLQkJLy8gYmVsb25naW5nIHRvIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgc2V2ZXJpdHkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzZXZlcml0eSkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBzZXZlcml0eSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWFya2VyIGlzIG93bmVkIGJ5IHRoZSBvd25lcklkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc093bmVyKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgb3duZXJJZCkgewotCQl0cnkgewotCQkJT2JqZWN0IG93bmVyID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQlpZiAoKG93bmVyID09IG51bGwpIHx8ICEob3duZXIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJLy8gVGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aWxsIHJlbW92ZSBhbnkgInVub3duZWQiIHZhbGlkYXRpb24gbWFya2Vycy4KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXJldHVybiAoKFN0cmluZykgb3duZXIpLmVxdWFscyhvd25lcklkKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5pc093bmVyKElNYXJrZXIsIG93bmVySWQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5LCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIHRlbXBNYXJrZXJzID0gbnVsbDsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQl0cnkgewotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoVkFMSURBVElPTl9NQVJLRVIsIHRydWUsIGRlcHRoKTsgLy8gZmFsc2UgbWVhbnMKLQkJCQkvLyBvbmx5IGNvbnNpZGVyCi0JCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJLy8gbm90IHZhcmlhbnRzCi0JCQkJLy8gb2YKLQkJCQkvLyBQUk9CTEVNX01BUktFUi4KLQkJCQkvLyBTaW5jZSBhZGRUYXNrCi0JCQkJLy8gb25seSBhZGRzCi0JCQkJLy8gUFJPQkxFTV9NQVJLRVIsCi0JCQkJLy8gd2UgZG9uJ3QgbmVlZAotCQkJCS8vIHRvIGNvbnNpZGVyCi0JCQkJLy8gaXRzIHN1YnR5cGVzLgotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJCXJldHVybiBOT19NQVJLRVJTOwotCQkJfQotCi0JCQkvLyBOb3cgZmlsdGVyIGluIHRoZSBtYXJrZXJzLCBiYXNlZCBvbiBzZXZlcml0eSB0eXBlLgotCQkJaWYgKGFsbE1hcmtlcnMubGVuZ3RoICE9IDApIHsKLQkJCQl0ZW1wTWFya2VycyA9IG5ldyBJTWFya2VyW2FsbE1hcmtlcnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBhbGxNYXJrZXJzW2ldOwotCQkJCQlJbnRlZ2VyIGZpbHRlclNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkpOwotCQkJCQlpZiAoZmlsdGVyU2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJCQkJLy8gb2RkLi4ubWFya2VyIHdhc24ndCBjcmVhdGVkIGNvcnJlY3RseS4gSG93IGNvdWxkIHRoaXMgaGFwcGVuPwotCQkJCQkJLy8gRGVmYXVsdCB0byB0aGUgY3VycmVudCBzZXZlcml0eSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgotCQkJCQkJdHJ5IHsKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIGdldFNldmVyaXR5KHNldmVyaXR5KSk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LCBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJCX0KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwgSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoKHNldmVyaXR5ICYgZmlsdGVyU2V2ZXJpdHkuaW50VmFsdWUoKSkgPT0gMCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdGVtcE1hcmtlcnNbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwgSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmFsaWRDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB2YWxpZE1hcmtlcnMgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTWFya2VycywgMCwgdmFsaWRNYXJrZXJzLCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHZhbGlkTWFya2VyczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZU93bmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXttZXNzYWdlT3duZXJ9LCBnZXREZXB0aChyZXNvdXJjZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG1lc3NhZ2VPd25lcnMpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVycywgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycywgaW50IGRlcHRoKSB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBJTWVzc2FnZS5BTExfTUVTU0FHRVMsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHRlbXAgPSBuZXcgSU1hcmtlclttYXJrZXJzLmxlbmd0aF07Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IG93bmVyID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIgdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lc3NhZ2VPd25lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VPd25lciA9IG1lc3NhZ2VPd25lcnNbal07Ci0JCQkJCWlmICgoKFN0cmluZykgb3duZXIpLmVxdWFscyhtZXNzYWdlT3duZXIpKSB7Ci0JCQkJCQl0ZW1wW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBTdHJpbmdbXSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQkJfQotCi0JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgdmFsaWRhdGlvbiB0YXNrcyBmcm9tIHRoZSByZXNvdXJjZS4gSWYgZGVwdGggaXMgSU5GSU5JVEUsIGNoaWxkCi0JICogdGFza3MgYXJlIHJldHVybmVkIGFzIHdlbGwuIE9ubHkgdGhlIHRhc2tzIHdoaWNoIGFyZSBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VPd25lciwgYW5kCi0JICogYXBwbHkgdG8gdGhlIG5hbWVkIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCAob2JqZWN0TmFtZSkgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZU93bmVyID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCUlNYXJrZXJbXSB2YWxpZExpc3QgPSBudWxsOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVyLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzICE9IG51bGwpIHsKLQkJCXZhbGlkTGlzdCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJCS8vIElmIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSByZXNvdXJjZSwgcmVtb3Zpbmcgb25lCi0JCQkJLy8gdGFyZ2V0J3MKLQkJCQkvLyBtZXNzYWdlcyBzaG91bGQgbm90IHJlbW92ZSB0aGUgb3RoZXIgdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotCQkJCWlmIChvYmplY3ROYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IHRhcmdldE9iamVjdCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUKTsKLQkJCQkJaWYgKCh0YXJnZXRPYmplY3QgPT0gbnVsbCkgfHwgISh0YXJnZXRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8ICEoKChTdHJpbmcpIHRhcmdldE9iamVjdCkuZXF1YWxzKG9iamVjdE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZ3JvdXBOYW1lICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGdyb3VwID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9HUk9VUCk7Ci0JCQkJCWlmICgoZ3JvdXAgPT0gbnVsbCkgfHwgIShncm91cCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgZ3JvdXApLmVxdWFscyhncm91cE5hbWUpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl2YWxpZExpc3RbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHJlc3VsdCA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZhbGlkTGlzdCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgcmVzb3VyY2UgYW5kIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIENvdWxkbid0IHJlbW92ZSB0aGUgdGFzayBmcm9tIHRoZSB0YXNrIGxpc3QgZm9yIHNvbWUgcmVhc29uLi4uCi0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hNb25pdG9yLnJlbW92ZUFsbE1lc3NhZ2VzKFN0cmluZ1tdLCBJUmVzb3VyY2UsIFN0cmluZykiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIHRhc2tzIGZyb20gdGhlIHJlc291cmNlLiBJZiB0aGUgcmVzb3VyY2UgaXMgYW4gSVByb2plY3QsIGFsbCB0YXNrcwotCSAqIGFyZSBhbHNvIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdCdzIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXJzLCBudWxsKTsgLy8gbnVsbCBtZWFucyByZW1vdmUgbWVzc2FnZXMgZnJvbSBhbGwgdGFyZ2V0Ci0JCS8vIG9iamVjdHMKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBuZXcgU3RyaW5nW117b3duZXJ9LCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdldERlcHRoKHJlc291cmNlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgbnVsbCwgZGVwdGgpOyAvLyBudWxsIG1lYW5zIG5vIGdyb3VwIG5hbWUKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZCB0YXNrcy4gRXZlcnkgdGFzawotCSAqIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwgd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVUYXNrU3Vic2V0KHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZCB0YXNrcy4gRXZlcnkgdGFzawotCSAqIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwgd2lsbCBiZSByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZW1vdmVUYXNrU3Vic2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgob3duZXJzID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSU1hcmtlcltdIGFsbFRhc2tzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIGdyb3VwTmFtZSwgZGVwdGgpOwotCQlpZiAoYWxsVGFza3MubGVuZ3RoID4gMCkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmRlbGV0ZU1hcmtlcnMoYWxsVGFza3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgd2hpY2ggYXJlIG93bmVkIGJ5ICJmcm9tIiB0byBtYWtlIHRoZWlyIG93bmVyICJ0byIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU93bmVyKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdXBkYXRlT3duZXIoZnJvbSwgdG8sIGdldFJvb3QoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgb24gdGhlIElSZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLiBBbGwgbWFya2VycwotCSAqIG93bmVkIGJ5ICJmcm9tIiBoYXZlIHRoZWlyIG93bmVyIHJlYXNzaWduZWQgdG8gInRvIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3duZXIoU3RyaW5nIGZyb20sIFN0cmluZyB0bywgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBvd25lZE1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIGZyb20pOwotCQlpZiAob3duZWRNYXJrZXJzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3duZWRNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG93bmVkTWFya2Vyc1tpXTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfT1dORVIsIHRvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVGltZUVudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1RpbWVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTU1Mjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVGltZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIHdoZW4gbG9nZ2luZyAiZWxhcHNlZCB0aW1lIiBpbmZvcm1hdGlvbiBhbmQgbm90aGluZyBlbHNlLiBJbnN0ZWFkIG9mCi0gKiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGV2ZXJ5IHRpbWUgaXQgaXMgbmVlZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgY3JlYXRlIGFuCi0gKiBpbnN0YW5jZSBhbmQgcmV1c2UgaXQuIFRoZSB0ZXh0IGluIHRoaXMgY2xhc3MgaXMgbmV2ZXIgdHJhbnNsYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFRpbWVFbnRyeSBleHRlbmRzIExvZ0VudHJ5IHsKLQlwcml2YXRlIFN0cmluZyBfdG9vbE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgX2RldGFpbHM7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lOwotCXByaXZhdGUgU3RyaW5nIF9zb3VyY2VJZDsKLQlwcml2YXRlIGludCBfZXhlY3V0aW9uTWFwOwotCi0JcHVibGljIFRpbWVFbnRyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgdG9vbCAoZS5nLiwgYSB2YWxpZGF0b3IsIGEgYnVpbGRlcikgd2hvc2UgdGltZSBpcyBtZWFzdXJlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xOYW1lKCkgewotCQlyZXR1cm4gX3Rvb2xOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRvb2xOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV90b29sTmFtZSA9IG5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBJZiB0aGVyZSBhcmUgYW55IGRldGFpbHMgdGhhdCBuZWVkIHRvIGJlIHJlY29yZGVkIGFib3V0IHRoZSB0b29sLCBzdWNoIGFzIHdoYXQgaW5wdXQgaXQgcnVucwotCSAqIG9uLCB0aGlzIGZpZWxkIHN0b3JlcyB0aGUgdmFsdWUuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgewotCQlyZXR1cm4gX2RldGFpbHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGV0YWlscyhTdHJpbmcgZCkgewotCQlfZGV0YWlscyA9IGQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHRvb2wgcmFuLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBfcHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX3Byb2plY3ROYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaWQgb2YgdGhlIGNvZGUgdGhhdCBsYXVuY2hlZCB0aGUgdG9vbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUlEKCkgewotCQlyZXR1cm4gX3NvdXJjZUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUlEKFN0cmluZyBpZCkgewotCQlfc291cmNlSWQgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBJZiwgaW4gYWRkaXRpb24gdG8gZWxhcHNlZCB0aW1lLCB0aGUgdG9vbCBuZWVkcyB0byB0cmFjayB0aGUgZXhlY3V0aW9uIHBhdGggb2YgYSBtZXRob2QsIHRoaXMKLQkgKiBmaWVsZCBzdG9yZXMgdGhlIGhleGFkZWNpbWFsIG51bWJlciB0aGF0IHRyYWNrcyB0aGUgcGF0aC4gU2VlIFZhbGlkYXRpb25CdWlsZGVyOjpidWlsZCBmb3IgYW4KLQkgKiBleGFtcGxlIHRoYXQgdXNlcyBhbiBleGVjdXRpb24gcGF0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4Y2VjdXRpb25NYXAoKSB7Ci0JCXJldHVybiBfZXhlY3V0aW9uTWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4ZWN1dGlvbk1hcChpbnQgbWFwKSB7Ci0JCV9leGVjdXRpb25NYXAgPSBtYXA7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIG9mIHRoZSBmaWVsZHMgYmFjayB0byB0aGVpciBpbml0aWFsIHNldHRpbmcgc28gdGhhdCB0aGlzIFRpbWVFbnRyeSBpbnN0YW5jZSBjYW4gYmUKLQkgKiByZXVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCV90b29sTmFtZSA9IG51bGw7Ci0JCV9kZXRhaWxzID0gbnVsbDsKLQkJX3Byb2plY3ROYW1lID0gbnVsbDsKLQkJX3NvdXJjZUlkID0gbnVsbDsKLQkJX2V4ZWN1dGlvbk1hcCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WVGhyZWFkTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WVGhyZWFkTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E3MzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVlRocmVhZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIChxdWV1ZSwgaW52b2tlLCBldGMuKSB0aGUgUnVubmFibGVzIHRoYXQgcGVyZm9ybSB0aGUgdmFsaWRhdGlvbiBmb3IgYQotICogcGFydGljdWxhciB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWVGhyZWFkTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVlRocmVhZE1hbmFnZXIgX21hbmFnZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNX09GX1JFU1RBUlQgPSA1OyAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdGhyZWFkCi0JLy8gc2hvdWxkIGF0dGVtcHQgdG8gaWdub3JlIGEgVGhyb3dhYmxlIGFuZAotCS8vIGNhcnJ5IG9uCi0KLQlwcml2YXRlIFRocmVhZCBfdmFsaWRhdGlvblRocmVhZCA9IG51bGw7IC8vIFRoaXMgdGhyZWFkIGNoZWNrcyBpZiB0aGUgY3VycmVudCBSdW5uYWJsZSBpcwotCS8vIGZpbmlzaGVkLCBhbmQgaWYgc28sIGxvYWRzIHRoZSBmaXJzdCBSdW5uYWJsZSBvZmYgb2YKLQkvLyB0aGUgcXVldWUgYW5kIHN0YXJ0cyBpdC4KLQl2b2xhdGlsZSBpbnQgcmVzdGFydCA9IDA7IC8vIGhvdyBtYW55IHRpbWVzIGhhcyB0aGUgdGhyZWFkIGJlZW4gcmVzdGFydGVkPwotCXZvbGF0aWxlIEpvYnMgX2pvYnMgPSBudWxsOwotCi0JcHJpdmF0ZSBWVGhyZWFkTWFuYWdlcigpIHsKLQkJX2pvYnMgPSBuZXcgSm9icygpOwotCi0JCS8vIFN0YXJ0IHRoZSB2YWxpZGF0aW9uIHRocmVhZCB0byBjaGVjayBmb3IgcXVldWVkIFZhbGlkYXRpb25PcGVyYXRpb24KLQkJUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocmVzdGFydCA+IE1BWF9OVU1fT0ZfUkVTVEFSVCkgewotCQkJCQkJCS8vIHNvbWV0aGluZyBoYXMgZ29uZSBzZXJpb3VzbHksIHNlcmlvdXNseSB3cm9uZwotCQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZUaHJlYWRNYW5hZ2VyOjp2YWxpZGF0aW9uUnVubmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllbnRyeS5zZXRUZXh0KCJyZXN0YXJ0ID0gIiArIHJlc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJCVJ1bm5hYmxlIGpvYiA9IGdldEpvYnMoKS5kZXF1ZXVlKCk7IC8vIElmIGN1cnJlbnRSdW5uYWJsZSBpcyBudWxsLCB0aGVyZSdzCi0JCQkJCQkvLyBub3RoaW5nIG9uIHRoZSBxdWV1ZS4gU2hvdWxkbid0Ci0JCQkJCQkvLyBoYXBwZW4gd2l0aCBhIHNlbWFwaG9yZS4KLQkJCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQkJCWdldEpvYnMoKS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCQkJCQkJam9iLnJ1bigpOwotCQkJCQkJCWdldEpvYnMoKS5zZXRBY3RpdmUoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBUaGlzIGV4Y2VwdGlvbiBpcyBhZGRlZCBhcyBGSU5FIGluc3RlYWQgb2YgU0VWRVJFIGJlY2F1c2UgaXQncyBub3QKLQkJCQkJCS8vIGltcHJvYmFibGUKLQkJCQkJCS8vIHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0JCQkJCQlyZXN0YXJ0Kys7Ci0JCQkJCQlnZXRKb2JzKCkuc2V0QWN0aXZlKGZhbHNlKTsKLQotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZUaHJlYWRNYW5hZ2VyOjp2YWxpZGF0aW9uUnVubmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkvL2RvIG5vdGhpbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlfdmFsaWRhdGlvblRocmVhZCA9IG5ldyBUaHJlYWQodmFsaWRhdGlvblJ1bm5hYmxlLCAiVmFsaWRhdGlvblRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCV92YWxpZGF0aW9uVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWVGhyZWFkTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoX21hbmFnZXIgPT0gbnVsbCkgewotCQkJX21hbmFnZXIgPSBuZXcgVlRocmVhZE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX21hbmFnZXI7Ci0JfQotCi0JSm9icyBnZXRKb2JzKCkgewotCQlyZXR1cm4gX2pvYnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcXVldWUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJZ2V0Sm9icygpLnF1ZXVlKHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIFJ1bm5hYmxlcyBoYXZlIGJlZW4gcnVuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLQkJcmV0dXJuIGdldEpvYnMoKS5pc0RvbmUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpvYnMgewotCQlwcml2YXRlIFZlY3RvciBfX2pvYnMgPSBudWxsOyAvLyBUaGUgcXVldWVkIFJ1bm5hYmxlcyB0aGF0IG5lZWQgdG8gYmUgcnVuLgotCQlwcml2YXRlIGJvb2xlYW4gX2lzQWN0aXZlID0gZmFsc2U7IC8vIElzIGEgam9iIGJlaW5nIHJ1biBpbiB0aGUgdmFsaWRhdGlvbiB0aHJlYWQ/Ci0KLQkJcHVibGljIEpvYnMoKSB7Ci0JCQlfX2pvYnMgPSBuZXcgVmVjdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcXVldWUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJCS8vIElmIHRoZXJlIGlzIGEgdGhyZWFkIHJ1bm5pbmcgYWxyZWFkeSwgdGhlbiBpdCBtdXN0IGZpbmlzaCBiZWZvcmUgYW5vdGhlciB2YWxpZGF0aW9uCi0JCQkvLyB0aHJlYWQgaXMgbGF1bmNoZWQsIG9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGNvdWxkIHJlZmxlY3QgdGhlIGxhc3QgdGhyZWFkCi0JCQkvLyBmaW5pc2hlZCwKLQkJCS8vIGluc3RlYWQgb2YgdGhlIGxhc3Qgc3RhdGUgb2YgY2hhbmdlcy4KLQotCQkJLy8gSGF2ZSB0byB3YWl0IGZvciB0aGUgY3VycmVudCBSdW5uYWJsZSB0byBmaW5pc2gsIHNvIGFkZCB0aGlzIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlCi0JCQlfX2pvYnMuYWRkKHJ1bm5hYmxlKTsKLQkJCW5vdGlmeUFsbCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBvcCB0aGUgUnVubmFibGUgb2ZmIG9mIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLQkJICovCi0JCXN5bmNocm9uaXplZCBSdW5uYWJsZSBkZXF1ZXVlKCkgewotCQkJd2hpbGUgKF9fam9icy5zaXplKCkgPT0gMCkgewotCQkJCXRyeSB7Ci0JCQkJCXdhaXQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9IC8vIEJsb2NrIG9uIHRoZSBzZW1hcGhvcmU7IGJyZWFrIHdoZW4gYSBqb2IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHF1ZXVlLgotCi0JCQlSdW5uYWJsZSBqb2IgPSBudWxsOwotCQkJaWYgKF9fam9icy5zaXplKCkgPiAwKSB7Ci0JCQkJam9iID0gKFJ1bm5hYmxlKSBfX2pvYnMuZ2V0KDApOwotCQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCQlfX2pvYnMucmVtb3ZlKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBqb2I7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCQlyZXR1cm4gX2lzQWN0aXZlOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQkJX2lzQWN0aXZlID0gYWN0aXZlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgUnVubmFibGVzIGhhdmUgYmVlbiBydW4uCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNEb25lKCkgewotCQkJcmV0dXJuICgoX19qb2JzLnNpemUoKSA9PSAwKSAmJiAhaXNBY3RpdmUoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2JjZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHVzZXIncyBwcmVmZXJlbmNlIG9yIHByb2plY3Qgc2V0dGluZ3MuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcG9wdWxhdGVkIGZyb20gdGhlIG11bHRpcGxlIHBlcnNpc3RlbnQgcHJvcGVydGllcywgYW5kIGlzIGtlcHQgYXMgYSBzZXNzaW9uCi0gKiBwcm9wZXJ0eSB3aGlsZSB0aGUgcmVzb3VyY2UgaXMgb3Blbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgSVJlc291cmNlIF9yZXNvdXJjZTsKLQlwcml2YXRlIGJvb2xlYW4gZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBnZXREaXNhYmxlQWxsVmFsaWRhdGlvbigpOwotCXByaXZhdGUgU3RyaW5nIF92ZXJzaW9uOwotCXByaXZhdGUgTWFwIF92YWxpZGF0b3JzOyAvLyBNYXAgb2YgYWxsIHZhbGlkYXRvcnMgKFZhbGlkYXRvck1ldGFEYXRhKSBjb25maWd1cmVkIG9uIHRoZQotCS8vIHByb2plY3Qgb3IgaW5zdGFsbGVkIGdsb2JhbGx5LiBUaGUgdmFsdWUgaXMgYSBCb29sZWFuOyBUUlVFCi0JLy8gbWVhbnMgdGhhdCB0aGUgVk1EIGlzIGVuYWJsZWQsIEZBTFNFIG1lYW5zIHRoYXQgdGhlIFZNRCBpcwotCS8vIGRpc2FibGVkLgotCXByb3RlY3RlZCBIYXNoTWFwIG1hbnVhbFZhbGlkYXRvcnM7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgYnVpbGRWYWxpZGF0b3JzOwotCXByb3RlY3RlZCBTdHJpbmcgVVNFUl9QUkVGRVJFTkNFID0gIlVTRVJfUFJFRkVSRU5DRSI7Ci0JcHJvdGVjdGVkIFN0cmluZyBVU0VSX01BTlVBTF9QUkVGRVJFTkNFID0gIlVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UiOwotCXByb3RlY3RlZCBTdHJpbmcgVVNFUl9CVUlMRF9QUkVGRVJFTkNFID0gIlVTRVJfQlVJTERfUFJFRkVSRU5DRSI7Ci0JcHJvdGVjdGVkIFN0cmluZyBERUxFR0FURVNfUFJFRkVSRU5DRSA9ICJERUxFR0FURVNfUFJFRkVSRU5DRSI7Ci0JCi0gIHByaXZhdGUgTWFwIF9kZWxlZ2F0ZXNCeVRhcmdldDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKFNldCBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoKChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpKS5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERpc2FibGVBbGxWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5hYmxlZEVsZW1lbnRzQXNTdHJpbmcoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgoKFZhbGlkYXRvck1ldGFEYXRhKSBlbGVtZW50c1tpXSkuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTEVNRU5UX1NFUEFSQVRPUik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzKFN0cmluZyBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBlbGVtID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKGVsZW0pOwotCQkJaWYgKHZtZCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkoU3RyaW5nIGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRzLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfU0VQQVJBVE9SKTsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGVsZW0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoZWxlbSk7Ci0JCQlpZiAodm1kICE9IG51bGwpIHsKLQkJCQlyZXN1bHRbY291bnQrK10gPSB2bWQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY291bnQgIT0gcmVzdWx0Lmxlbmd0aCkgewotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB0cmltUmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCB0cmltUmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gdHJpbVJlc3VsdDsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCV92YWxpZGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBfZGVsZWdhdGVzQnlUYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXByb3RlY3RlZCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UsIFZhbGlkYXRvck1ldGFEYXRhW10gdmFsaWRhdG9ycykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0aGlzKCk7Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTENSRUFURSkpOwotCQl9Ci0KLQkJc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlzZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZUFsbFZhbGlkYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkaXNhYmxlQWxsVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihib29sZWFuIGFsbFZhbGlkYXRpb24pIHsKLQkJZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBhbGxWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9ycyh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgImluY3JlbWVudGFsIiBpcyB0cnVlLCByZXR1cm4gdGhlIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycy4gSWYgImluY3JlbWVudGFsIiBpcwotCSAqIGZhbHNlLCByZXR1cm4gdGhlIGVuYWJsZWQgbm9uLWluY3JlbWVudGFsIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhib29sZWFuIGluY3JlbWVudGFsKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyghaW5jcmVtZW50YWwpOwotCX0KLQotCS8qKgotCSAqIElmICJmdWxsQnVpbGQiIGlzIHRydWUsIHJldHVybiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHRoYXQgc3VwcG9ydCBmdWxsIGJ1aWxkcy4gSWYKLQkgKiAiZnVsbEJ1aWxkIiBpcyBmYWxzZSwgcmV0dXJuIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBmdWxsIGJ1aWxkcy4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyhib29sZWFuIGZ1bGxCdWlsZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoZnVsbEJ1aWxkLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEZ1bGxCdWlsZFZhbGlkYXRvcnMoYm9vbGVhbiBmdWxsQnVpbGQsIGJvb2xlYW4gb25seVJlZmVyZW5jZWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotCQlpbnQgY291bnQgPSAwOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG51bGw7Ci0JCSAKLQkJaWYoICFpc0Rpc2FibGVBbGxWYWxpZGF0aW9uKCkgKXsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtudW1iZXJPZlZhbGlkYXRvcnMoKV07Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0JCQkKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlCb29sZWFuIGJ2YWx1ZSA9IChCb29sZWFuKShnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkuZ2V0KHZtZCkpOwotCQkJCWlmIChidmFsdWUuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJCQkvLyBJZiB0aGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQKLQkJCQkJaWYgKHZtZCA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmICggdm1kLmlzQnVpbGRWYWxpZGF0aW9uKCkgKSB7Ci0JCQkJCQlpZiAoIW9ubHlSZWZlcmVuY2VkIHx8IHZtZC5pc0RlcGVuZGVudFZhbGlkYXRvcigpKQotCQkJCQkJCXRlbXBbY291bnQrK10gPSB2bWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJfWVsc2V7Ci0JCQkgcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCS8vIEZpcnN0LCAiZGlzYWJsZSIgYWxsIHZhbGlkYXRvcnMKLQkJTWFwIGFsbCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJYWxsLnB1dCh2bWQsIEJvb2xlYW4uRkFMU0UpOwotCQl9Ci0KLQkJLy8gVGhlbiBlbmFibGUgb25seSB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgYXJyYXkKLQkJaWYgKCh2bWRzID09IG51bGwpIHx8ICh2bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJYWxsLnB1dCh2bWRzW2ldLCBCb29sZWFuLlRSVUUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlMaXN0IG1hbnVhbEVuYWJsZWRWTURMaXN0ID0gQXJyYXlzLmFzTGlzdCh2bWRzKTsKLQkJTGlzdCBhbGxWYWxpZGF0b3JzID0gQXJyYXlzLmFzTGlzdChnZXRWYWxpZGF0b3JzKCkpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgYWxsVmFsaWRhdG9ycy5zaXplKCk7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgYWxsVmFsaWRhdG9ycy5nZXQoaSk7Ci0JCQlpZihtYW51YWxFbmFibGVkVk1ETGlzdC5jb250YWlucyhkYXRhKSkKLQkJCQlnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpLnB1dChkYXRhLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQllbHNlCi0JCQkJZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5wdXQoZGF0YSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUxpc3QgYnVpbGRFbmFibGVkVk1ETGlzdCA9IEFycmF5cy5hc0xpc3Qodm1kcyk7Ci0JCUxpc3QgYWxsVmFsaWRhdG9ycyA9IEFycmF5cy5hc0xpc3QoZ2V0VmFsaWRhdG9ycygpKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGFsbFZhbGlkYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIGRhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGFsbFZhbGlkYXRvcnMuZ2V0KGkpOwotCQkJaWYoYnVpbGRFbmFibGVkVk1ETGlzdC5jb250YWlucyhkYXRhKSkKLQkJCQlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KGRhdGEsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCWVsc2UKLQkJCQlnZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkucHV0KGRhdGEsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgTWFwIGdldFZhbGlkYXRvck1ldGFEYXRhKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcnM7Ci0JfQotCQotCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9ycyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIFZhbGlkYXRvck1ldGFEYXRhIC0gaWYgdmFsdWUgaXMgZmFsc2UsIHJldHVybiB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yczsgaWYKLQkgKiB2YWx1ZSBpcyB0cnVlLCByZXR1cm4gdGhlIGVuYWJsZWQgdmFsaWRhdG9ycy4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0VmFsaWRhdG9ycyhib29sZWFuIHZhbHVlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtudW1iZXJPZlZhbGlkYXRvcnMoKV07Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUJvb2xlYW4gYnZhbHVlID0gKEJvb2xlYW4pIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0KHZtZCk7Ci0JCQlpZiAoYnZhbHVlLmJvb2xlYW5WYWx1ZSgpID09IHZhbHVlKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCX0KLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUhhc2hNYXAgbWFwID0gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKTsKLQkJU2V0IHNldCA9IGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzTWFwKCkua2V5U2V0KCk7Ci0JCWlmICghc2V0LmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCUxpc3QgZW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXQubmV4dCgpOwotCQkJCUJvb2xlYW4gb2JqID0gKEJvb2xlYW4pIG1hcC5nZXQoZGF0YSk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsICYmIG9iai5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7Ci0JCQkJCWVuYWJsZWRNYW51YWxWYWxpZGF0b3JzLmFkZChkYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGVuYWJsZWRNYW51YWxWYWxpZGF0b3JzLnRvQXJyYXkobmV3IFZhbGlkYXRvck1ldGFEYXRhW2VuYWJsZWRNYW51YWxWYWxpZGF0b3JzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBnZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCX0JCi0JCi0JcHVibGljICBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUhhc2hNYXAgbWFwID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpOwotCQlTZXQgc2V0ID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLmtleVNldCgpOwotCQlJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotCQlMaXN0IGVuYWJsZWRCdWlsZFZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghc2V0LmlzRW1wdHkoKSkgewotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIGRhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0Lm5leHQoKTsKLQkJCQlCb29sZWFuIG9iaiA9IChCb29sZWFuKSBtYXAuZ2V0KGRhdGEpOwotCQkJCWlmIChvYmogIT0gbnVsbCAmJiBvYmouYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkgewotCQkJCQllbmFibGVkQnVpbGRWYWxpZGF0b3JzLmFkZChkYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGVuYWJsZWRCdWlsZFZhbGlkYXRvcnMudG9BcnJheShuZXcgVmFsaWRhdG9yTWV0YURhdGFbZW5hYmxlZEJ1aWxkVmFsaWRhdG9ycy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkICBIYXNoTWFwIGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKSB7Ci0JCWlmKGJ1aWxkVmFsaWRhdG9ycyA9PSBudWxsKQotCQkJYnVpbGRWYWxpZGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGJ1aWxkVmFsaWRhdG9yczsKLQl9CQotCQotCXByb3RlY3RlZCAgSGFzaE1hcCBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpIHsKLQkJaWYobWFudWFsVmFsaWRhdG9ycyA9PSBudWxsKQotCQkJbWFudWFsVmFsaWRhdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBtYW51YWxWYWxpZGF0b3JzOwotCX0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgZm9yIHRoaXMgcHJlZmVyZW5jZTsgZWl0aGVyIGV2ZXJ5IGluc3RhbGxlZCB2YWxpZGF0b3IKLQkgKiAoZ2xvYmFsKSBvciBldmVyeSB2YWxpZGF0b3IgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCAocHJvamVjdCkuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0SW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbbnVtYmVyT2ZWYWxpZGF0b3JzKCldOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlCb29sZWFuIGJ2YWx1ZSA9IChCb29sZWFuKSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldCh2bWQpOwotCQkJaWYgKGJ2YWx1ZS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIHZhbGlkYXRvciBpcyBlbmFibGVkCi0JCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQkJdGVtcFtjb3VudCsrXSA9IHZtZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2YWxpZGF0b3JzIGZvciB0aGlzIHByZWZlcmVuY2U7IGVpdGhlciBldmVyeSBpbnN0YWxsZWQgdmFsaWRhdG9yIChnbG9iYWwpIG9yIGV2ZXJ5Ci0JICogdmFsaWRhdG9yIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QgKHByb2plY3QpLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcnJheShfdmFsaWRhdG9ycy5rZXlTZXQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcnMoVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzKSB7Ci0JCV92YWxpZGF0b3JzLmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHZtZHNbaV0gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCV92YWxpZGF0b3JzLnB1dCh2bWRzW2ldLCAodm1kc1tpXS5pc0VuYWJsZWRCeURlZmF1bHQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpKTsKLQkJfQotCX0KLQkKLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdERlbGVnYXRlcyhWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICBfZGVsZWdhdGVzQnlUYXJnZXQuY2xlYXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIFZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0gICAgICBpZiAodm1kID09IG51bGwpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgdGFyZ2V0SUQgPSB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotICAgICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHREZWxlZ2F0ZSh0YXJnZXRJRCk7Ci0gICAgICBpZiAoZGVsZWdhdGVJRCA9PSBudWxsKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RGVsZWdhdGUodGFyZ2V0SUQpKTsKLSAgICB9Ci0gIH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25maWd1cmVkIHZhbGlkYXRvcnMgb24gdGhlIGdpdmVuIHByb2plY3Qgb3IgaW5zdGFsbGVkIHZhbGlkYXRvcnMgaW4KLQkgKiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gX3ZhbGlkYXRvcnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVtYmVyT2ZJbmNyZW1lbnRhbFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JcHVibGljIGludCBudW1iZXJPZkluY3JlbWVudGFsVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKGdldFZhbGlkYXRvcnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG51bWJlck9mSW5jcmVtZW50YWxWYWxpZGF0b3JzKFZhbGlkYXRvck1ldGFEYXRhW10gdm1kcykgewotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAodm1kLmlzSW5jcmVtZW50YWwoKSkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBpbnQgbnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuYWJsZWRWYWxpZGF0b3JzKCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaXNhYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IG9yIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlck9mRGlzYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCkubGVuZ3RoOwotCX0KLQotCS8qcHVibGljIGludCBnZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIF9tYXhNZXNzYWdlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcyhpbnQgbWF4KSB7Ci0JCV9tYXhNZXNzYWdlcyA9IG1heDsKLQl9Ki8KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLW51bGwuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWZXJzaW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAoX3ZlcnNpb24gPT0gbnVsbCkgewotCQkJbG9hZFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gX3ZlcnNpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJX3ZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcHJlZmVyZW5jZSBoYXMgYmVlbiBtaWdyYXRlZDsgY2hhbmdlIHRoZSB2ZXJzaW9uIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCi0JICovCi0JcHVibGljIHZvaWQgbWFya1ZlcnNpb25DdXJyZW50KCkgewotCQkvLyBUaGUgdmVyc2lvbiBzaG91bGQgbm90IGJlIG1hcmtlZCBjdXJyZW50IHVudGlsIHRoZSBtaWdyYXRpb24gaXMgY29tcGxldGUKLQkJLy8gKGkuZS4sIFZhbGlkYXRpb25NaWdyYXRvciBoYXMgYmVlbiBpbnZva2VkLikgTWlncmF0aW5nIHRoZSB1c2VyJ3MgY29uZmlndXJhdGlvbgotCQkvLyBpcyBvbmx5IHRoZSBmaXJzdCBzdGVwIG9mIHRoZSBtaWdyYXRpb24uCi0JCXNldFZlcnNpb24oQ29uZmlndXJhdGlvbkNvbnN0YW50cy5DVVJSRU5UX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvbkN1cnJlbnQoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWZXJzaW9uKCkuZXF1YWxzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuQ1VSUkVOVF9WRVJTSU9OKTsKLQl9Ci0KLQkvLyBJUmVzb3VyY2UgY291bGQgYmUgYW4gSVByb2plY3Qgb3IgYW4gSVdvcmtzcGFjZVJvb3QKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBvbiB0aGlzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHZhbGlkYXRvckNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yQ2xhc3NOYW1lKTsKLQkJcmV0dXJuIGlzRW5hYmxlZCh2bWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZCBvbiB0aGlzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXQodm1kKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmNlIGFsbCBvZiB0aGUgZmllbGRzIGhhdmUgYmVlbiB1cGRhdGVkIG9uIHRoaXMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gaW5zdGFuY2UsIHRoaXMKLQkgKiBwcmVmZXJlbmNlIHNob3VsZCBiZSBzdG9yZWQgYmFjayBvbiB0aGUgSVJlc291cmNlIGZvciBsYXRlciB1c2UuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkCi0JICogbWFudWFsbHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9uY2UgdGhlIGZpZWxkcyBvZiB0aGlzIHR5cGUgaGF2ZSBiZWVuIHVwZGF0ZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcGFzc2l2YXRlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTFNBVkUpKTsKLQkJCX0KLQkJCWdldFJlc291cmNlKCkuc2V0U2Vzc2lvblByb3BlcnR5KENvbmZpZ3VyYXRpb25Db25zdGFudHMuVVNFUl9QUkVGRVJFTkNFLCB0aGlzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4YywgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TQVZFLCBuZXcgU3RyaW5nW117Z2V0UmVzb3VyY2UoKS5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldCB0aGUgdmFsdWVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNldFRvRGVmYXVsdCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gY29udmVydFRvQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gdHJ1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGNvbnZlcnRUb0ludGVnZXIoaW50IHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcih2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydFRvQm9vbGVhbihTdHJpbmcgdmFsdWUpIHsKLQkJQm9vbGVhbiBiID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0VG9JbnQoU3RyaW5nIHZhbHVlKSB7Ci0JCUludGVnZXIgdCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7Ci0JCXJldHVybiB0LmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGNvbnZlcnRUb0FycmF5KENvbGxlY3Rpb24gYykgewotCQlpbnQgbGVuZ3RoID0gKGMgPT0gbnVsbCkgPyAwIDogYy5zaXplKCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2xlbmd0aF07Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3VsdFtjb3VudCsrXSA9IHZtZDsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGNvbnZlcnRUb0FycmF5KE9iamVjdFtdIGMpIHsKLQkJaW50IGxlbmd0aCA9IChjID09IG51bGwpID8gMCA6IGMubGVuZ3RoOwotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsZW5ndGhdOwotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlTeXN0ZW0uYXJyYXljb3B5KGMsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzIGJlZm9yZSB0aGUgcHJvamVjdCBvciB3b3Jrc3BhY2UgaXMgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlwcmVmLnNldFZhbHVlKFVTRVJfUFJFRkVSRU5DRSwgc2VyaWFsaXplKCkpOwotCQkJCXByZWYuc3RvcmUob3MsIFVTRVJfUFJFRkVSRU5DRSk7Ci0JCQkJcHJlZi5zZXRWYWx1ZShVU0VSX01BTlVBTF9QUkVGRVJFTkNFLCBzZXJpYWxpemVNYW51YWxTZXR0aW5nKCkpOwotCQkJCXByZWYuc3RvcmUob3MsIFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UpOwotCQkJCXByZWYuc2V0VmFsdWUoVVNFUl9CVUlMRF9QUkVGRVJFTkNFLCBzZXJpYWxpemVCdWlsZFNldHRpbmcoKSk7Ci0JCQkJcHJlZi5zdG9yZShvcywgVVNFUl9CVUlMRF9QUkVGRVJFTkNFKTsKLQkJCQlwcmVmLnNldFZhbHVlKERFTEVHQVRFU19QUkVGRVJFTkNFLCBzZXJpYWxpemVEZWxlZ2F0ZXNTZXR0aW5nKCkpOwotCQkJCXByZWYuc3RvcmUob3MsIERFTEVHQVRFU19QUkVGRVJFTkNFKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGllKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhpZSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgYW5kIHN0b3JlIHRoZSB2ZXJzaW9uIG51bWJlciwgYnV0IG5vdGhpbmcgZWxzZS4gVGhlIHZlcnNpb24gaXNuJ3QgYSBwcmVmZXJlbmNlLCBidXQgaXQncwotCSAqIHN0b3JlZCBhbmQgbG9hZGVkIGFzIGlmIGl0IGlzLiBCZWNhdXNlIHRoZSBsb2FkIG1lY2hhbmlzbSBpcyBkaWZmZXJlbnQgYmV0d2VlbiBhbiBJUHJvamVjdAotCSAqIGFuZCB0aGUgSVdvcmtzcGFjZVJvb3QsIGtlZXAgdGhlIGxvYWQgbWVjaGFuaXNtIGluc2lkZSB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24KLQkgKiBpbXBsZW1lbnRhdGlvbiwgYnV0IGluaXRpYWxpemUgb25seSB0aGUgbWluaW11bSBhdCBmaXJzdC4gQWZ0ZXIgdGhlIHByb2plY3QgaGFzIGJlZW4KLQkgKiBtaWdyYXRlZCwgbG9hZCB0aGUgb3RoZXIgZmllbGRzIChsb2FkaW5nIHRoZSBvdGhlciBmaWVsZHMgYmVmb3JlIHRoZSBtaWdyYXRpb24gbWF5IG92ZXJ3cml0ZQotCSAqIHRoZSB2YWx1ZXMgb2YgdGhvc2UgZmllbGRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBsb2FkVmVyc2lvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24obnVsbCwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19OVUxMUkVUUklFVkUpKTsKLQkJfQotCi0JCUlNYXJrZXJbXSBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCS8vIGVpdGhlciBhIG5ldyB3b3Jrc3BhY2Ugb3IgYWxyZWFkeSBtaWdyYXRlZDsgcHJvY2VlZCBhcyBub3JtYWwKLQkJCXZlcnNpb24gPSBsb2FkVmVyc2lvbihnZXRSZXNvdXJjZSgpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIG1pZ3JhdGUKLQkJCXZlcnNpb24gPSBsb2FkVmVyc2lvbihtYXJrZXIpOwotCQl9Ci0JCXNldFZlcnNpb24odmVyc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBsb2FkVmVyc2lvbihJTWFya2VyW10gbWFya2VyKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgZ2V0VmFsdWUobWFya2VyWzBdLCBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9ONF8wMzsKLQkJfQotCi0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbG9hZFZlcnNpb24oSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbiBvbmUgb2YgdHdvIHNpdHVhdGlvbnM6Ci0JCQkvLyAgICAxLiBUaGlzIGlzIGEgbmV3IHdvcmtzcGFjZSBhbmQgbm8gcHJlZmVyZW5jZXMgZXhpc3QuCi0JCQkvLyAgICAyLiBUaGlzIGlzIGEgbWlncmF0ZWQgd29ya3NwYWNlIGFuZCB0aGUgb2xkIHByZWZlcmVuY2VzIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMKLQkJCS8vIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLQkJCVN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uID0gcmVzb3VyY2UuZ2V0UGVyc2lzdGVudFByb3BlcnR5KENvbmZpZ3VyYXRpb25Db25zdGFudHMuVVNFUl9QUkVGRVJFTkNFKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQkJCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCQl2ZXJzaW9uID0gZ2V0VmVyc2lvbkRlZmF1bHQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHZlcnNpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04pOwotCQkJCWlmICh2ZXJzaW9uSW5kZXggIT0gLTEpCi0JCQkJCXZlcnNpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyh2ZXJzaW9uSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZFUlNJT04ubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFZlcnNpb25EZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117Z2V0UmVzb3VyY2UoKS5nZXROYW1lKCl9KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzIHdoZW4gdGhlIHByb2plY3Qgb3Igd29ya3NwYWNlIGlzIG9wZW5lZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBsb2FkKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGdldFJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG51bGwsIFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTlVMTFJFVFJJRVZFKSk7Ci0JCQl9Ci0KLQkJCUlNYXJrZXJbXSBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLQkJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJCS8vIGVpdGhlciBhIG5ldyB3b3Jrc3BhY2Ugb3IgYWxyZWFkeSBtaWdyYXRlZDsgcHJvY2VlZCBhcyBub3JtYWwKLQkJCQlsb2FkUHJlZmVyZW5jZSgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBtaWdyYXRlCi0JCQkJbG9hZChtYXJrZXIpOwotCQkJfQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgZXhjOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gKGdldFJlc291cmNlKCkgPT0gbnVsbCkgPyAibnVsbCIgOiBnZXRSZXNvdXJjZSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLCBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JFVFJJRVZFLCBuZXcgU3RyaW5nW117cmVzb3VyY2VOYW1lfSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJTWFya2VyIHRoYXQgdXNlZCB0byBzdG9yZSB0aGUgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiwgaWYgdGhlIG1hcmtlciBleGlzdHMuIChJZgotCSAqIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gaXQncyBhbHJlYWR5IGJlZW4gbWlncmF0ZWQuKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJTWFya2VyW10gZ2V0TWFya2VyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkKElNYXJrZXJbXSBtYXJrZXIpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJpYk5hbWUpIHsKLQkJaWYgKG1hcmtlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJOYW1lKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb246OmdldFZhbHVlKCIgKyBhdHRyaWJOYW1lICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJpYk5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBnZXRWYWx1ZShtYXJrZXIsIGF0dHJpYk5hbWUpOwotCQlpZiAoYm9vbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJcmV0dXJuIGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRWYWx1ZShJTWFya2VyIG1hcmtlciwgU3RyaW5nIGF0dHJpYk5hbWUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGdldFZhbHVlKG1hcmtlciwgYXR0cmliTmFtZSk7Ci0JCWlmIChpbnRlZ2VyID09IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gaW50ZWdlci5pbnRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoSU1hcmtlciBtYXJrZXIsIFN0cmluZyBhdHRyaWJOYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBnZXRWYWx1ZShtYXJrZXIsIGF0dHJpYk5hbWUpOwotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRQcmVmZXJlbmNlKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBpbiBvbmUgb2YgdHdvIHNpdHVhdGlvbnM6Ci0JCS8vIDEuIFRoaXMgaXMgYSBuZXcgd29ya3NwYWNlIGFuZCBubyBwcmVmZXJlbmNlcyBleGlzdC4KLQkJLy8gMi4gVGhpcyBpcyBhIG1pZ3JhdGVkIHdvcmtzcGFjZSBhbmQgdGhlIG9sZCBwcmVmZXJlbmNlcyBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzCi0JCS8vIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmcyAhPSBudWxsKSB7Ci0JCQlkZXNlcmlhbGl6ZUFsbFByZWZzKHByZWZzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcmVmcwotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUFsbFByZWZzKFByZWZlcmVuY2VzIHByZWZzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdG9yZWRDb25maWcgPSBwcmVmcy5nZXRTdHJpbmcoVVNFUl9QUkVGRVJFTkNFKTsKLQkJZGVzZXJpYWxpemUoc3RvcmVkQ29uZmlnKTsKLQkJU3RyaW5nIHN0b3JlZE1hbnVhbENvbmZpZyA9IHByZWZzLmdldFN0cmluZyhVU0VSX01BTlVBTF9QUkVGRVJFTkNFKTsKLQkJZGVzZXJpYWxpemVNYW51YWwoc3RvcmVkTWFudWFsQ29uZmlnKTsKLQkJU3RyaW5nIHN0b3JlZEJ1aWxkQ29uZmlnID0gcHJlZnMuZ2V0U3RyaW5nKFVTRVJfQlVJTERfUFJFRkVSRU5DRSk7Ci0JCWRlc2VyaWFsaXplQnVpbGQoc3RvcmVkQnVpbGRDb25maWcpOwotCQlTdHJpbmcgc3RvcmVkRGVsZWdhdGVzQ29uZmlndXJhdGlvbiA9IHByZWZzLmdldFN0cmluZyhERUxFR0FURVNfUFJFRkVSRU5DRSk7Ci0JCWRlc2VyaWFsaXplRGVsZWdhdGVzKHN0b3JlZERlbGVnYXRlc0NvbmZpZ3VyYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gKFByZWZlcmVuY2VzKSBldmVudC5nZXRTb3VyY2UoKTsKLQkJaWYgKHByZWZzICE9IG51bGwgJiYgIWV2ZW50LmdldE9sZFZhbHVlKCkuZXF1YWxzKGV2ZW50LmdldE5ld1ZhbHVlKCkpKSB7Ci0JCQl0cnkgewotCQkJCWRlc2VyaWFsaXplQWxsUHJlZnMoZXZlbnQpOwotCQkJCXBhc3NpdmF0ZSgpOwotCQkJIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGllKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUFsbFByZWZzKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0b3JlZENvbmZpZyA9IChTdHJpbmcpZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYoIGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKFVTRVJfUFJFRkVSRU5DRSkgKXsKLQkJCWRlc2VyaWFsaXplKHN0b3JlZENvbmZpZyk7Ci0JCX1lbHNlIGlmKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKFVTRVJfTUFOVUFMX1BSRUZFUkVOQ0UpKXsKLQkJCWRlc2VyaWFsaXplTWFudWFsKHN0b3JlZENvbmZpZyk7Ci0JCX1lbHNlIGlmKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKFVTRVJfQlVJTERfUFJFRkVSRU5DRSkpewotCQkJZGVzZXJpYWxpemVCdWlsZChzdG9yZWRDb25maWcpOwotCQl9ZWxzZSBpZihldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhERUxFR0FURVNfUFJFRkVSRU5DRSkpewotCQkJZGVzZXJpYWxpemVEZWxlZ2F0ZXMoc3RvcmVkQ29uZmlnKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZXNlcmlhbGl6ZUJ1aWxkKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKCJkZWZhdWx0X3ZhbHVlIikpIHsKLQkJCS8vIEFzc3VtZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBuZXZlciBiZWVuIHNldCAobmV3IHdvcmtzcGFjZSkuCi0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBidWlsZFZhbGlkYXRpb25JbmRleCA9IHN0b3JlZENvbmZpZ3VyYXRpb24uaW5kZXhPZihDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0KLQkJU3RyaW5nIG1hbnVhbFZhbGlkYXRpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhidWlsZFZhbGlkYXRpb25JbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9CVUlMRF9WQUxJREFUT1JTLmxlbmd0aCgpLHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkpOwotCQlzZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldFN0cmluZ0FzRW5hYmxlZEVsZW1lbnRzQXJyYXkobWFudWFsVmFsaWRhdGlvbikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlc2VyaWFsaXplTWFudWFsKFN0cmluZyBzdG9yZWRDb25maWd1cmF0aW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKCJkZWZhdWx0X3ZhbHVlIikpIHsKLQkJCS8vIEFzc3VtZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBuZXZlciBiZWVuIHNldCAobmV3IHdvcmtzcGFjZSkuCi0JCQlyZXNldFRvRGVmYXVsdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBtYW51YWxWYWxpZGF0aW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FTkFCTEVEX01BTlVBTF9WQUxJREFUT1JTKTsKLQotCQlTdHJpbmcgbWFudWFsVmFsaWRhdGlvbiA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKG1hbnVhbFZhbGlkYXRpb25JbmRleCArIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRU5BQkxFRF9NQU5VQUxfVkFMSURBVE9SUy5sZW5ndGgoKSxzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpKTsKLQkJc2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoZ2V0U3RyaW5nQXNFbmFibGVkRWxlbWVudHNBcnJheShtYW51YWxWYWxpZGF0aW9uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemVEZWxlZ2F0ZXMoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQotICAgIGlmIChzdG9yZWRDb25maWd1cmF0aW9uID09IG51bGwgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5sZW5ndGgoKSA9PSAwIHx8IHN0b3JlZENvbmZpZ3VyYXRpb24uZXF1YWxzKCJkZWZhdWx0X3ZhbHVlIikpIHsKLQkgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkgICAgcmVzZXRUb0RlZmF1bHQoKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JICBpbnQgZGVsZWdhdGVzSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTKTsKLQotCSAgU3RyaW5nIGRlbGVnYXRlcyA9IHN0b3JlZENvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKGRlbGVnYXRlc0luZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTLmxlbmd0aCgpLHN0b3JlZENvbmZpZ3VyYXRpb24ubGVuZ3RoKCkpOwotCi0JICBpZiAoZGVsZWdhdGVzID09IG51bGwpIHsKLQkgICAgcmV0dXJuOwotCSAgfQotCi0JICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZWxlZ2F0ZXMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotCSAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkgICAgU3RyaW5nIGRlbGVnYXRlQ29uZmlndXJhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkgICAgaW50IHNlcGFyYXRvckluZGV4ID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURVNfU0VQQVJBVE9SKTsKLQkgICAgU3RyaW5nIHRhcmdldElEID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7Ci0JICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gZGVsZWdhdGVDb25maWd1cmF0aW9uLnN1YnN0cmluZyhzZXBhcmF0b3JJbmRleCArIDEpOwotICAgICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0JICB9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weVRvKFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHVwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXVwLnNldFZlcnNpb24oZ2V0VmVyc2lvbigpKTsKLQkJdXAuc2V0UmVzb3VyY2UoZ2V0UmVzb3VyY2UoKSk7Ci0JCXVwLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9ycygpKTsKLQkJdXAuc2V0RGlzYWJsZUFsbFZhbGlkYXRpb24oaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpKTsKLQkJdXAuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0JCXVwLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkpOwotCQl1cC5zZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoKSk7Ci0gICAgdXAuc2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSk7Ci0JfQotCi0gIHB1YmxpYyBNYXAgZ2V0RGVsZWdhdGluZ1ZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIF9kZWxlZ2F0ZXNCeVRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlbGVnYXRpbmdWYWxpZGF0b3JzKE1hcCBzb3VyY2UpCi0gIHsKLSAgICAvLyBJdCBpcyBzYWZlIHRvIGNvcHkgdGhpcyBtYXAgYXMgaXQgY29udGFpbnMgb25seSBpbW11dGFibGUgc3RyaW5ncy4KLSAgICBfZGVsZWdhdGVzQnlUYXJnZXQucHV0QWxsKHNvdXJjZSk7Ci0gIH0KLQotICAvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGhhdmUgbm90IGNoYW5nZWQgc2luY2UgdGhpcyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB3YXMKLQkgKiBjb25zdHJ1Y3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAoVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciB0aGUgUHJvcGVydGllcyBhbmQgUHJlZmVyZW5jZSBwYWdlczsKLQkgKiBpZiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIGhhc24ndCBjaGFuZ2VkLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSB0YXNrIGxpc3Q7Ci0JICogdXBkYXRpbmcgdGhlIHRhc2sgbGlzdCBpcyBhIGNvc3RseSBvcGVyYXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0VuYWJsZWRWYWxpZGF0b3JzQ2hhbmdlZChWYWxpZGF0b3JNZXRhRGF0YVtdIG9sZEVuYWJsZWRWbWQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgY2hlY2sgdGhlIG9idmlvdXM6IGlzIGV2ZXJ5IGVuYWJsZWQgdmFsaWRhdG9yIHN0aWxsIGVuYWJsZWQsIGFuZCBpcwotCQkvLyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyB0aGUgc2FtZSBhcyBpdCB3YXMgYmVmb3JlPyBJZiBub3QsIHJldHVybiB0cnVlLgotCQlpZiAob2xkRW5hYmxlZFZtZCA9PSBudWxsKSB7Ci0JCQkvLyBTb21ldGhpbmcncyBnb25lIHdyb25nLi4uCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkRW5hYmxlZFZtZC5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gb2xkRW5hYmxlZFZtZFtpXTsKLQkJCWlmICghaXNFbmFibGVkKHZtZCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIEV2ZXJ5dGhpbmcgdGhhdCB3YXMgZW5hYmxlZCBpcyBzdGlsbCBlbmFibGVkOyBoYXZlIGFueSBhZGRpdGlvbmFsCi0JCS8vIHZhbGlkYXRvcnMgYmVlbiBlbmFibGVkPwotCQlpZiAobnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpICE9IG9sZEVuYWJsZWRWbWQubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0gIAotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiB0aGUgbGlzdCBvZiBkZWxlZ2F0ZSB2YWxpZGF0b3JzLgotICAgKiBAcGFyYW0gb2xkRGVsZWdhdGVzIGEgTWFwIHdpdGggdGhlIG9sZCBkZWxlZ2F0ZXMgSUQgYnkgdGFyZ2V0IElELgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXZlRGVsZWdhdGVzQ2hhbmdlZChNYXAgb2xkRGVsZWdhdGVzKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgaWYgKG9sZERlbGVnYXRlcyA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvbGREZWxlZ2F0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyB0YXJnZXRJRCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyBvbGREZWxlZ2F0ZUlEID0gKFN0cmluZykgb2xkRGVsZWdhdGVzLmdldCh0YXJnZXRJRCk7Ci0gICAgICBTdHJpbmcgbmV3RGVsZWdhdGVJRCA9IChTdHJpbmcpIF9kZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotICAgICAgCi0gICAgICBpZiAob2xkRGVsZWdhdGVJRCA9PSBudWxsIHx8IG5ld0RlbGVnYXRlSUQgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAoIW5ld0RlbGVnYXRlSUQuZXF1YWxzKG9sZERlbGVnYXRlSUQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAob2xkRGVsZWdhdGVzLnNpemUoKSAhPSBfZGVsZWdhdGVzQnlUYXJnZXQuc2l6ZSgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcmlhbGl6ZSgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRJU0FCTEVfQUxMX1ZBTElEQVRJT05fU0VUVElORyk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaXNEaXNhYmxlQWxsVmFsaWRhdGlvbigpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WRVJTSU9OKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRWZXJzaW9uKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgc2VyaWFsaXplTWFudWFsU2V0dGluZygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfTUFOVUFMX1ZBTElEQVRPUlMpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuYWJsZWRFbGVtZW50c0FzU3RyaW5nKGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcmlhbGl6ZUJ1aWxkU2V0dGluZygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVOQUJMRURfQlVJTERfVkFMSURBVE9SUyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RW5hYmxlZEVsZW1lbnRzQXNTdHJpbmcoZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJpYWxpemVEZWxlZ2F0ZXNTZXR0aW5nKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFX1ZBTElEQVRPUlMpOwotICAgIGJ1ZmZlci5hcHBlbmQoZ2V0RGVsZWdhdGVzQXNTdHJpbmcoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSkpOwotICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBhIFN0cmluZyB3aGljaCBjb250YWlucyBwYWlycyBvZiB0YXJnZXRJRD1kZWxlZ2F0ZUlEIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbi4KLSAgICogQHBhcmFtIHZhbGlkYXRvck1ldGFEYXRhIGEgTWFwIHdpdGggdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZhbGlkYXRvcnMuCi0gICAqIEByZXR1cm4gYSBTdHJpbmcuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXREZWxlZ2F0ZXNBc1N0cmluZyhNYXAgdmFsaWRhdG9yTWV0YURhdGEpIHsKLSAgICAKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmFsaWRhdG9yTWV0YURhdGEua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgCi0gICAgICBWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IGdldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQpOwotICAgICAgCi0gICAgICBpZiAoZGVsZWdhdGVJRCA9PSBudWxsKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyBXcml0ZSBvdXQgcGFpcnMgdGFyZ2V0SUQ9ZGVsZWdhdGVJRAotCi0gICAgICBidWZmZXIuYXBwZW5kKHRhcmdldElEKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURVNfU0VQQVJBVE9SKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoZGVsZWdhdGVJRCk7Ci0gICAgICBidWZmZXIuYXBwZW5kKENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgZGVsZWdhdGUncyBJRCBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlIGNvbmZpZ3VyZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIGZvciAKLSAgICogYSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSB2bWQgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgbWV0YWRhdGEuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdW5pcXVlIG5hbWUgKElEKSBvZiB0aGUgdmFsaWRhdG9yIGRlbGVnYXRlLCBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVsZWdhdGVVbmlxdWVOYW1lKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7ICAgIAotICAgIHJldHVybiAoU3RyaW5nKSBfZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElEKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZWxlZ2F0ZSdzIElEIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgdG8gYmUgdXNlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQotICAgKiBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSB2bWQgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgbWV0YWRhdGEuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlEIGEgU3RyaW5nIHdpdGggdGhlIHVuaXF1ZSBuYW1lIChJRCkgb2YgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlVW5pcXVlTmFtZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyBkZWxlZ2F0ZUlEKSB7Ci0gICAgU3RyaW5nIHRhcmdldElEID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsgICAgCi0gICAgX2RlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0gIH0KLQotICAvKioKLQkgKiBEZXNlcmlhbGl6ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgdmVyc2lvbiBudW1iZXI7IHRoZSB2ZXJzaW9uIGlzIGRlc2VyaWFsaXplZCBmaXJzdCwgaW4gdGhlCi0JICogbG9hZFZlcnNpb24oKSBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemUoU3RyaW5nIHN0b3JlZENvbmZpZ3VyYXRpb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaWYgKHN0b3JlZENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBzdG9yZWRDb25maWd1cmF0aW9uLmxlbmd0aCgpID09IDAgfHwgc3RvcmVkQ29uZmlndXJhdGlvbi5lcXVhbHMoImRlZmF1bHRfdmFsdWUiKSkgewotCQkJLy8gQXNzdW1lIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IChuZXcgd29ya3NwYWNlKS4KLQkJCXJlc2V0VG9EZWZhdWx0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggPSBzdG9yZWRDb25maWd1cmF0aW9uLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcpOwotCQlpbnQgdmVyc2lvbkluZGV4ID0gc3RvcmVkQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkVSU0lPTik7Ci0JCWlmKGRpc2FibGVBbGxWYWxpZGF0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQlTdHJpbmcgZGlzYWJsZUFsbFZhbGlkYXRpb24gPSBzdG9yZWRDb25maWd1cmF0aW9uLnN1YnN0cmluZyhkaXNhYmxlQWxsVmFsaWRhdGlvbkluZGV4ICsgQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ESVNBQkxFX0FMTF9WQUxJREFUSU9OX1NFVFRJTkcubGVuZ3RoKCksdmVyc2lvbkluZGV4KTsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihCb29sZWFuLnZhbHVlT2YoZGlzYWJsZUFsbFZhbGlkYXRpb24pLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCQlzZXREaXNhYmxlQWxsVmFsaWRhdGlvbihmYWxzZSk7OwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNhYmxlVmFsaWRhdGlvbkRlZmF1bHQoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFRkFVTFRfRElTQUJMRV9WQUxJREFUSU9OX1NFVFRJTkc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldEVuYWJsZWRWYWxpZGF0b3JzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVGQVVMVF9FTkFCTEVEX1ZBTElEQVRPUlM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXNEZWZhdWx0KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUZBVUxUX01BWE5VTU1FU1NBR0VTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb25EZWZhdWx0KCkgewotCQkvLyBJZiB0aGUgdmVyc2lvbiBjYW4ndCBiZSByZXRyaWV2ZWQsIGFzc3VtZSB0aGF0IGl0J3MgYSBuZXcgd29ya3NwYWNlLiAoQSBudWxsIHZlcnNpb24KLQkJLy8gY291bGQgYWxzbyBtZWFuIGEgNC4wMyB3b3Jrc3BhY2UsIGJ1dCB0aGF0J3MgdGFrZW4gY2FyZSBvZiBpbiB0aGUgbG9hZChJTWFya2VyW10pCi0JCS8vIG1ldGhvZC4pCi0JCXJldHVybiBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNVUlJFTlRfVkVSU0lPTjsKLQl9Ci0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hbnVhbEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnNNYXAoKS5nZXQodm1kKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZEVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpLmdldCh2bWQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIGludCBudW1iZXJPZk1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKS5sZW5ndGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVNpbmdsZVZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJTWFwIGFsbCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCWFsbC5wdXQodm1kLCBCb29sZWFuLlRSVUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlU2luZ2xlVmFsaWRhdG9yKFZhbGlkYXRvck1ldGFEYXRhICB2bWQpewotCQlNYXAgYWxsID0gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQkJYWxsLnB1dCh2bWQsIEJvb2xlYW4uRkFMU0UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbmFibGVTaW5nbGVNYW51YWxWYWxpZGF0b3IoVmFsaWRhdG9yTWV0YURhdGEgIHZtZCl7Ci0JCU1hcCBtYW5WYWwgPSBnZXRNYW51YWxFbmFibGVkVmFsaWRhdG9yc01hcCgpOwotCQltYW5WYWwucHV0KHZtZCwgQm9vbGVhbi5UUlVFKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZGlzYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJTWFwIG1hblZhbCA9IGdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzTWFwKCk7Ci0JCW1hblZhbC5wdXQodm1kLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBlbmFibGVTaW5nbGVCdWlsZFZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSAgdm1kKXsKLQkJTWFwIGJ1aWxkVmFsID0gZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9yc01hcCgpOwotCQlidWlsZFZhbC5wdXQodm1kLCBCb29sZWFuLlRSVUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNhYmxlU2luZ2xlQnVpbGRWYWxpZGF0b3IoVmFsaWRhdG9yTWV0YURhdGEgIHZtZCl7Ci0JCU1hcCBidWlsZFZhbCA9IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnNNYXAoKTsKLQkJYnVpbGRWYWwucHV0KHZtZCwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBkZXNjcmlwdG9yIG9mIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgY29uZmlndXJlZCAKLSAgICogZm9yIHRoZSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvciBpbiB0aGUgY29udGV4dCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uIAotICAgKiBAcGFyYW0gdm1kIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvcidzIG1ldGEgZGF0YS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBhIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBnZXREZWxlZ2F0ZURlc2NyaXB0b3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIFN0cmluZyB0YXJnZXRJRCA9IHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgU3RyaW5nIGRlbGVnYXRlSUQgPSBnZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kKTsKLSAgCi0gICAgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOyAKLSAgICByZXR1cm4gZGVzY3JpcHRvcjsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmEyZWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLlZhbGlkYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25GYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFZhbGlkYXRpb25GYWN0b3J5IHsKLQlzdGF0aWMgVmFsaWRhdGlvbkZhY3RvcnkgaW5zdCA9IG51bGw7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZihpbnN0ID09IG51bGwpCi0JCQlpbnN0ID0gbmV3IFZhbGlkYXRpb25GYWN0b3J5SW1wbCgpOwotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQotCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JVbmlxdWVJZCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQlyZXR1cm4gcmVhZGVyLmdldFZhbGlkYXRvcih2YWxpZGF0b3JVbmlxdWVJZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxYTZiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uVGFnTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSdWxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaXMgYSBzaW5nbGV0b24gd2hvIHJlYWRzIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIFZhbGlkYXRvciBleHRlbnNpb25zLgotICogVGhlIHJlYWQgaXMgZG9uZSBvbmNlIChpbiB0aGUgY29uc3RydWN0b3IpLCBhbmQgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyBjYW4gYmUgYWNjZXNzZWQgYnkgY2FsbGluZwotICogImdldFZhbGlkYXRvck1ldGFEYXRhKFN0cmluZykiIG9uIHRoaXMgY2xhc3MuIFRoZSByZWFkIGlzIHRyaWdnZXJlZCBieSBhIGNhbGwgZnJvbQotICogVmFsaWRhdG9yTWFuYWdlcidzIGxvYWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCkgbWV0aG9kLiBWYWxpZGF0b3JNYW5hZ2VyIGRlbGVnYXRlcyB0aGUgbG9hZAotICogY2FsbCB0byB0aGlzIGNsYXNzLCBhbmQgaWYgdGhpcyBjbGFzcyBpcyBudWxsLCB0aGUgc2luZ2xldG9uIGlzIG5ldydlZCB1cCwgYW5kIHRoZSByZWdpc3RyeSBpcwotICogcmVhZC4KLSAqIAotICogTm8gVmFsaWRhdG9yIHNob3VsZCBuZWVkIHRvIGtub3cgYWJvdXQgdGhpcyBjbGFzcy4gVGhlIG9ubHkgY2xhc3Mgd2hpY2ggc2hvdWxkIGNhbGwKLSAqIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpcyBWYWxpZGF0b3JNYW5hZ2VyLgotICogCi0gKiBUaGUgVmFsaWRhdG9yIGl0c2VsZiBpcyBpbml0aWFsaXplZCBpbiB0aGUgImluaXRpYWxpemVWYWxpZGF0b3IiIG1ldGhvZC4KLSAqIAotICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLnZhbGlkYXRvciIgaWQ9IkVKQlZhbGlkYXRvciIgbmFtZT0iRUpCCi0gKiBWYWxpZGF0b3IiPiA8dmFsaWRhdG9yPjxwcm9qZWN0TmF0dXJlIGlkPSJjb20uaWJtLmV0b29scy5qMmVlLkVKQk5hdHVyZSIgaW5jbHVkZT0iZmFsc2UiLz4KLSAqIDxmaWx0ZXIgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIiBuYW1lRmlsdGVyID0gImVqYi1qYXIueG1sIi8+IDxmaWx0ZXIKLSAqIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlciA9ICIqLmphdmEiLz4gPGhlbHBlcgotICogY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5lamIud29ya2JlbmNoaW1wbC5FSkJIZWxwZXIiLz4gPHJ1bgotICogY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5lamIuRUpCVmFsaWRhdG9yIiBpbmNyZW1lbnRhbD0iZmFsc2UiIGVuYWJsZWQ9ImZhbHNlIgotICogcGFzcz0iZmFzdCxmdWxsIiBhc3luYz0iZmFsc2UiLz4gPGFnZ3JlZ2F0ZVZhbGlkYXRvciBjbGFzcz0ibXkuYWdncmVnYXRlLlZhbGlkYXRvckNsYXNzIi8+Ci0gKiA8bWlncmF0ZT48dmFsaWRhdG9yIGZyb209Im9sZC5jbGFzcy5uYW1lIiB0bz0ibmV3LmNsYXNzLm5hbWUiLz4gPC9taWdyYXRlPiA8L3ZhbGlkYXRvcj4KLSAqIDwvZXh0ZW5zaW9uPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGltcGxlbWVudHMgUmVnaXN0cnlDb25zdGFudHMgewotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciBpbnN0OwotCXByaXZhdGUgSGFzaE1hcCBfdmFsaWRhdG9yczsgLy8gbGlzdCBvZiBhbGwgdmFsaWRhdG9ycyByZWdpc3RlcmVkLCB3aXRoIHRoZWlyIGFzc29jaWF0ZWQKLQkvLyBWYWxpZGF0b3JNZXRhRGF0YSwgaW5kZXhlZCBieSBwcm9qZWN0IG5hdHVyZSBpZAotCXByaXZhdGUgSGFzaE1hcCBfaW5kZXhlZFZhbGlkYXRvcnM7IC8vIGxpc3Qgb2YgYWxsIHZhbGlkYXRvcnMsIGluZGV4ZWQgYnkgdmFsaWRhdG9yIGNsYXNzIG5hbWUsCi0JLy8gd2l0aCB0aGUgdmFsaWRhdG9yJ3MgVmFsaWRhdG9yTWV0YURhdGEgYXMgdGhlIHZhbHVlLgotCS8vIE5lZWRlZCBieSB0aGUgV29ya2JlbmNoUmVwb3J0ZXIsIGJlY2F1c2Ugc29tZXRpbWVzIHRoZQotCS8vIElWYWxpZGF0b3IgaXMgbm90IGVub3VnaCB0byByZW1vdmUgYWxsIG1lc3NhZ2VzIGZyb20gdGhlCi0JLy8gdGFzayBsaXN0LgotCXByaXZhdGUgU2V0IF9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnM7Ci0JLy8gU2luY2UgSVByb2plY3QncyBjb250ZW50cyBhcmUgYWxsIGluc3RhbmNlcyBvZiBJUmVzb3VyY2UsIGV2ZXJ5IHR5cGUgZmlsdGVyIGZvciBhIHZhbGlkYXRvcgotCS8vIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSVJlc291cmNlLiBUaGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgcmVidWlsZENhY2hlIHBhc3MgYW5kIHRvIHRoZQotCS8vIHZhbGlkYXRpb24gcGFzcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVJFU09VUkNFID0gIm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX1BST0pFQ1QgPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQgLy8gVGhpcyAncHJvamVjdCBuYXR1cmUgaWQnIGlzIHVzZWQgYXMgYSBrZXkgdG8gZ2V0IHRoZSB2YWxpZGF0b3JzIHdoaWNoIGNhbiBydW4gb24gYSBwcm9qZWN0IHR5cGUgd2hpY2ggaGFzbid0IGJlZW4gZXhwbGljaXRseSBmaWx0ZXJlZCBpbiBvciBvdXQgYnkgYW55IHZhbGlkYXRvci4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVERURfUFJPSkVDVCA9ICJFWENMVURFRCI7IC8vJE5PTi1OTFMtMSQgLy8gVGhpcyAncHJvamVjdCBuYXR1cmUgaWQnIGlzIHVzZWQgYXMgYSBrZXkgdG8gZ2V0IHRoZSB2YWxpZGF0b3JzIHdoaWNoIGFyZSBleGNsdWRlZCBvbiBjZXJ0YWluIHByb2plY3RzLgotCQotCXB1YmxpYyBIYXNoTWFwIHByb2plY3RWYWxpZGF0aW9uTWV0YURhdGE7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0cnkgaXMgcmVhZCBvbmNlIC0gd2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQotCQl0cnkgewotCQkJX3ZhbGlkYXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJX2luZGV4ZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkJCV9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JCQkvLyBSZWFkIHRoZSByZWdpc3RyeSBhbmQgYnVpbGQgYSBtYXAgb2YgdmFsaWRhdG9ycy4gVGhlIGtleSBpbnRvCi0JCQkvLyB0aGUgbWFwIGlzIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlIGFuZCB0aGUgdmFsdWUgaXMgdGhlIFZhbGlkYXRvck1ldGFEYXRhCi0JCQkvLyB3aGljaCBkZXNjcmliZXMgdGhlIElWYWxpZGF0b3IuCi0JCQlyZWFkUmVnaXN0cnkoKTsKLQotCQkJLy8gT25jZSBhbGwgb2YgdGhlIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIHJlYWQsIHRoZSBjYWNoZXMgb2YgdGhlCi0JCQkvLyB2YWxpZGF0b3JzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQkJCWJ1aWxkQ2FjaGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYXZlcnNlIG92ZXIgdGhlIGxpc3Qgb2YgVk1EcyB3aGljaCBoYXZlIGJlZW4gYWRkZWQgYW5kIGNyZWF0ZSBjb3BpZXMgb2YgaXQuIFRoZSBjb3BpZXMgYXJlCi0JICogY3JlYXRlZCB0byBpbmNyZWFzZSBydW50aW1lIHBlcmZvcm1hbmNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZENhY2hlKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9pbmRleGVkVmFsaWRhdG9ycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWJ1aWxkUHJvamVjdE5hdHVyZUNhY2hlKHZtZCk7Ci0JCQlidWlsZERlZmF1bHRFbmFibGVkQ2FjaGUodm1kKTsKLQkJfQotCi0JCS8vIE5vdyBhZGQgdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGNvbmZpZ3VyZWQgb24gYWxsIHByb2plY3RzLAotCQkvLyBhbmQgYWxsIHByb2plY3RzIGJ1dCBYLgotCQlhZGRSZW1haW5kZXIoKTsKLQotCQkvLyB0aGlzIHRlbXBvcmFyeSBsaXN0IGlzbid0IG5lZWRlZCBhbnkgbW9yZS4gQWxsIG9mIHRoZSBleGNsdWRlZAotCQkvLyBwcm9qZWN0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHByb2plY3QgbmF0dXJlcyB3aGljaCB0aGV5IGRvbid0IGV4bGN1ZGUuCi0JCV92YWxpZGF0b3JzLnJlbW92ZShFWENMVURFRF9QUk9KRUNUKTsKLQotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuYnVpbGRDYWNoZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoZGVidWcoKSk7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBjYWNoZSBvZiBWTURzIHdoaWNoIGlzIGluZGV4ZWQgYnkgcHJvamVjdCBuYXR1cmUgaWRzLiBJZiB0aGUgdmFsaWRhdG9yIGlzCi0JICogcmVnaXN0ZXJlZCBvbiBhbGwgcHJvamVjdCB0eXBlcywgdGhlIHZtZCdzIHByb2plY3QgbmF0dXJlIGZpbHRlcnMgd2lsbCBiZSBudWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZFByb2plY3ROYXR1cmVDYWNoZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJLy8gQnVpbGQgdGhlIGNhY2hlIHdpdGggdGhlIGlkZW50aWZpZWQgcHJvamVjdCBuYXR1cmVzIGluIHZhbGlkYXRvcnMnCi0JCS8vIGV4dGVuc2lvbnMuCi0JCVZhbGlkYXRvck5hbWVGaWx0ZXJbXSBwcm9qTmF0dXJlSWRzID0gdm1kLmdldFByb2plY3ROYXR1cmVGaWx0ZXJzKCk7Ci0JCVN0cmluZ1tdIGZhY2V0RmlsdGVycyA9IHZtZC5nZXRGYWNldEZpbHRlcnMoKTsKLQkJaWYgKHByb2pOYXR1cmVJZHMgPT0gbnVsbCkgewotCQkJaWYgKGZhY2V0RmlsdGVycyA9PSBudWxsICYmIHZtZC5nZXRFbmFibGVtZW50RXhwcmVzaW9uKCkgPT0gbnVsbCkgewotCQkJCWFkZChVTktOT1dOX1BST0pFQ1QsIHZtZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIG5vbmVJbmNsdWRlZCA9IHRydWU7IC8vIGFzc3VtZSB0aGF0IHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHJvamVjdAotCQkJLy8gbmF0dXJlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qTmF0dXJlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTmFtZUZpbHRlciBwbiA9IHByb2pOYXR1cmVJZHNbaV07Ci0JCQkJaWYgKHBuLmlzSW5jbHVkZSgpKSB7Ci0JCQkJCW5vbmVJbmNsdWRlZCA9IGZhbHNlOwotCQkJCQlhZGQocG4uZ2V0TmFtZUZpbHRlcigpLCB2bWQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5vbmVJbmNsdWRlZCkgewotCQkJCS8vIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBFWENMVURFRCBwcm9qZWN0cwotCQkJCS8vICh0aGF0IGlzLCBhIHZhbGlkYXRvciB3aGljaCBleGNsdWRlcyBwcm9qZWN0IG5hdHVyZXMgYnV0IGRvZXNuJ3QKLQkJCQkvLyBleHBsaWNpdGx5IGluY2x1ZGUgYW55LiBUaGlzIHR5cGUgb2YgdmFsaWRhdG9yIHJ1bnMgb24gYW55IHVucmVjb2duaXplZCAoVU5LTk9XTikKLQkJCQkvLyBwcm9qZWN0cywgYnV0IHRoZSByZXN0IG9mIHRoZSBjYWNoZSBuZWVkcyB0byBiZSBidWlsdCBiZWZvcmUgdGhpcyBpcyBhZGRlZAotCQkJCS8vIHRvIHRoZSBVTktOT1dOIGxpc3QuIFNlZSBhZGRFeGNsdWRlZFJlbWFpbmRlcigpLgotCQkJCWFkZChFWENMVURFRF9QUk9KRUNULCB2bWQpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIEJ1aWxkIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGREZWZhdWx0RW5hYmxlZENhY2hlKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2bWQuaXNFbmFibGVkQnlEZWZhdWx0KCkpIHsKLQkJCV9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdm1kIHRvIHRoZSBsaXN0IG9mIHZhbGlkYXRvcnMsIGluZGV4ZWQgYnkgdmFsaWRhdG9yIGNsYXNzIG5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCV9pbmRleGVkVmFsaWRhdG9ycy5wdXQodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSwgdm1kKTsKLQl9Ci0KLQkvKgotCSAqIFNvbWUgdmFsaWRhdG9ycyBjYW4gcnVuIG9uIGFueSB0eXBlIG9mIHByb2plY3QuIEluIG9yZGVyIHRvIGhhdmUgYSBzdGF0aWMgbGlzdCwgYWRkIHRoZSAiYW55Ci0JICogcHJvamVjdCIgdmFsaWRhdG9ycyB0byBlYWNoICJwcm9qZWN0IG5hdHVyZSIgdmFsaWRhdG9ycycgbGlzdC4gVGhpcyBhdm9pZHMgYWRkaW5nIHRoZSAiYW55Ci0JICogcHJvamVjdCIgdmFsaWRhdG9ycyB0byB0aGUgInByb2plY3QgbmF0dXJlIiB2YWxpZGF0b3JzIGF0IHJ1bnRpbWUsIHdoaWNoIHJlc3VsdHMgaW4KLQkgKiBwZXJmb3JtYW5jZSBzYXZpbmdzLgotCSAqIAotCSAqIFNvbWUgdmFsaWRhdG9ycyBydW4gb24gYW55IHR5cGUgb2YgcHJvamVjdCBidXQgWCwgd2hlcmUgWCBpcyBhbiBleGNsdWRlZCBwcm9qZWN0IG5hdHVyZS4KLQkgKiBUaG9zZSB2YWxpZGF0b3JzIHNob3VsZCBhbHNvIGJlIGFkZGVkIHZpYSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmVtYWluZGVyKCkgewotCQkvLyBGaXJzdCwgYWRkIGFsbCAiY2FuLXJ1bi1vbi1hbnktcHJvamVjdC10eXBlIiB0byBldmVyeSByZWdpc3RlcmVkIHByb2plY3QgbmF0dXJlIHR5cGUgaW4KLQkJLy8gdGhlIGNhY2hlLgotCQlhZGRBbnlSZW1haW5kZXIoKTsKLQotCQkvLyBUaGVuIGFkZCB0aGUgImNhbi1ydW4tb24tYW55LXByb2plY3QtdHlwZS1idXQtWCIgdG8gZXZlcnkgbm9uLVggcmVnaXN0ZXJlZCBwcm9qZWN0IG5hdHVyZQotCQkvLyB0eXBlIGluIHRoZSBjYWNoZS4KLQkJYWRkRXhjbHVkZWRSZW1haW5kZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXhjbHVkZWRSZW1haW5kZXIoKSB7Ci0JCVNldCBleGNsdWRlZFByb2pWbWRzID0gKFNldCkgX3ZhbGlkYXRvcnMuZ2V0KEVYQ0xVREVEX1BST0pFQ1QpOwotCQlpZiAoZXhjbHVkZWRQcm9qVm1kcyA9PSBudWxsKSB7Ci0JCQkvLyBubyBleGNsdWRlZCBwcm9qZWN0IG5hdHVyZXMKLQkJCXJldHVybjsKLQkJfQotCi0JCUl0ZXJhdG9yIGV4SXRlcmF0b3IgPSBleGNsdWRlZFByb2pWbWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChleEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBleEl0ZXJhdG9yLm5leHQoKTsKLQotCQkJYm9vbGVhbiBub25lSW5jbHVkZWQgPSB0cnVlOyAvLyBhc3N1bWUgdGhhdCwgYnkgZGVmYXVsdCwgaWYgc29tZW9uZSBleHBsaWNpdGx5IGV4Y2x1ZGVzCi0JCQkvLyBhIHByb2plY3QgbmF0dXJlIHRoZW4gdGhleSBkb24ndCBpbmNsdWRlIGFueSBwcm9qZWN0Ci0JCQkvLyBuYXR1cmVzCi0JCQlTZXQga2V5cyA9IF92YWxpZGF0b3JzLmtleVNldCgpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHByb2pJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAocHJvaklkLmVxdWFscyhVTktOT1dOX1BST0pFQ1QpIHx8IHByb2pJZC5lcXVhbHMoRVhDTFVERURfUFJPSkVDVCkpIHsKLQkJCQkJLy8gRG9uJ3QgYWRkIGxpc3QgdG8gYSBwcm9qZWN0IG5hdHVyZSB3aGljaCBpcyBleGNsdWRlZCBvciBhcHBsaWNhYmxlIHRvIGFsbC4KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJVmFsaWRhdG9yTmFtZUZpbHRlciBmaWx0ZXIgPSB2bWQuZmluZFByb2plY3ROYXR1cmUocHJvaklkKTsKLQkJCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQkJLy8gRG9uJ3QgYWRkIGxpc3QgdG8gaXRzZWxmIChmaWx0ZXIuaXNJbmNsdWRlZCgpID09IHRydWUpIG9yCi0JCQkJCS8vIHRvIGEgbGlzdCBmcm9tIHdoaWNoIGl0J3MgZXhjbHVkZWQgKGZpbHRlci5pc0luY2x1ZGVkKCkgPT0gZmFsc2UpCi0JCQkJCWlmIChmaWx0ZXIuaXNJbmNsdWRlKCkpIHsKLQkJCQkJCW5vbmVJbmNsdWRlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWFkZChwcm9qSWQsIHZtZCk7Ci0JCQl9Ci0KLQkJCWlmIChub25lSW5jbHVkZWQpIHsKLQkJCQkvLyBBdCB0aGlzIHBvaW50LCB0aGUgImNhbi1ydW4tb24tYW55LXByb2plY3QiIGJlY29tZXMKLQkJCQkvLyAibm90LWV4Y2x1ZGVkLW9uLXRoZXNlLXByb2plY3RzIi4gVGhhdCBpcywgaWYgdGhlIHByb2plY3QKLQkJCQkvLyBuYXR1cmUgaWQgaXNuJ3QgaW4gdGhlIGxpc3Qgb2YgX3ZhbGlkYXRvcnMsIHRoZW4gaXQgaXNuJ3QKLQkJCQkvLyBpbmNsdWRlZCBvciBleGNsdWRlZCBieSBhbnkgdmFsaWRhdG9ycywgc28gYWxsIHZhbGlkYXRvcnMKLQkJCQkvLyB3aGljaCBjYW4gcnVuIG9uIGFueSBwcm9qZWN0IEFORCBhbGwgdmFsaWRhdG9ycyB3aGljaCBjYW4KLQkJCQkvLyBydW4gb24gYW55IGJ1dCBjZXJ0YWluIGV4Y2x1ZGVkIHByb2plY3RzIGNhbiBydW4gb24gdGhlCi0JCQkJLy8gZ2l2ZW4gSVByb2plY3QuCi0JCQkJYWRkKFVOS05PV05fUFJPSkVDVCwgdm1kKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBbnlSZW1haW5kZXIoKSB7Ci0JCVNldCBhbnlQcm9qVm1kcyA9IChTZXQpIF92YWxpZGF0b3JzLmdldChVTktOT1dOX1BST0pFQ1QpOwotCQlpZiAoYW55UHJvalZtZHMgPT0gbnVsbCkgewotCQkJLy8gbm8gdmFsaWRhdG9ycyBydW4gb24gYWxsIHByb2plY3RzCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTZXQga2V5cyA9IF92YWxpZGF0b3JzLmtleVNldCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHByb2pJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChwcm9qSWQuZXF1YWxzKFVOS05PV05fUFJPSkVDVCkgfHwgcHJvaklkLmVxdWFscyhFWENMVURFRF9QUk9KRUNUKSkgewotCQkJCS8vIERvbid0IGFkZCBsaXN0IHRvIGl0c2VsZiBvciB0byBhIHByb2plY3QgbmF0dXJlIHdoaWNoIGlzIGV4Y2x1ZGVkLgotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlhZGQocHJvaklkLCBhbnlQcm9qVm1kcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBwcm9qZWN0TmF0dXJlSWQsIFNldCB2bWRMaXN0KSB7Ci0JCWlmICgodm1kTGlzdCA9PSBudWxsKSB8fCAodm1kTGlzdC5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNldCBwblZhbCA9IGNyZWF0ZVNldChwcm9qZWN0TmF0dXJlSWQpOyAvLyB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgaW5jbHVkZXMgb3IgZXhjbHVkZXMgdGhpcwotCQkvLyBwcm9qZWN0IG5hdHVyZSBpZCwgbWFrZSBzdXJlIHRoYXQgYW4gZW50cnkgaXMKLQkJLy8gY3JlYXRlZCBmb3IgaXQgaW4gdGhlIHRhYmxlCi0JCXBuVmFsLmFkZEFsbCh2bWRMaXN0KTsKLQkJX3ZhbGlkYXRvcnMucHV0KHByb2plY3ROYXR1cmVJZCwgcG5WYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGQoU3RyaW5nIHByb2plY3ROYXR1cmVJZCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU2V0IHBuVmFsID0gY3JlYXRlU2V0KHByb2plY3ROYXR1cmVJZCk7IC8vIHdoZXRoZXIgdGhlIHZhbGlkYXRvciBpbmNsdWRlcyBvciBleGNsdWRlcyB0aGlzCi0JCS8vIHByb2plY3QgbmF0dXJlIGlkLCBtYWtlIHN1cmUgdGhhdCBhbiBlbnRyeSBpcwotCQkvLyBjcmVhdGVkIGZvciBpdCBpbiB0aGUgdGFibGUKLQkJcG5WYWwuYWRkKHZtZCk7Ci0JCV92YWxpZGF0b3JzLnB1dChwcm9qZWN0TmF0dXJlSWQsIHBuVmFsKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGEgdmFsaWRhdG9yJ3MgY2xhc3Mgb3IgaGVscGVyIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQsIHRoZSB2bWQgY2FsbHMgdGhpcyBtZXRob2QgdG8KLQkgKiBkaXNhYmxlIHRoZSB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3Igd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2UgcGFnZSwgcHJvcGVydGllcwotCSAqIHBhZ2UsIGFuZCBlbmFibGVkIGxpc3Qgb2YgYW55IHByb2plY3QgdGhlcmVhZnRlciB2YWxpZGF0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRvcihWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX2luZGV4ZWRWYWxpZGF0b3JzLnJlbW92ZSh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycy5yZW1vdmUodm1kKTsKLQotCQkvLyBUaGUgd2hvbGUgIm9uLWFueS1wcm9qZWN0IiBhbmQgImV4Y2x1ZGUtdGhpcy1wcm9qZWN0LW5hdHVyZSIgd291bGQgdGFrZQotCQkvLyBhIGxvdCBvZiBwcm9jZXNzaW5nIHRpbWUuLi4gSW5zdGVhZCwgdHJhdmVyc2UgdGhlIGxpc3Qgb2YgcHJvaiBuYXR1cmUgaWRzLAotCQkvLyBhbmQgc2VhcmNoIHRoZSBTZXQgb2YgdGhhdCBwcm9qIG5hdHVyZSBpZCwgYW5kIHJlbW92ZSB0aGUgdm1kIGlmIGl0J3MgaW4gdGhlCi0JCS8vIFNldC4KLQkJT2JqZWN0W10ga2V5cyA9IF92YWxpZGF0b3JzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5c1tpXTsKLQkJCVNldCB2YWx1ZSA9IChTZXQpIF92YWxpZGF0b3JzLmdldChrZXkpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHZhbHVlLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQl2YWx1ZS5yZW1vdmUodm1kKTsKLQkJCQlfdmFsaWRhdG9ycy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNldCBjcmVhdGVTZXQoU3RyaW5nIHByb2pOYXR1cmUpIHsKLQkJU2V0IHYgPSAoU2V0KSBfdmFsaWRhdG9ycy5nZXQocHJvak5hdHVyZSk7Ci0JCWlmICh2ID09IG51bGwpIHsKLQkJCXYgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCwgaWYgaXQgaGFzIGEgcHJvamVjdCBuYXR1cmUocykgc3BlY2lmaWVkLCByZXR1cm4gdGhlCi0JICogVmFsaWRhdG9yTmFtZUZpbHRlcnMgd2hpY2ggcmVwcmVzZW50IHRob3NlIG5hdHVyZXMuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBBIHByb2plY3QgbmF0dXJlIGNhbiBiZSBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCB0byBpbmRpY2F0ZSB3aGF0IHR5cGVzIG9mIElQcm9qZWN0cyBhCi0JICogdmFsaWRhdG9yIGNhbiBydW4gb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBZ2dyZWdhdGVWYWxpZGF0b3JzTmFtZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmlsdGVycyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0FHR1JFR0FURV9WQUxJREFUT1JTKTsKLQkJaWYgKGZpbHRlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbZmlsdGVycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBJbiBvcmRlciB0byBzcGVlZCB1cCBvdXIgU3RyaW5nIGNvbXBhcmlzb25zLCBsb2FkIHRoZXNlCi0JCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCQkvLyB1c2UgcG9pbnRlciBjb21wYXJpc29uIGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsCi0JCQkvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNvbXBhcmlzb24uIFNpbmNlIHRoZXNlIG5hbWVzIHNob3VsZAotCQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCQkvLyBzZXRzIHRoZW0gb25seSBvbmNlLCBpdCBpcyBzYWZlIHRvIGRlY2xhcmUgdGhlc2UgU3RyaW5ncwotCQkJLy8gY29uc3RhbnRzLgotCQkJLy8KLQkJCS8vIFRvIGxvYWQgYSBTdHJpbmcgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLCBjYWxsIGludGVybigpIG9uIHRoZSBTdHJpbmcuCi0JCQkvLwotCQkJU3RyaW5nIG5hbWVGaWx0ZXIgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkJaWYgKG5hbWVGaWx0ZXIgIT0gbnVsbCkgewotCQkJCW5hbWVGaWx0ZXIgPSBuYW1lRmlsdGVyLmludGVybigpOwotCQkJfQotCQkJbmFtZXNbaV0gPSBuYW1lRmlsdGVyOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb250ZW50VHlwZUJpbmRpbmdzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KXsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYmluZGluZ3MgPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19DT05URU5UVFlQRSk7Ci0JCWlmKGJpbmRpbmdzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdIGNUeXBlSURzID0gbmV3IFN0cmluZ1tiaW5kaW5ncy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSArKyl7Ci0JCQkKLQkJCWNUeXBlSURzW2ldID0gYmluZGluZ3NbaV0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UVFlQRUlEKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNUeXBlSURzOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCBpZiBpdCBoYXMgYW55IGZpbHRlciB0YWdzLCBjb25zdHJ1Y3QgdGhlCi0JICogYXBwcm9wcmlhdGUgVmFsaWRhdG9yRmlsdGVycyB0byByZXByZXNlbnQgdGhvc2UgdGFnczsgZWxzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBBIGZpbHRlciBjYW4gYmUgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgdG8gZmlsdGVyIG91dCBjZXJ0YWluIHJlc291cmNlcy4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvckZpbHRlcltdIGdldEZpbHRlcnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmlsdGVycyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0ZJTFRFUik7Ci0JCWlmIChmaWx0ZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVmFsaWRhdG9yRmlsdGVyW10gdmYgPSBuZXcgVmFsaWRhdG9yRmlsdGVyW2ZpbHRlcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2ZltpXSA9IG5ldyBWYWxpZGF0b3JGaWx0ZXIoSVJFU09VUkNFKTsKLQotCQkJLy8gSW4gb3JkZXIgdG8gc3BlZWQgdXAgb3VyIFN0cmluZyBjb21wYXJpc29ucywgbG9hZCB0aGVzZQotCQkJLy8gbmFtZXMgaW50byBKYXZhJ3MgY29uc3RhbnRzIHNwYWNlLiBUaGlzIHdheSwgd2UnbGwgYmUgYWJsZSB0bwotCQkJLy8gdXNlIHBvaW50ZXIgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIHRoZSB0cmFkaXRpb25hbAotCQkJLy8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjb21wYXJpc29uLiBTaW5jZSB0aGVzZSBuYW1lcyBzaG91bGQKLQkJCS8vIG5ldmVyIGJlIHNldCBieSBhbnlvbmUgb3RoZXIgdGhhbiB0aGlzIGNsYXNzLCBhbmQgdGhpcyBjbGFzcwotCQkJLy8gc2V0cyB0aGVtIG9ubHkgb25jZSwgaXQgaXMgc2FmZSB0byBkZWNsYXJlIHRoZXNlIFN0cmluZ3MKLQkJCS8vIGNvbnN0YW50cy4KLQkJCS8vCi0JCQkvLyBUbyBsb2FkIGEgU3RyaW5nIGludG8gdGhlIGNvbnN0YW50cyBzcGFjZSwgY2FsbCBpbnRlcm4oKSBvbiB0aGUgU3RyaW5nLgotCQkJLy8KLQkJCVN0cmluZyBuYW1lRmlsdGVyID0gZmlsdGVyc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX05BTUVfRklMVEVSKTsKLQkJCWlmIChuYW1lRmlsdGVyICE9IG51bGwpIHsKLQkJCQluYW1lRmlsdGVyID0gbmFtZUZpbHRlci5pbnRlcm4oKTsKLQkJCX0KLQkJCVN0cmluZyBpc0Nhc2VTZW5zaXRpdmUgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfQ0FTRV9TRU5TSVRJVkUpOwotCQkJdmZbaV0uc2V0TmFtZUZpbHRlcihuYW1lRmlsdGVyLCBpc0Nhc2VTZW5zaXRpdmUpOwotCi0JCQlTdHJpbmcgb2JqZWN0Q2xhc3MgPSBmaWx0ZXJzW2ldLmdldEF0dHJpYnV0ZShBVFRfT0JKRUNUX0NMQVNTKTsKLQkJCWlmIChvYmplY3RDbGFzcyAhPSBudWxsKSB7Ci0JCQkJb2JqZWN0Q2xhc3MgPSBvYmplY3RDbGFzcy5pbnRlcm4oKTsKLQkJCX0KLQkJCXZmW2ldLnNldFR5cGVGaWx0ZXIob2JqZWN0Q2xhc3MpOwotCi0JCQlTdHJpbmcgYWN0aW9uRmlsdGVyID0gZmlsdGVyc1tpXS5nZXRBdHRyaWJ1dGUoQVRUX0FDVElPTl9GSUxURVIpOwotCQkJaWYgKGFjdGlvbkZpbHRlciAhPSBudWxsKSB7Ci0JCQkJYWN0aW9uRmlsdGVyID0gYWN0aW9uRmlsdGVyLmludGVybigpOwotCQkJfQotCQkJdmZbaV0uc2V0QWN0aW9uRmlsdGVyKGFjdGlvbkZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIHZmOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERlcGVuZGVudFZhbGlkYXRvclZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGRlcFZhbGlkYXRvckVsZW1lbnQgPSBlbGVtZW50LmdldENoaWxkcmVuKERFUF9WQUxJREFUT1IpOwotCQlpZiAoZGVwVmFsaWRhdG9yRWxlbWVudC5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGRlcFZhbHVlID0gZGVwVmFsaWRhdG9yRWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoREVQX1ZBTF9WQUxVRSk7Ci0JCWJvb2xlYW4gZGVwQm9vbFZhbHVlID0gKG5ldyBCb29sZWFuKGRlcFZhbHVlKSkuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiBkZXBCb29sVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtYXJrZXIgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRNYXJrZXJJZHNWYWx1ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtYXJrZXJJZCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oTUFSS0VSX0lEKTsKLQkJaWYgKG1hcmtlcklkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBtYXJrZXJJZHNbXSA9IG5ldyBTdHJpbmdbbWFya2VySWQubGVuZ3RoXTsKLQkJZm9yKGludCBpID0gMDsgaSA8IG1hcmtlcklkcy5sZW5ndGg7IGkrKykgewotCQkJbWFya2VySWRzW2ldID0gbWFya2VySWRbaV0uZ2V0QXR0cmlidXRlKE1BUktFUl9JRF9WQUxVRSk7Ci0JCX0KLQkJcmV0dXJuIG1hcmtlcklkczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEZhY2V0SWRzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY2V0cyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRkFDRVQpOwotCQlpZiAoZmFjZXRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ1tdIGZhY2V0SWRzID0gbmV3IFN0cmluZ1tmYWNldHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWNldHMubGVuZ3RoOyBpKyspIHsKLQkJCWZhY2V0SWRzW2ldID0gZmFjZXRzW2ldLmdldEF0dHJpYnV0ZShGQUNFVF9JRCk7Ci0JCX0KLQkJcmV0dXJuIGZhY2V0SWRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaGVscGVyIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVZhbGlkYXRvci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRIZWxwZXJOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGhlbHBlcnMgPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19IRUxQRVJfQ0xBU1MpOwotCQlpZiAoaGVscGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBoZWxwZXJzWzBdLmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCX0KLQotCS8qIHBhY2thZ2UgKi9zdGF0aWMgSVdvcmtiZW5jaENvbnRleHQgY3JlYXRlSGVscGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lKSB7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IHdoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdoID0gKElXb3JrYmVuY2hDb250ZXh0KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oVEFHX0hFTFBFUl9DTEFTUyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5jcmVhdGVIZWxwZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TWU5UQVhfTk9fSEVMUEVSX1RIUk9XQUJMRSk7Ci0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX0hFTFBFUl9USFJPV0FCTEUpLCBuZXcgU3RyaW5nW117aGVscGVyQ2xhc3NOYW1lfSk7Ci0JCQkJZW50cnkuc2V0VGV4dChyZXN1bHQpOwkJCQkKLQkJCQkvL2VudHJ5LnNldFRva2VucyhuZXcgU3RyaW5nW117aGVscGVyQ2xhc3NOYW1lfSk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHdoOwotCX0KLQotCS8qIHBhY2thZ2UgKi9zdGF0aWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQl0cnkgewotCQkJdmFsaWRhdG9yID0gKElWYWxpZGF0b3IpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlEKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9USFJPV0FCTEUpOwotCQkJCS8vZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19TWU5UQVhfTk9fVkFMX1RIUk9XQUJMRSksIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQkJCQllbnRyeS5zZXRUZXh0KHJlc3VsdCk7CQkJCQotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCi0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5jcmVhdGVWYWxpZGF0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlEKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9OVUxMKTsKLQkJCQllbnRyeS5zZXRUb2tlbnMobmV3IFN0cmluZ1tde3ZhbGlkYXRvckNsYXNzTmFtZX0pOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZyb20gcGx1Z2luLnhtbCwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3IgaXMKLQkgKiBlbmFibGVkIGJ5IGRlZmF1bHQuCi0JICogCi0JICogSWYgbm8gZW5hYmxlZCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCwgdHJ1ZSAoaS5lLiwgZW5hYmxlZCkgaXMgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEVuYWJsZWRCeURlZmF1bHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcnVuQ2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKFRBR19SVU5fQ0xBU1MpOwotCQkvLyBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHJ1bkNoaWxkcmVuIGlzIG51bGwgb3IgZW1wdHksIGJlY2F1c2UgdGhhdCB3YXMgY2hlY2tlZCBpbiB0aGUKLQkJLy8gaW5pdGlhbGl6ZVZhbGlkYXRvciBtZXRob2QuCi0KLQkJU3RyaW5nIGluYyA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfRU5BQkxFRCk7Ci0JCWlmIChpbmMgPT0gbnVsbCkgewotCQkJcmV0dXJuIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9FTkFCTEVEX0RFRkFVTFQ7Ci0JCX0KLQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGluYy50cmltKCkudG9Mb3dlckNhc2UoKSkuYm9vbGVhblZhbHVlKCk7IC8vIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZQotCQkvLyBpZiwgYW5kIG9ubHkgaWYsIHRoZQotCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkJLy8gInRydWUiLiBGb3IgZXhhbXBsZSwKLQkJLy8gInllcyIgd2lsbCBiZSBjb25zaWRlcmVkCi0JCS8vICJmYWxzZSIuCi0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZyb20gcGx1Z2luLnhtbCwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMKLQkgKiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIG5vIGluY3JlbWVudGFsIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0LCB0cnVlIChpLmUuLCBpbmNyZW1lbnRhbCBpcyBzdXBwb3J0ZWQpCi0JICogaXMgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGdldEluY3JlbWVudGFsKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBydW5DaGlsZHJlbiBpcyBudWxsIG9yIGVtcHR5LCBiZWNhdXNlIHRoYXQgd2FzIGNoZWNrZWQgaW4gdGhlCi0JCS8vIGluaXRpYWxpemVWYWxpZGF0b3IgbWV0aG9kLgotCi0JCVN0cmluZyBpbmMgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX0lOQ1JFTUVOVEFMKTsKLQkJaWYgKGluYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX0lOQ1JFTUVOVEFMX0RFRkFVTFQ7Ci0JCX0KLQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGluYy50cmltKCkudG9Mb3dlckNhc2UoKSkuYm9vbGVhblZhbHVlKCk7IC8vIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZQotCQkvLyBpZiwgYW5kIG9ubHkgaWYsIHRoZQotCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkJLy8gInRydWUiLiBGb3IgZXhhbXBsZSwKLQkJLy8gInllcyIgd2lsbCBiZSBjb25zaWRlcmVkCi0JCS8vICJmYWxzZSIuCi0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZyb20gcGx1Z2luLnhtbCwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB2YWxpZGF0b3Igc3VwcG9ydHMKLQkgKiBmdWxsIGJ1aWxkIHZhbGlkYXRpb24uCi0JICogCi0JICogSWYgbm8gaW5jcmVtZW50YWwgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQsIHRydWUgKGkuZS4sIGluY3JlbWVudGFsIGlzIHN1cHBvcnRlZCkKLQkgKiBpcyByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RnVsbEJ1aWxkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBpZiBydW5DaGlsZHJlbiBpcyBudWxsIG9yIGVtcHR5LCBiZWNhdXNlIHRoYXQgd2FzIGNoZWNrZWQgaW4gdGhlCi0JCS8vIGluaXRpYWxpemVWYWxpZGF0b3IgbWV0aG9kLgotCi0JCVN0cmluZyBmYiA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfRlVMTEJVSUxEKTsKLQkJaWYgKGZiID09IG51bGwpIHsKLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfRlVMTEJVSUxEX0RFRkFVTFQ7Ci0JCX0KLQotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGZiLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5ib29sZWFuVmFsdWUoKTsgLy8gdGhpcyB3aWxsIHJldHVybiB0cnVlIGlmLAotCQkvLyBhbmQgb25seSBpZiwgdGhlCi0JCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCQkvLyAidHJ1ZSIuIEZvciBleGFtcGxlLAotCQkvLyAieWVzIiB3aWxsIGJlIGNvbnNpZGVyZWQKLQkJLy8gImZhbHNlIi4KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZnJvbSBwbHVnaW4ueG1sLCByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHZhbGlkYXRvciBzdXBwb3J0cwotCSAqIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIG5vIGFzeW5jIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0LCB0cnVlIChpLmUuLCB0aGUgdmFsaWRhdG9yIGlzIHRocmVhZC1zYWZlKSBpcwotCSAqIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRBc3luYyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgcnVuQ2hpbGRyZW4gaXMgbnVsbCBvciBlbXB0eSwgYmVjYXVzZSB0aGF0IHdhcyBjaGVja2VkIGluIHRoZQotCQkvLyBpbml0aWFsaXplVmFsaWRhdG9yIG1ldGhvZC4KLQotCQlTdHJpbmcgYXN5bmMgPSBydW5DaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoQVRUX0FTWU5DKTsKLQkJaWYgKGFzeW5jID09IG51bGwpIHsKLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfQVNZTkNfREVGQVVMVDsKLQkJfQotCi0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYXN5bmMudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmJvb2xlYW5WYWx1ZSgpOyAvLyB0aGlzIHdpbGwgcmV0dXJuIHRydWUKLQkJLy8gaWYsIGFuZCBvbmx5IGlmLCB0aGUKLQkJLy8gYXR0cmlidXRlIHZhbHVlIGlzCi0JCS8vICJ0cnVlIi4gRm9yIGV4YW1wbGUsCi0JCS8vICJ5ZXMiIHdpbGwgYmUKLQkJLy8gY29uc2lkZXJlZCAiZmFsc2UiLgotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCBmcm9tIHBsdWdpbi54bWwsIHJldHVybiB0aGUgdHlwZXMgb2YgdmFsaWRhdGlvbiBwYXNzZXMsIGFzCi0JICogZGVmaW5lZCBpbiBJUnVsZUdyb3VwLCB0aGF0IHRoZSB2YWxpZGF0b3IgcGVyZm9ybXMuCi0JICogCi0JICogSWYgbm8gcGFzcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCwgSVJ1bGVHcm91cC5QQVNTX0ZVTEwsIGlzIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgaW50IGdldFJ1bGVHcm91cChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBydW5DaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1JVTl9DTEFTUyk7Ci0JCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgcnVuQ2hpbGRyZW4gaXMgbnVsbCBvciBlbXB0eSwgYmVjYXVzZSB0aGF0IHdhcyBjaGVja2VkIGluIHRoZQotCQkvLyBpbml0aWFsaXplVmFsaWRhdG9yIG1ldGhvZC4KLQotCQlTdHJpbmcgcGFzcyA9IHJ1bkNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZShBVFRfUlVMRV9HUk9VUCk7Ci0JCWlmIChwYXNzID09IG51bGwpIHsKLQkJCXJldHVybiBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxUOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhc3MsIENPTU1BLCBmYWxzZSk7IC8vIGZhbHNlIG1lYW5zIGRvbid0Ci0JCS8vIHJldHVybiB0aGUgY29tbWEgYXMKLQkJLy8gcGFydCBvZiB0aGUgc3RyaW5nCi0JCWludCByZXN1bHQgPSAwOyAvLyBubyBwYXNzZXMgaWRlbnRpZmllZAotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIG5leHRBY3Rpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKG5leHRBY3Rpb24uZXF1YWxzKElSdWxlR3JvdXAuUEFTU19GQVNUX05BTUUpKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0IHwgSVJ1bGVHcm91cC5QQVNTX0ZBU1Q7Ci0JCQl9IGVsc2UgaWYgKG5leHRBY3Rpb24uZXF1YWxzKElSdWxlR3JvdXAuUEFTU19GVUxMX05BTUUpKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0IHwgSVJ1bGVHcm91cC5QQVNTX0ZVTEw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCS8vIE5vIHJlY29nbml6ZWQgcGFzc2VzLiBSZXR1cm4gdGhlIGRlZmF1bHQuCi0JCQlyZXR1cm4gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YS5NaWdyYXRpb25NZXRhRGF0YSBnZXRNaWdyYXRpb25NZXRhRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfTUlHUkFURSk7Ci0JCWlmICgocnVuQ2hpbGRyZW4gPT0gbnVsbCkgfHwgKHJ1bkNoaWxkcmVuLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBPbmx5IHN1cHBvc2VkIHRvIGJlIG9uZSAibWlncmF0ZSIgc2VjdGlvbiBpbiBhIHZhbGlkYXRvciwgc28gaWdub3JlIHRoZSByZXN0Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBtaWdyYXRlID0gcnVuQ2hpbGRyZW5bMF07Ci0KLQkJLy8gTm93IGxvb2sgZm9yIHRoZSAidmFsaWRhdG9yIiBlbGVtZW50cy4gWmVybyBvciBtb3JlIGNhbiBiZSBzcGVjaWZpZWQuCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1pZ3JhdGVDaGlsZHJlbiA9IG1pZ3JhdGUuZ2V0Q2hpbGRyZW4oVEFHX1ZBTElEQVRPUik7Ci0JCWlmICgobWlncmF0ZUNoaWxkcmVuID09IG51bGwpIHx8IChtaWdyYXRlQ2hpbGRyZW4ubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhLk1pZ3JhdGlvbk1ldGFEYXRhIG1tZCA9IHZtZC5uZXcgTWlncmF0aW9uTWV0YURhdGEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaWdyYXRlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtaWdyYXRlQ2hpbGQgPSBtaWdyYXRlQ2hpbGRyZW5baV07Ci0JCQlTdHJpbmcgZnJvbSA9IG1pZ3JhdGVDaGlsZC5nZXRBdHRyaWJ1dGUoQVRUX0ZST00pOwotCQkJaWYgKGZyb20gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgdG8gPSBtaWdyYXRlQ2hpbGQuZ2V0QXR0cmlidXRlKEFUVF9UTyk7Ci0JCQlpZiAodG8gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbW1kLmFkZElkKGZyb20sIHRvKTsKLQkJfQotCQlyZXR1cm4gbW1kOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElDb25maWd1cmF0aW9uRWxlbWVudCwgaWYgaXQgaGFzIGEgcHJvamVjdCBuYXR1cmUocykgc3BlY2lmaWVkLCByZXR1cm4gdGhlCi0JICogVmFsaWRhdG9yTmFtZUZpbHRlcnMgd2hpY2ggcmVwcmVzZW50IHRob3NlIG5hdHVyZXMuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBBIHByb2plY3QgbmF0dXJlIGNhbiBiZSBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCB0byBpbmRpY2F0ZSB3aGF0IHR5cGVzIG9mIElQcm9qZWN0cyBhCi0JICogdmFsaWRhdG9yIGNhbiBydW4gb24uCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JOYW1lRmlsdGVyW10gZ2V0UHJvamVjdE5hdHVyZUZpbHRlcnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmlsdGVycyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1BST0pFQ1RfTkFUVVJFKTsKLQkJaWYgKGZpbHRlcnMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFsaWRhdG9yTmFtZUZpbHRlcltdIHZmID0gbmV3IFZhbGlkYXRvck5hbWVGaWx0ZXJbZmlsdGVycy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZmW2ldID0gbmV3IFZhbGlkYXRvck5hbWVGaWx0ZXIoKTsKLQkJCS8vIEluIG9yZGVyIHRvIHNwZWVkIHVwIG91ciBTdHJpbmcgY29tcGFyaXNvbnMsIGxvYWQgdGhlc2UKLQkJCS8vIG5hbWVzIGludG8gSmF2YSdzIGNvbnN0YW50cyBzcGFjZS4gVGhpcyB3YXksIHdlJ2xsIGJlIGFibGUgdG8KLQkJCS8vIHVzZSBwb2ludGVyIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgdHJhZGl0aW9uYWwKLQkJCS8vIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY29tcGFyaXNvbi4gU2luY2UgdGhlc2UgbmFtZXMgc2hvdWxkCi0JCQkvLyBuZXZlciBiZSBzZXQgYnkgYW55b25lIG90aGVyIHRoYW4gdGhpcyBjbGFzcywgYW5kIHRoaXMgY2xhc3MKLQkJCS8vIHNldHMgdGhlbSBvbmx5IG9uY2UsIGl0IGlzIHNhZmUgdG8gZGVjbGFyZSB0aGVzZSBTdHJpbmdzCi0JCQkvLyBjb25zdGFudHMuCi0JCQkvLwotCQkJLy8gVG8gbG9hZCBhIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UsIGNhbGwgaW50ZXJuKCkgb24gdGhlIFN0cmluZy4KLQkJCS8vCi0JCQlTdHJpbmcgbmFtZUZpbHRlciA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJbmFtZUZpbHRlciA9IG5hbWVGaWx0ZXIuaW50ZXJuKCk7Ci0JCQl9Ci0JCQl2ZltpXS5zZXROYW1lRmlsdGVyKG5hbWVGaWx0ZXIpOwotCi0JCQlTdHJpbmcgaW5jbHVkZSA9IGZpbHRlcnNbaV0uZ2V0QXR0cmlidXRlKEFUVF9JTkNMVURFKTsKLQkJCXZmW2ldLnNldEluY2x1ZGUoaW5jbHVkZSk7Ci0JCX0KLQkJcmV0dXJuIHZmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKSB7Ci0JCQlpbnN0ID0gbmV3IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpOwotCi0JCQlFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLnNldEFjdGl2ZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7Ci0JCS8vIFdoZXRoZXIgdGhlIHJlZ2lzdHJ5IGhhcyBiZWVuIHJlYWQgb3Igbm90IGlzIGtlcHQgaW4gdGhlIEV2ZW50TWFuYWdlcgotCQkvLyBjbGFzcyBpbnN0ZWFkIG9mIHRoaXMgY2xhc3MgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgYSBzaHV0ZG93biBwcm9ibGVtLgotCQkvLyBTZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGlzQWN0aXZlKCkgbWV0aG9kIG9mIHRoZSBFdmVudE1hbmFnZXIgY2xhc3MKLQkJLy8gZm9yIGRldGFpbHMuCi0JCXJldHVybiBFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQWN0aXZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVmFsaWRhdG9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXByaXZhdGUgSUV4dGVuc2lvblBvaW50IGdldFZhbGlkYXRvckV4dGVuc2lvblBvaW50KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFZBTElEQVRPUl9FWFRfUFRfSUQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhpcyBoYXBwZW5zIGl0IG1lYW5zIHRoYXQgc29tZW9uZSByZW1vdmVkIHRoZSAidmFsaWRhdG9yIiBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFZhbGlkYXRvckV4dGVuc2lvblBvaW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSUQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19NSVNTSU5HX1ZBTElEQVRPUl9FUCk7Ci0JCQkJLy9lbnRyeS5zZXRUb2tlbnMobmV3IFN0cmluZ1tde1ZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX0VYVF9QVF9JRH0pOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfTUlTU0lOR19WQUxJREFUT1JfRVApLAotCQkJCQkJbmV3IFN0cmluZ1tde1ZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX0VYVF9QVF9JRH0pOwotCQkJCWVudHJ5LnNldFRleHQocmVzdWx0KTsJCQotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCX0KLQotCS8qKgotCSAqIEl0J3Mgb2theSB0byByZXR1cm4gYSBoYW5kbGUgdG8gdGhlIFZhbGlkYXRvck1ldGFEYXRhIGJlY2F1c2UgdGhlIHZtZCBjYW4ndCBiZSBtb2RpZmllZCBieQotCSAqIGFueSBjb2RlIG5vdCBpbiB0aGlzIHBhY2thZ2UuCi0JICovCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCS8vIHJldHJpZXZhbCB3aWxsIGJlIGluIGxvZyhuKSB0aW1lCi0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFZhbGlkYXRvck1ldGFEYXRhKElWYWxpZGF0b3IpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IsIG5ldyBTdHJpbmdbXXsibnVsbCJ9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUgPSB2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCWlmICh2bWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZtZDsKLQkJfQotCi0JCS8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIHZtZCBpcyBuZWl0aGVyIGEgcm9vdCBub3IgYW4gYWdncmVnYXRlIHZhbGlkYXRvciwKLQkJLy8geWV0IHRoZSBJVmFsaWRhdG9yIGV4aXN0cy4gSW50ZXJuYWwgZXJyb3IuCi0JCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRWYWxpZGF0b3JNZXRhRGF0YShJVmFsaWRhdG9yKSIpOyAvLyROT04tTkxTLTEkCi0JCQllbnRyeS5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfT1JQSEFOX0lWQUxJREFUT1IsIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KSk7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNldCBnZXRWYWxpZGF0b3JNZXRhRGF0YShJV29ya3NwYWNlUm9vdCByb290KSB7Ci0JCS8vIEV2ZXJ5IHZhbGlkYXRvciBvbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSBtdXN0IGJlIHJldHVybmVkCi0JCVNldCBjb3B5ID0gbmV3IEhhc2hTZXQoKTsKLQkJY2xvbmUoX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpLCBjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0b3JzIGNvbmZpZ3VyZWQgb24gYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QgKGUuZy4gRUpCIFByb2plY3QKLQkgKiB2cy4gV2ViIFByb2plY3QpLgotCSAqIAotCSAqIFRoaXMgaXMgYSBsb25nLXJ1bm5pbmcgcHJvY2Vzcy4gSWYgeW91IGNhbiwgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0IGNvcHkgPSBuZXcgSGFzaFNldCgpOwotCQlnZXRWYWxpZGF0b3JNZXRhRGF0YShwcm9qZWN0LCBjb3B5KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogQ29weSB0aGUgc2V0IG9mIGNvbmZpZ3VyZWQgdmFsaWRhdG9yIG1ldGFkYXRhIGludG8gdGhlIFNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCBwcm9qZWN0LCBTZXQgdm1kcykgewotCQlpZiAodm1kcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdm1kcy5jbGVhcigpOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0VmFsaWRhdG9yTWV0YURhdGEoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUZXh0KCJJUHJvamVjdCBpcyAiICsgU3RyaW5nLnZhbHVlT2YocHJvamVjdCkpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQkJfQotCQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDE7Ci0JCQkJLy8gdm1kcyBpcyBhbHJlYWR5IGNsZWFyCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nW10gcHJvamVjdE5hdHVyZXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwcm9qZWN0TmF0dXJlcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXROYXR1cmVJZHMoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLQkJCQkvLyB2bWRzIGlzIGFscmVhZHkgY2xlYXIKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0VmFsaWRhdG9yTWV0YURhdGEoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gSWYgdGhlcmUgYXJlIG5vIHByb2plY3QgbmF0dXJlcyBvbiBhIHBhcnRpY3VsYXIgcHJvamVjdCwKLQkJCS8vIG9yIGlmIHRoaXMgcHJvamVjdCBuYXR1cmUgaGFzIG5vIHZhbGlkYXRvcnMgY29uZmlndXJlZAotCQkJLy8gb24gaXQsIHJldHVybiB0aGUgdmFsaWRhdG9ycyB3aGljaCBhcmUgY29uZmlndXJlZCBvbiBhbGwKLQkJCS8vIHByb2plY3RzLgotCQkJaWYgKChwcm9qZWN0TmF0dXJlcyA9PSBudWxsKSB8fCAocHJvamVjdE5hdHVyZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCQkKLQkJCQkvLyBBbHNvIGluY2x1ZGUgdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGVuYWJsZWQgdGhyb3VnaCBlbmFibGVtZW50Ci0JCQkJLy8gZXhwcmVzc2lvbiBmb3IgdGhpcyBwcm9qZWN0LgotCQkJCS8vIE5vdGUgdGhhdCB0aGUgQVBJIGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkgd29ya3MgcHJvcGVybHkgCi0JCQkJLy8gb25seSB3aGVuIHRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgcHJvcGVydHkgdGVzdGVyIGlzIGFjdGl2YXRlZC4KLQkJCQkvLyBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIG1heSBiZSBuZWVkZWQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIAotCQkJCS8vIHRoZSBlbmFibGVtZW50IGluIHRoZSB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgotCQkgICAgICAgIC8vIDxlbmFibGVtZW50PgotCQkgICAgICAgIC8vICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIHByb3BlcnR5PSJmb28udGVzdFByb3BlcnR5Ii8+Ci0JCSAgICAgICAgLy8gPC9lbmFibGVtZW50PiAKLQkJCQkKLQkJCQlTZXQgdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJSXRlcmF0b3IgYWxsVmFsaWRhdG9ycyA9IGdldEFsbFZhbGlkYXRvcnMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChhbGxWYWxpZGF0b3JzLmhhc05leHQoKSkgewotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGFsbFZhbGlkYXRvcnMubmV4dCgpOwotCQkJCQlpZiAoaXNGYWNldEVuYWJsZWQodm1kLCBwcm9qZWN0KSkgewotCQkJCQkJdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbi5hZGQodm1kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZih2YWxpZGF0b3JzV2l0aEVuYWJsZW1lbnRFeHByZXNzaW9uLnNpemUoKSA+IDAgKXsKLQkJCQkJdmFsaWRhdG9yc1dpdGhFbmFibGVtZW50RXhwcmVzc2lvbi5hZGRBbGwoIGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSk7Ci0JCQkJCWNsb25lKHZhbGlkYXRvcnNXaXRoRW5hYmxlbWVudEV4cHJlc3Npb24sIHZtZHMpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNsb25lKGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSwgdm1kcyk7Ci0KLQotCQkJfSBlbHNlIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg4OwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBlbnRyeS5zZXRUb2tlbnMocHJvamVjdE5hdHVyZXMpOwotCQkJCQllbnRyeS5zZXRUZXh0KHByb2plY3ROYXR1cmVzLnRvU3RyaW5nKCkpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORVNULCBlbnRyeSk7Ci0JCQkJfQotCQkJCWNhbGN1bGF0ZVZtZHNGb3JOYXR1cmVBbmRGYWNldHModm1kcywgcHJvamVjdE5hdHVyZXMscHJvamVjdCk7Ci0JCQkJLy8gTm93IGZpbHRlciBvdXQgdGhlIHZhbGlkYXRvcnMgd2hpY2ggbXVzdCBub3QgcnVuIG9uIHRoaXMgcHJvamVjdAotCQkJCXJlbW92ZUV4Y2x1ZGVkUHJvamVjdHMocHJvamVjdCwgdm1kcyk7Ci0JCQkJaWYgKHZtZHMuc2l6ZSgpID09IDApIHsKLQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjA7Ci0JCQkJCWNsb25lKGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSwgdm1kcyk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FUikpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFZhbGlkYXRvck1ldGFEYXRhKElQcm9qZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IHZtZHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVudHJ5LnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FUiwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gdm1kcwotCSAqIEBwYXJhbSBwcm9qZWN0TmF0dXJlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVWbWRzRm9yTmF0dXJlQW5kRmFjZXRzKFNldCB2bWRzLCBTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcywgSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQgcHJvalZtZHM7Ci0JCVN0cmluZ1tdIHByb2plY3RGYWNldElkcyA9IGdldFByb2plY3RGYWNldElkcyhwcm9qZWN0KTsKLQkJSXRlcmF0b3IgYWxsVmFsaWRhdG9ycyA9IGdldEFsbFZhbGlkYXRvcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYWxsVmFsaWRhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgYWxsVmFsaWRhdG9ycy5uZXh0KCk7Ci0JCQlpZiAoY29udGFpbnNQcm9qZWN0RmFjZXQodm1kLCBwcm9qZWN0RmFjZXRJZHMpIHx8IGlzRmFjZXRFbmFibGVkKHZtZCwgcHJvamVjdCkpIHsKLQkJCQl2bWRzLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwcm9qZWN0TmF0dXJlSWQgPSBwcm9qZWN0TmF0dXJlc1tpXTsKLQkJCXByb2pWbWRzID0gKFNldCkgX3ZhbGlkYXRvcnMuZ2V0KHByb2plY3ROYXR1cmVJZCk7Ci0JCQlpZiAocHJvalZtZHMgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9qVm1kcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghdm1kcy5jb250YWlucyh2bWQpICYmICh2bWQuZ2V0RmFjZXRGaWx0ZXJzKCkgPT0gbnVsbCB8fCB2bWQuZ2V0RmFjZXRGaWx0ZXJzKCkubGVuZ3RoID09IDApKSB7Ci0JCQkJCWlmICh2bWQuZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpID09IG51bGwpCi0JCQkJCQl2bWRzLmFkZCh2bWQpOwotCQkJCQllbHNlIGlmIChpc0ZhY2V0RW5hYmxlZCh2bWQsIHByb2plY3QpKQotCQkJCQkJdm1kcy5hZGQodm1kKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc1Byb2plY3RGYWNldChWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZ1tdIHByb2plY3RGYWNldElkcykgewotCQlTdHJpbmdbXSB2YWxpZGF0b3JGYWNldHMgPSB2bWQuZ2V0RmFjZXRGaWx0ZXJzKCk7Ci0JCWlmICh2YWxpZGF0b3JGYWNldHMgIT0gbnVsbCAmJiB2YWxpZGF0b3JGYWNldHMubGVuZ3RoID4gMCkgewotCQkJaWYgKHByb2plY3RGYWNldElkcyAhPSBudWxsICYmIHByb2plY3RGYWNldElkcy5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKEFycmF5cy5hc0xpc3QocHJvamVjdEZhY2V0SWRzKS5jb250YWluc0FsbChBcnJheXMuYXNMaXN0KHZhbGlkYXRvckZhY2V0cykpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0RW5hYmxlZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZtZC5nZXRFbmFibGVtZW50RXhwcmVzaW9uKCk7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBwcm9qZWN0KTsKLQkJCQljb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbih0cnVlKTsKLQkJCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IGV4cHJlc3Npb24uZXZhbHVhdGUoY29udGV4dCk7Ci0JCQkJcmV0dXJuIHJlc3VsdCA9PSBFdmFsdWF0aW9uUmVzdWx0LlRSVUU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRQcm9qZWN0RmFjZXRJZHMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBwcm9qZWN0RmFjZXRzID0gZlByb2plY3QuZ2V0UHJvamVjdEZhY2V0cygpLnRvQXJyYXkoKTsKLQkJCQlTdHJpbmdbXSBwcm9qZWN0RmFjZXRJZHMgPSBuZXcgU3RyaW5nW3Byb2plY3RGYWNldHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RGYWNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSAoKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBwcm9qZWN0RmFjZXRzW2ldKS5nZXRQcm9qZWN0RmFjZXQoKTsKLQkJCQkJcHJvamVjdEZhY2V0SWRzW2ldID0gcHJvamVjdEZhY2V0LmdldElkKCk7Ci0JCQkJfQotCQkJCXJldHVybiBwcm9qZWN0RmFjZXRJZHM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogSWYgb25lIHByb2plY3QgbmF0dXJlIG9uIHRoZSBwcm9qZWN0IGluY2x1ZGVzIGEgcGFydGljdWxhciB2YWxpZGF0b3IsIGJ1dCBhbm90aGVyIHByb2plY3QKLQkgKiBuYXR1cmUgZXhjbHVkZXMgdGhhdCB2YWxpZGF0b3IsIHRoZW4gdGhlIHZhbGlkYXRvciBuZWVkcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHZtZCBzZXQuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGlmIEFWYWxpZGF0b3IgY2FuIHJ1biBvbiBhbnkgamF2YSBwcm9qZWN0IGJ1dCBub3Qgb24gYSBKMkVFIHByb2plY3QsIHdoaWNoIGlzIGFuCi0JICogaW5zdGFuY2Ugb2YgYSBqYXZhIHByb2plY3QsIHRoZW4gdGhlIEFWYWxpZGF0b3IgaXMgaW5jbHVkZWQgYnkgdGhlIGphdmEgbmF0dXJlIGFuZCBleGNsdWRlZAotCSAqIGJ5IHRoZSBKMkVFIG5hdHVyZS4gVGhlIEFWYWxpZGF0b3Igd291bGQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNldC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXhjbHVkZWRQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBTZXQgdm1kcykgewotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIucmVtb3ZlRXhjbHVkZWRQcm9qZWN0cyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJcbkJlZm9yZTpcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlJdGVyYXRvciB2aXRlcmF0b3IgPSB2bWRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodml0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgdml0ZXJhdG9yLm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVudHJ5LnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0KLQkJU3RyaW5nW10gcHJvamVjdE5hdHVyZXMgPSBudWxsOwotCQl0cnkgewotCQkJcHJvamVjdE5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBpZiB0aGVyZSdzIG5vIG5hdHVyZXMsIHRoZXJlJ3Mgbm8gbGlzdC4KLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0VmFsaWRhdG9yTWV0YURhdGEoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKHByb2plY3ROYXR1cmVzID09IG51bGwpIHx8IChwcm9qZWN0TmF0dXJlcy5sZW5ndGggPT0gMCkpIHsKLQkJCS8vIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hdHVyZSA9IHByb2plY3ROYXR1cmVzW2ldOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2bWRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJVmFsaWRhdG9yTmFtZUZpbHRlcltdIG5hdHVyZUZpbHRlcnMgPSB2bWQuZ2V0UHJvamVjdE5hdHVyZUZpbHRlcnMoKTsKLQkJCQlpZiAobmF0dXJlRmlsdGVycyA9PSBudWxsKSB7Ci0JCQkJCS8vIENhbiBydW4gb24gYW55IHByb2plY3QKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuYXR1cmVGaWx0ZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgcG4gPSBuYXR1cmVGaWx0ZXJzW2pdOwotCQkJCQlpZiAobmF0dXJlLmVxdWFscyhwbi5nZXROYW1lRmlsdGVyKCkpICYmICFwbi5pc0luY2x1ZGUoKSkgewotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLnJlbW92ZUV4Y2x1ZGVkUHJvamVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXG5BZnRlcjpcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlJdGVyYXRvciB2aXRlcmF0b3IgPSB2bWRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodml0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgdml0ZXJhdG9yLm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVudHJ5LnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkVTVCwgZW50cnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNsb25lKENvbGxlY3Rpb24gaW5wdXQsIENvbGxlY3Rpb24gY29weSkgewotCQlpZiAoaW5wdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoY29weSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljb3B5LmNsZWFyKCk7Ci0JCWNvcHkuYWRkQWxsKGlucHV0KTsKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBkZWJ1ZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiUHJvamVjdCBuYXR1cmUgPT4gdmFsaWRhdG9ycyBjb25maWd1cmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciB2aXRlcmF0b3IgPSBfdmFsaWRhdG9ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAodml0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHByb2pJZCA9IChTdHJpbmcpIHZpdGVyYXRvci5uZXh0KCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJwcm9qSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHByb2pJZCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTZXQgdmFsaWRhdG9ycyA9IChTZXQpIF92YWxpZGF0b3JzLmdldChwcm9qSWQpOwotCQkJSXRlcmF0b3IgaW5uZXJJdGVyYXRvciA9IHZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpbm5lckl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaW5uZXJJdGVyYXRvci5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlidWZmZXIuYXBwZW5kKCJFbmFibGUvZGlzYWJsZSB2YWxpZGF0b3IgYnkgZGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJdml0ZXJhdG9yID0gX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh2aXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIHZpdGVyYXRvci5uZXh0KCk7Ci0JCQlidWZmZXIuYXBwZW5kKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiIGVuYWJsZWQ/ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHZtZC5pc0VuYWJsZWRCeURlZmF1bHQoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkT25Qcm9qZWN0KFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSA9PSBudWxsKQotCQkJcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJT2JqZWN0IHZtZHMgPSBwcm9qZWN0VmFsaWRhdGlvbk1ldGFEYXRhLmdldChwcm9qZWN0KTsKLQkJaWYgKHZtZHMgIT0gbnVsbCkgewotCQkJU2V0IHB2bWRzID0gKFNldCkgdm1kczsKLQkJCXJldHVybiBwdm1kcy5jb250YWlucyh2bWQpOwotCQl9IGVsc2UgewotCQkJU2V0IHByalZtZHMgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YShwcm9qZWN0KTsKLQkJCWlmIChwcmpWbWRzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChwcmpWbWRzLnNpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YS5wdXQocHJvamVjdCwgcHJqVm1kcyk7Ci0JCQlyZXR1cm4gcHJqVm1kcy5jb250YWlucyh2bWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIFZhbGlkYXRvck1ldGFEYXRhIHdoaWNoIGFyZSBjb25maWd1cmVkIG9uIGFsbCBwcm9qZWN0cyBvciB3aGljaCBydW4gb24gYW55Ci0JICogcHJvamVjdHMgZXhjZXB0IGNlcnRhaW4gcHJvamVjdCB0eXBlcy4KLQkgKiAKLQkgKiBVbmxpa2Ugb3RoZXIgZ2V0IG1ldGhvZHMsIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSBpdCBkb2Vzbid0IHJldHVybiBhIGNsb25lLgotCSAqIAotCSAqIEBzZWUgYWRkRXhjbHVkZWRSZW1haW5kZXIoKQotCSAqLwotCXByaXZhdGUgU2V0IGdldFZhbGlkYXRvck1ldGFEYXRhVW5rbm93blByb2plY3QoKSB7Ci0JCVNldCBwcm9qVm1kcyA9IChTZXQpIF92YWxpZGF0b3JzLmdldChVTktOT1dOX1BST0pFQ1QpOwotCQlpZiAocHJvalZtZHMgPT0gbnVsbCkgewotCQkJcHJvalZtZHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQkJcmV0dXJuIHByb2pWbWRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBvZiBWYWxpZGF0b3JNZXRhRGF0YSB3aGljaCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0VmFsaWRhdG9yTWV0YURhdGFFbmFibGVkQnlEZWZhdWx0KCkgewotCQlTZXQgY29weSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNsb25lKF9kZWZhdWx0RW5hYmxlZFZhbGlkYXRvcnMsIGNvcHkpOwotCQlyZXR1cm4gY29weTsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JNZXRhRGF0YUFycmF5RW5hYmxlZEJ5RGVmYXVsdCgpIHsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbX2RlZmF1bHRFbmFibGVkVmFsaWRhdG9ycy5zaXplKCldOwotCQlfZGVmYXVsdEVuYWJsZWRWYWxpZGF0b3JzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIE9OTFkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBVSSwgb3IgVFZUIHBsdWdpbi4gSW4gZ2VuZXJhbCwKLQkgKiBvbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQgdGhlIHZhbGlkYXRpb24gVFZUIHNob3VsZCBoYW5kbGUgVmFsaWRhdG9yTWV0YURhdGEgb2JqZWN0cy4KLQkgKiAKLQkgKiBHaXZlbiBhIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIGEgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSB2YWxpZGF0b3IsIHJldHVybiB0aGUKLQkgKiBWYWxpZGF0b3JNZXRhRGF0YSB0aGF0IHVzZXMgYSB2YWxpZGF0b3Igb2YgdGhhdCBuYW1lLCBpZiBpdCBleGlzdHMuCi0JICogCi0JICogSXQncyBva2F5IHRvIHJldHVybiBhIGhhbmRsZSB0byB0aGUgVmFsaWRhdG9yTWV0YURhdGEgYmVjYXVzZSB0aGUgdm1kIGNhbid0IGJlIG1vZGlmaWVkIGJ5Ci0JICogYW55IGNvZGUgbm90IGluIHRoaXMgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkgewotCQlpZiAodmFsaWRhdG9yQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBfaW5kZXhlZFZhbGlkYXRvcnMuZ2V0KHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCWlmICh2bWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZtZDsKLQkJfQotCi0JCS8vIENoZWNrIGZvciBhbiBhZ2dyZWdhdGUgdmFsaWRhdG9yCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2luZGV4ZWRWYWxpZGF0b3JzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpLmVxdWFscyh2YWxpZGF0b3JDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHZtZDsKLQkJCX0KLQotCQkJU3RyaW5nW10gYWdncmVnYXRlTmFtZXMgPSB2bWQuZ2V0QWdncmVnYXRlZFZhbGlkYXRvck5hbWVzKCk7Ci0JCQlpZiAoYWdncmVnYXRlTmFtZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWdncmVnYXRlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGFnZ3JlZ2F0ZU5hbWUgPSBhZ2dyZWdhdGVOYW1lc1tpXTsKLQkJCQkJaWYgKHZhbGlkYXRvckNsYXNzTmFtZS5lcXVhbHMoYWdncmVnYXRlTmFtZSkpIHsKLQkJCQkJCXJldHVybiB2bWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEN1cnJlbnQgbmFtZSBvZiB2YWxpZGF0b3IgZG9lc24ndCBtYXRjaDsgaGFzIHRoaXMgdmFsaWRhdG9yIGJlZW4KLQkJCS8vIG1pZ3JhdGVkIGZyb20gYW5vdGhlciBwYWNrYWdlPwotCQkJVmFsaWRhdG9yTWV0YURhdGEuTWlncmF0aW9uTWV0YURhdGEgbW1kID0gdm1kLmdldE1pZ3JhdGlvbk1ldGFEYXRhKCk7Ci0JCQlpZiAobW1kID09IG51bGwpIHsKLQkJCQkvLyBWYWxpZGF0b3IgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBtaWdyYXRlZAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTZXQgaWRMaXN0ID0gbW1kLmdldElkcygpOwotCQkJaWYgKGlkTGlzdCA9PSBudWxsKSB7Ci0JCQkJLy8gSW52YWxpZCA8bWlncmF0ZT4gZWxlbWVudC4KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSXRlcmF0b3IgaWRJdGVyYXRvciA9IGlkTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGlkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nW10gaWRzID0gKFN0cmluZ1tdKSBpZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaWRzLmxlbmd0aCAhPSAyKSB7Ci0JCQkJCS8vIGxvZwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgZnJvbSA9IGlkc1swXTsKLQkJCQlpZiAoZnJvbSA9PSBudWxsKSB7Ci0JCQkJCS8vIGxvZwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZnJvbS5lcXVhbHModmFsaWRhdG9yQ2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gdm1kOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIElmIHdlIGdvdCB0byB0aGlzIHBvaW50LCBubyB2YWxpZGF0b3IgdXNpbmcgdGhhdCBjbGFzcyBuYW1lIGlzIGxvYWRlZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG5hbWVkIHZhbGlkYXRvciBpcyBpbnN0YWxsZWQsIG90aGVyd2lzZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4aXN0aW5nVmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJcmV0dXJuIChnZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHZhbGlkYXRvciB3aXRoIHRoZSBzdGF0aWMgbWV0YWRhdGEgKHJ1bnRpbWUgbWV0YWRhdGEgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlCi0JICogVmFsaWRhdGlvbk9wZXJhdGlvbiBjbGFzcykuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBpbml0aWFsaXplVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsaWRhdG9yTmFtZSwgU3RyaW5nIHBsdWdpbklkKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJ1bkNoaWxkcmVuID0gZWxlbWVudC5nZXRDaGlsZHJlbihUQUdfUlVOX0NMQVNTKTsKLQkJaWYgKChydW5DaGlsZHJlbiA9PSBudWxsKSB8fCAocnVuQ2hpbGRyZW4ubGVuZ3RoIDwgMSkpIHsKLQkJCS8vIEhvdyBjYW4gYW4gSVZhbGlkYXRvckltcGwgYmUgY3JlYXRlZCB3aGVuIHRoZXJlIG5vIGNsYXNzIG5hbWUgdG8KLQkJCS8vIGluc3RhbnRpYXRlPwotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5pbml0aWFsaXplVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlEKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9SVU4pOwotCQkJCS8vZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JOYW1lfSk7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9SVU4pLAotCQkJCQkJbmV3IFN0cmluZ1tde3ZhbGlkYXRvck5hbWV9KTsKLQkJCQllbnRyeS5zZXRUZXh0KHJlc3VsdCk7Ci0JCQkJCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9XVFAgQnVnemlsbGEgZGVmZWN0OiA4MjMzOAotCQkvL1VzaW5nIHRoZSBVbmlxdWUgSWRlbnRpZmllciBnaXZlIHRoZSBmbGV4aWJpbGl0eSBvZiB0aGUgc2FtZSB2YWxpZGF0b3IgY2xhc3MgdXNlZCBieSBvdGhlciB2YWxpZGF0b3IgZXh0ZW50aW9ucyB3aXRob3V0IHdyaXRpbmcgYSBuZXcgdmFsaWRhdGlvbiBjbGFzcwotCQkvL1JldmVydGluZyB0aGUgZml4IGJhY2sgYXMgdGhlIGNsYXNzIG5hbWUgZGVmaW5lZCBpbiB0aGUgZXh0IGlzIHVuaXF1ZSB0byB0aGlzIHZhbGlkYXRvciBhbmQgaGFzIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmlxdWUgaWQgaW4gdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEKLQkJU3RyaW5nIHZhbGlkYXRvckltcGxOYW1lID0gcnVuQ2hpbGRyZW5bMF0uZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCQotCQlpZiAodmFsaWRhdG9ySW1wbE5hbWUgPT0gbnVsbCkgewotCQkJLy8gU2FtZSBhcyBiZWZvcmU7IGhvdyBjYW4gd2UgaW5zdGFudGlhdGUgd2hlbi4uLgotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5pbml0aWFsaXplVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlEKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfU1lOVEFYX05PX1ZBTF9DTEFTUyk7Ci0JCQkJZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JOYW1lfSk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGhlbHBlckltcGxOYW1lID0gZ2V0SGVscGVyTmFtZShlbGVtZW50KTsKLQkJaWYgKGhlbHBlckltcGxOYW1lID09IG51bGwpIHsKLQkJCS8vIFNhbWUgYXMgYmVmb3JlOyBob3cgY2FuIHdlIGluc3RhbnRpYXRlIHdoZW4uLi4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuaW5pdGlhbGl6ZVZhbGlkYXRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQsIFN0cmluZywgU3RyaW5nKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0TWVzc2FnZVR5cGVJRChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1NZTlRBWF9OT19WQUxfUlVOKTsKLQkJCQllbnRyeS5zZXRUb2tlbnMobmV3IFN0cmluZ1tde3ZhbGlkYXRvckltcGxOYW1lfSk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gSW4gb3JkZXIgdG8gc3BlZWQgdXAgb3VyIFN0cmluZyBjb21wYXJpc29ucywgbG9hZCB0aGVzZQotCQkvLyBuYW1lcyBpbnRvIEphdmEncyBjb25zdGFudHMgc3BhY2UuIFRoaXMgd2F5LCB3ZSdsbCBiZSBhYmxlIHRvCi0JCS8vIHVzZSBwb2ludGVyIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgdHJhZGl0aW9uYWwKLQkJLy8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjb21wYXJpc29uLiBTaW5jZSB0aGVzZSBuYW1lcyBzaG91bGQKLQkJLy8gbmV2ZXIgYmUgc2V0IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIGFuZCB0aGlzIGNsYXNzCi0JCS8vIHNldHMgdGhlbSBvbmx5IG9uY2UsIGl0IGlzIHNhZmUgdG8gZGVjbGFyZSB0aGVzZSBTdHJpbmdzCi0JCS8vIGNvbnN0YW50cy4KLQkJLy8KLQkJLy8gVG8gbG9hZCBhIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UsIGNhbGwgaW50ZXJuKCkgb24gdGhlIFN0cmluZy4KLQkJLy8KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCXZtZC5hZGRGaWx0ZXJzKGdldEZpbHRlcnMoZWxlbWVudCkpOyAvLyB2YWxpZGF0b3IgbWF5LCBvciBtYXkgbm90LCBoYXZlIGZpbHRlcnMKLQkJdm1kLmFkZFByb2plY3ROYXR1cmVGaWx0ZXJzKGdldFByb2plY3ROYXR1cmVGaWx0ZXJzKGVsZW1lbnQpKTsgLy8gdmFsaWRhdG9yIG1heSwgb3IgbWF5IG5vdCwgc3BlY2lmeSBhIHByb2plY3QgbmF0dXJlCi0JCXZtZC5hZGRGYWNldEZpbHRlcnMoZ2V0RmFjZXRJZHMoZWxlbWVudCkpOy8vdmFsaWRhdG9yIG1heSBvciBtYXkgbm90IHNwZWNpZnkgdGhlIGZhY2V0Ci0JCXZtZC5zZXRFbmFibGVtZW50RWxlbWVudChnZXRFbmFibGVtZW50RWxlbWVudChlbGVtZW50KSk7Ci0JCXZtZC5hZGRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoZ2V0QWdncmVnYXRlVmFsaWRhdG9yc05hbWVzKGVsZW1lbnQpKTsgLy8gaWYgYSB2YWxpZGF0b3IKLQkJLy8gYWdncmVnYXRlZCBhbm90aGVyIHZhbGlkYXRvciwgaXQgc2hvdWxkIGlkZW50aWZ5Ci0JCS8vIHRoZSBzdWItdmFsaWRhdG9yKHMpJyBjbGFzcyBuYW1lCi0JCXZtZC5zZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSh2YWxpZGF0b3JOYW1lLmludGVybigpKTsgLy8gdmFsaWRhdG9yIG11c3QgaGF2ZSBhIGRpc3BsYXkgbmFtZS4KLQkJdm1kLnNldFZhbGlkYXRvclVuaXF1ZU5hbWUodmFsaWRhdG9ySW1wbE5hbWUuaW50ZXJuKCkpOwotCQl2bWQuc2V0UGx1Z2luSWQocGx1Z2luSWQpOwotCQl2bWQuc2V0SW5jcmVtZW50YWwoZ2V0SW5jcmVtZW50YWwoZWxlbWVudCkpOwotCQl2bWQuc2V0RnVsbEJ1aWxkKGdldEZ1bGxCdWlsZChlbGVtZW50KSk7Ci0JCXZtZC5zZXRBc3luYyhnZXRBc3luYyhlbGVtZW50KSk7Ci0JCXZtZC5zZXRSdWxlR3JvdXAoZ2V0UnVsZUdyb3VwKGVsZW1lbnQpKTsKLQkJdm1kLnNldEVuYWJsZWRCeURlZmF1bHQoZ2V0RW5hYmxlZEJ5RGVmYXVsdChlbGVtZW50KSk7Ci0JCXZtZC5zZXRNaWdyYXRpb25NZXRhRGF0YShnZXRNaWdyYXRpb25NZXRhRGF0YShlbGVtZW50LCB2bWQpKTsKLQkJdm1kLnNldEhlbHBlckNsYXNzKGVsZW1lbnQsIGhlbHBlckltcGxOYW1lKTsKLQkJdm1kLnNldFZhbGlkYXRvckNsYXNzKHJ1bkNoaWxkcmVuWzBdKTsgLy8gYXNzb2NpYXRlIHRoZSBhYm92ZSBhdHRyaWJ1dGVzIHdpdGggdGhlIHZhbGlkYXRvcgotCQl2bWQuYWRkRGVwZW5kZW50VmFsaWRhdG9yKGdldERlcGVuZGVudFZhbGlkYXRvclZhbHVlKGVsZW1lbnQpKTsKLQkJdm1kLnNldENvbnRlbnRUeXBlSWRzKGdldENvbnRlbnRUeXBlQmluZGluZ3MoZWxlbWVudCkpOwotCQlpbml0aWFsaXplVmFsaWRhdG9yQ3VzdG9tTWFya2VycyhlbGVtZW50LCBwbHVnaW5JZCwgdm1kKTsKLQkJCi0JCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkVTVCkpIHsKLQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5pbml0aWFsaXplVmFsaWRhdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCWVudHJ5LnNldFRleHQoInZhbGlkYXRvciBsb2FkZWQ6ICIgKyB2YWxpZGF0b3JJbXBsTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJfQotCi0JCXJldHVybiB2bWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcGFyYW0gdm1kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0b3JDdXN0b21NYXJrZXJzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcGx1Z2luSWQsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTdHJpbmdbXSBjdXN0b21NYXJrZXJJZHMgPSBnZXRNYXJrZXJJZHNWYWx1ZShlbGVtZW50KTsKLQkJaWYgKGN1c3RvbU1hcmtlcklkcyAhPSBudWxsICYmIGN1c3RvbU1hcmtlcklkcy5sZW5ndGggPiAwKSB7Ci0JCQlTdHJpbmdbXSBxdWFsaWZpZWRNYXJrZXJJZHMgPSBuZXcgU3RyaW5nW2N1c3RvbU1hcmtlcklkcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21NYXJrZXJJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbWFya2VyaWQgPSBjdXN0b21NYXJrZXJJZHNbaV07Ci0JCQkJaWYgKG1hcmtlcmlkLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHBsdWdpbklEID0gbWFya2VyaWQuc3Vic3RyaW5nKDAsIG1hcmtlcmlkLmxhc3RJbmRleE9mKCIuIikpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJCQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJCQkJcXVhbGlmaWVkTWFya2VySWRzW2ldID0gcGx1Z2luSWQgKyAiLiIgKyBjdXN0b21NYXJrZXJJZHNbaV07Ci0JCQkJCWVsc2UKLQkJCQkJCXF1YWxpZmllZE1hcmtlcklkc1tpXSA9IGN1c3RvbU1hcmtlcklkc1tpXTsKLQkJCQl9IGVsc2UKLQkJCQkJcXVhbGlmaWVkTWFya2VySWRzW2ldID0gcGx1Z2luSWQgKyAiLiIgKyBjdXN0b21NYXJrZXJJZHNbaV07Ci0JCQl9Ci0JCQl2bWQuc2V0TWFya2VySWRzKHF1YWxpZmllZE1hcmtlcklkcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgRXhwcmVzc2lvbiBnZXRFbmFibGVtZW50RWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbmFibGVtZW50cyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRXhwcmVzc2lvblRhZ05hbWVzLkVOQUJMRU1FTlQpOwotCQlpZiAoZW5hYmxlbWVudHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGVuYWJsZW1lbnRzWzBdKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBPTkxZIEJZIFRIRSBWQUxJREFUSU9OIEZSQU1FV09SSyEgVGhlIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXMKLQkgKiB1c2VkIHRvIHBvcHVsYXRlIHRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2UgcGFnZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBbGxWYWxpZGF0b3JzKCkgewotCQlTZXQgdmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNsb25lKF9pbmRleGVkVmFsaWRhdG9ycy52YWx1ZXMoKSwgdmFsaWRhdG9ycyk7Ci0JCXJldHVybiB2YWxpZGF0b3JzOwotCX0KLQotCXB1YmxpYyBpbnQgbnVtYmVyT2ZWYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX2luZGV4ZWRWYWxpZGF0b3JzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQlTdHJpbmcgbGFiZWwgPSBleHRlbnNpb24uZ2V0TGFiZWwoKTsKLQkJCWlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleHRlbnNpb24uZ2V0VW5pcXVlSWRlbnRpZmllcigpfTsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIucmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSUQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19WQUxJREFUT1JOQU1FX0lTX05VTEwpOwotCQkJCQkvL2VudHJ5LnNldFRva2Vucyhtc2dQYXJtKTsKLQkJCQkJU3RyaW5nIHJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfVkFMSURBVE9STkFNRV9JU19OVUxMKSwKLQkJCQkJCQltc2dQYXJtKTsKLQkJCQkJZW50cnkuc2V0VGV4dChyZXN1bHQpOwkJCQkJCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiBnZXRMYWJlbCgpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCB0aGlzIGlzIGFuIGlsbGVnYWwgdmFsaWRhdG9yLgotCQkJCS8vIFRoZSBQcm9wZXJ0eVBhZ2UsIGFuZCBvdGhlciBzdGF0dXMgbWVzc2FnZXMsIG5lZWQgdG8gaGF2ZSBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yCi0JCQkJLy8gdGhlIHZhbGlkYXRvci4KLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gaW5pdGlhbGl6ZVZhbGlkYXRvcihlbGVtZW50LCBsYWJlbCwgcGx1Z2luSWQpOwotCi0JCQkJaWYgKHZtZCAhPSBudWxsKSB7Ci0JCQkJCS8vIEFkZCB0aGlzIHZhbGlkYXRvciB0byB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzOyBpZiB2bWQgaXMgbnVsbCwgdGhlIHZhbGlkYXRvcgotCQkJCQkvLyBjb3VsZG4ndCBiZSBjcmVhdGVkLgotCQkJCQlhZGQodm1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgVmFsaWRhdG9ycyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJX3ZhbGlkYXRvcnMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIGV4dGVuc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4KLQkJSUV4dGVuc2lvblBvaW50IHZhbGlkYXRvckVQID0gZ2V0VmFsaWRhdG9yRXh0ZW5zaW9uUG9pbnQoKTsKLQkJaWYgKHZhbGlkYXRvckVQID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHZhbGlkYXRvckVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkvLyBmaW5kIGFsbCBydW50aW1lIGltcGxlbWVudGF0aW9ucwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLSAgICAKLSAgICAvLyBGb3JjZSB0aGUgZGVsZWdhdGUgdmFsaWRhdG9ycyByZWdpc3RyeSB0byBiZSByZWFkIGVhcmx5IHRvIGF2b2lkCi0gICAgLy8gdGhlIG5vbi1zeW5jaHJvbml6ZWQgc2luZ2xldG9uIGlzc3VlIHdoaWNoIG9jY3VycyB3aGVuIHR3byBkZWxlZ2F0aW5nCi0gICAgLy8gdmFsaWRhdG9ycyByYWNlIHRvIGxvYWQgdGhlIHJlZ2lzdHJ5LgotICAgIAotICAgIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBfaW5kZXhlZFZhbGlkYXRvcnMuZ2V0KHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCWlmKHZtZCAhPSBudWxsKQotCQkJcmV0dXJuIHZtZC5nZXRWYWxpZGF0b3IoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZkNjI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1NFTEVDVElPTl9IQU5ETEVSID0gInZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogaGFuZGxlckNsYXNzIC0gKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IQU5ETEVSX0NMQVNTID0gImhhbmRsZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TRUxFQ1RJT05fVFlQRSA9ICJzZWxlY3Rpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIgSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBMaXN0IHZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyczsKLQkKLQlwdWJsaWMgVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQsIFZBTElEQVRJT05fU0VMRUNUSU9OX0hBTkRMRVIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFZBTElEQVRJT05fU0VMRUNUSU9OX0hBTkRMRVIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLS8vCQlTdHJpbmcgaGFuZGxlckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0hBTkRMRVJfQ0xBU1MpOwotCQlTdHJpbmcgc2VsZWN0aW9uVHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TRUxFQ1RJT05fVFlQRSk7IAotCQkKLQkJSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl0cnkgewotCQkJaGFuZGxlciA9IChJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfSEFORExFUl9DTEFTUyk7Ci0JCQloYW5kbGVyLnNldFZhbGlkYXRpb25UeXBlU3RyaW5nKHNlbGVjdGlvblR5cGUpOwotCQkJZ2V0VmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzKCkuYWRkKGhhbmRsZXIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzKCkgewotCQlpZiAodmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzID09IG51bGwpCi0JCQl2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiB2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcnM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0RXh0ZW5kZWRUeXBlKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGk9MDsgaTxnZXRWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcnMoKS5zaXplKCk7IGkrKyApIHsKLQkJCUlWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciBoYW5kbGVyID0gKElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcikgZ2V0VmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJzKCkuZ2V0KGkpOwotCQkJcmVzdWx0ID0gaGFuZGxlci5nZXRCYXNlVmFsaWRhdGlvblR5cGUoc2VsZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yQWN0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckFjdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI0MWJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yQWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUgaW4gdGhlIHZhbGlkYXRvcidzIHBsdWdpbi54bWwgY29udHJpYnV0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yQWN0aW9uRmlsdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsgLy8kTk9OLU5MUy0xJCAvLyBpZiB0aGUgcmVzb3VyY2UgZGVsdGEgaXMgYW4gYWRkaXRpb247IHRoaXMgdmFsdWUgaXMgdXNlZCBpbiBwbHVnaW4ueG1sCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7IC8vJE5PTi1OTFMtMSQgLy8gaWYgdGhlIHJlc291cmNlIGRlbHRhIGlzIGEgY2hhbmdlOyB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gcGx1Z2luLnhtbAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJkZWxldGUiOyAvLyROT04tTkxTLTEkIC8vIGlmIHRoZSByZXNvdXJjZSBkZWx0YSBpcyBhIHJlbW92YWw7IHRoaXMgdmFsdWUgaXMgdXNlZCBpbiBwbHVnaW4ueG1sCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX0FDVElPTlMgPSAoSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCk7Ci0KLQlwcml2YXRlIGludCBfYWN0aW9uVHlwZSA9IDA7IC8vIERlZmF1bHQgdG8gMCwgc28gdGhhdCBpZiBhbiBpbnZhbGlkIGZpbHRlciBpcyBzcGVjaWZpZWQsIHRoZW4gbm8KLQotCS8vIG1hdHRlciB3aGF0IHRoZSBJUmVzb3VyY2VEZWx0YSBpcywgdGhlIGRlbHRhICYgX2FjdGlvblR5cGUgd2lsbAotCS8vIGFsd2F5cyA9PSAwLiAoaS5lLiwgdGhlIHJlc291cmNlIHdpbGwgbmV2ZXIgYmUgZmlsdGVyZWQgaW4pCi0KLQlwdWJsaWMgVmFsaWRhdG9yQWN0aW9uRmlsdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaGV4YWRlY2ltYWwgbnVtYmVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIHR5cGUocykgb2YgYWN0aW9ucyB3aGljaCB0aGlzIGZpbHRlcgotCSAqIGFsbG93cyBpbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0JCS8vIFNpbmNlIElSZXNvdXJjZURlbHRhJ3MgY29uc3RhbnRzIGFyZSBoZXhhZGVjaW1hbCBudW1iZXJzLAotCQkvLyBpdCdzIG5pY2VyIHRvIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgaGV4YWRlY2ltYWwsIGZvciBiaXR3aXNlIE9SLAotCQkvLyB0aGFuIGl0IGlzIHRvIGhhdmUgdGhyZWUgYm9vbGVhbiBtZXRob2RzIG9uIHRoaXMgY2xhc3MsIGkuZS4sCi0JCS8vIGlzQWRkLCBpc0NoYW5nZSwgaXNEZWxldGUuCi0JCXJldHVybiBfYWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBQYXJzZSB0aGUgaW5jb21pbmcgc3RyaW5nLCB3aGljaCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgcGx1Z2luLnhtbCBmaWxlLCB0byBkZXRlcm1pbmUgdGhlCi0JICogdmFsdWUgb2YgdGhlIGFjdGlvblR5cGUuCi0JICogPHA+Ci0JICogVGhlIHN0cmluZyBjYW4gY29udGFpbiBvbmUsIHR3bywgb3IgdGhyZWUgY29uc3RhbnRzLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbnN0YW50LCB0aGUKLQkgKiBjb25zdGFudHMgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hLgotCSAqIDxwPgotCSAqIFRoZXNlIGFyZSB0aGUgdGhyZWUgY29uc3RhbnRzOiBhZGQsIGNoYW5nZSwgZGVsZXRlLiBUaGUgb3JkZXIgdGhhdCB0aGUgY29uc3RhbnRzIGFyZQotCSAqIHNwZWNpZmllZCBpbiBkb2VzIG5vdCBtYXR0ZXIuIFRoZSBjb25zdGFudHMgYXJlIGNhc2Utc2Vuc2l0aXZlOyBpLmUuLCBBREQgaXMgbm90IGNvbnNpZGVyZWQKLQkgKiB0aGUgc2FtZSBhcyBhZGQuCi0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQsIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBmaWx0ZXIgaW4gYWxsIHR5cGVzIG9mCi0JICogYWN0aW9uczogYWRkLCBjaGFuZ2UsIGRlbGV0ZS4gKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyAiYWRkLAotCSAqIGNoYW5nZSwgZGVsZXRlIiBhcyB0aGUgYWN0aW9uIGF0dHJpYnV0ZSdzIHZhbHVlLgotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBub25lIG9mIHRoZSBjb25zdGFudHMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIGZpbHRlciBpcwotCSAqIGludmFsaWQsIGFuZCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLiAoSWYgbm9uZSBvZiB0aGUgYWN0aW9ucyBzaG91bGQgYmUKLQkgKiBmaWx0ZXJlZCBpbiwgdGhlbiB0aGUgZmlsdGVyIGl0c2VsZiBzaG91bGQgbm90IGV4aXN0LikKLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBhbmQgb25lIG9mIHRoZSBjb25zdGFudHMgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9ybSBvZiB0aGUKLQkgKiBhY3Rpb24gc2hvdWxkIGJlIGxpa2UgdGhpczogPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iYWRkIi8+Ci0JICogPHA+Ci0JICogSWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYW5kIG1vcmUgdGhhbiBvbmUgY29uc3RhbnQgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9ybSBvZgotCSAqIHRoZSBhY3Rpb24gc2hvdWxkIGJlIGxpa2UgdGhpczogPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iYWRkLCBkZWxldGUiLz4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgYWN0aW9uIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBhbmQgYW4gdW5rbm93biBjb25zdGFudCBpcyBkZWZpbmVkLCB0aGVuIHRoZSB1bmtub3duCi0JICogY29uc3RhbnQgd2lsbCBiZSBpZ25vcmVkLiBGb3IgZXhhbXBsZSwgPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iQURELCBkZWxldGUiLz4gPGJyPgotCSAqIGlzIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcgPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iZGVsZXRlIi8+IDxicj4KLQkgKiBhbmQgaWYgYWxsIG9mIHRoZSBjb25zdGFudHMgYXJlIHVua25vd24sIHRoZSBmaWx0ZXIgaXMgaW52YWxpZCwgYW5kIHdpbGwgYmUgaWdub3JlZCBieSB0aGUKLQkgKiBWYWxpZGF0aW9uIEZyYW1ld29yay4gZS5nLiwgPGJyPgotCSAqICZuYnNwOyZuYnNwOyZuYnNwOyZsdDtmaWx0ZXIgLi4uIGFjdGlvbj0iQURELCBERUxFVEUiLz4gPGJyPgotCSAqIGlzIHRoZSBzYW1lIGFzIG5vdCBzcGVjaWZ5aW5nIGEgZmlsdGVyLgotCSAqIDxwPgotCSAqIElmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIGRlZmluZWQsIGFuZCBhIGNvbnN0YW50IGlzIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UsIHRoZSBleHRyYQotCSAqIGNvbnN0YW50IGlzIGlnbm9yZWQuIEZvciBleGFtcGxlLCA8YnI+Ci0JICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2ZpbHRlciAuLi4gYWN0aW9uPSJhZGQsIGNoYW5nZSwgYWRkIi8+IDxicj4KLQkgKiBpcyB0aGUgc2FtZSBhcyBzcGVjaWZ5aW5nIDxicj4KLQkgKiAmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7ZmlsdGVyIC4uLiBhY3Rpb249ImFkZCwgY2hhbmdlIi8+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uVHlwZXMoU3RyaW5nIGFjdGlvbnMpIHsKLQkJaWYgKGFjdGlvbnMgPT0gbnVsbCkgewotCQkJLy8gdXNlciBoYXMgbm90IGRlZmluZWQgdGhlICJhY3Rpb24iIGVsZW1lbnQsIHNvIGRlZmF1bHQgdG8gZXZlcnl0aGluZwotCQkJX2FjdGlvblR5cGUgPSBBTExfQUNUSU9OUzsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIFN0cmluZyBDT01NQSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY3Rpb25zLCBDT01NQSwgZmFsc2UpOyAvLyBmYWxzZSBtZWFucyBkb24ndAotCQkvLyByZXR1cm4gdGhlIGNvbW1hCi0JCS8vIGFzIHBhcnQgb2YgdGhlCi0JCS8vIHN0cmluZwotCQlpbnQgaXNBZGQgPSAwOwotCQlpbnQgaXNDaGFuZ2UgPSAwOwotCQlpbnQgaXNEZWxldGUgPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIG5leHRBY3Rpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKG5leHRBY3Rpb24uZXF1YWxzKEFERCkpIHsKLQkJCQlpc0FkZCA9IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJfSBlbHNlIGlmIChuZXh0QWN0aW9uLmVxdWFscyhDSEFOR0UpKSB7Ci0JCQkJaXNDaGFuZ2UgPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOwotCQkJfSBlbHNlIGlmIChuZXh0QWN0aW9uLmVxdWFscyhERUxFVEUpKSB7Ci0JCQkJaXNEZWxldGUgPSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOwotCQkJfQotCQl9Ci0JCV9hY3Rpb25UeXBlID0gaXNBZGQgfCBpc0NoYW5nZSB8IGlzRGVsZXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWZpbmFsIFN0cmluZyBPTiA9ICJvbiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIE9GRiA9ICJvZmYiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgQWN0aW9uRmlsdGVyOiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgICAgICBhZGQ6ICIgKyAoKChnZXRBY3Rpb25UeXBlKCkgJiBJUmVzb3VyY2VEZWx0YS5BRERFRCkgIT0gMCkgPyBPTiA6IE9GRikpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgICAgICBjaGFuZ2U6ICIgKyAoKChnZXRBY3Rpb25UeXBlKCkgJiBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSAhPSAwKSA/IE9OIDogT0ZGKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiICAgICAgICAgIGRlbGV0ZTogIiArICgoKGdldEFjdGlvblR5cGUoKSAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpICE9IDApID8gT04gOiBPRkYpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FlOWMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBwbHVnaW4ueG1sIHRhZ3MsIGZvciBhIHZhbGlkYXRvciwgZm9yIGJvdGggbmFtZSBmaWx0ZXJzIGFuZCB0eXBlCi0gKiBmaWx0ZXJzLiBpLmUuLCBpZiBhbiBvYmplY3QgaGFzIG5hbWUgZmlsdGVyIGFuZCB0eXBlIGZpbHRlciBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgZmlsdGVycyBvdXQKLSAqIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBib3RoIG9mIHRoYXQgdHlwZSBhbmQgbmFtZWQgbGlrZSB0aGUgZmlsdGVyLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRmlsdGVyIHsKLQlwcml2YXRlIFZhbGlkYXRvck5hbWVGaWx0ZXIgX25hbWVGaWx0ZXI7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JUeXBlRmlsdGVyIF90eXBlRmlsdGVyOwotCXByaXZhdGUgVmFsaWRhdG9yQWN0aW9uRmlsdGVyIF9hY3Rpb25GaWx0ZXI7Ci0KLQlWYWxpZGF0b3JGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9uYW1lRmlsdGVyID0gbmV3IFZhbGlkYXRvck5hbWVGaWx0ZXIoKTsKLQkJX3R5cGVGaWx0ZXIgPSBuZXcgVmFsaWRhdG9yVHlwZUZpbHRlcigpOwotCQlfYWN0aW9uRmlsdGVyID0gbmV3IFZhbGlkYXRvckFjdGlvbkZpbHRlcigpOwotCX0KLQotCVZhbGlkYXRvckZpbHRlcihTdHJpbmcgbXVzdEltcGxlbWVudENsYXNzKSB7Ci0JCXRoaXMoKTsKLQkJX25hbWVGaWx0ZXIgPSBuZXcgVmFsaWRhdG9yTmFtZUZpbHRlcigpOwotCQlfdHlwZUZpbHRlci5zZXRNdXN0SW1wbGVtZW50Q2xhc3MobXVzdEltcGxlbWVudENsYXNzKTsKLQkJX2FjdGlvbkZpbHRlciA9IG5ldyBWYWxpZGF0b3JBY3Rpb25GaWx0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVBY3Rpb24oaW50IHJlc291cmNlRGVsdGEpIHsKLQkJcmV0dXJuICgocmVzb3VyY2VEZWx0YSAmIF9hY3Rpb25GaWx0ZXIuZ2V0QWN0aW9uVHlwZSgpKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlJ3MgbmFtZSBtYXRjaGVzIHRoZSBuYW1lIGZpbHRlci4KLQkgKiAKLQkgKiBlLmcuIGlmIHRoZSBuYW1lIGZpbHRlciBpcyAiKi5qYXZhIiwgYW5kIHRoaXMgcmVzb3VyY2UgaXMgInJlYWRtZS50eHQiLCB0aGlzIG1ldGhvZCB3aWxsCi0JICogcmV0dXJuIGZhbHNlLiBJZiB0aGUgcmVzb3VyY2UgaXMgbmFtZWQgInJlYWRtZS5qYXZhIiwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBfbmFtZUZpbHRlci5pc0FwcGxpY2FibGVOYW1lKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlJ3MgdHlwZSBtYXRjaGVzIHRoZSB0eXBlIGZpbHRlci4KLQkgKiAKLQkgKiBlLmcuIGlmIHRoZSB0eXBlIGZpbHRlciBpcyAiSUZpbGUiLCBhbmQgdGhpcyByZXNvdXJjZSBpcyAiSVByb2plY3QiLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotCSAqIGZhbHNlLiBJZiB0aGUgcmVzb3VyY2UgaXMgYW4gSUZpbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuCi0JICovCi0JYm9vbGVhbiBpc0FwcGxpY2FibGVUeXBlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gX3R5cGVGaWx0ZXIuaXNBcHBsaWNhYmxlVHlwZShyZXNvdXJjZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uRmlsdGVyKFN0cmluZyBhY3Rpb25zKSB7Ci0JCV9hY3Rpb25GaWx0ZXIuc2V0QWN0aW9uVHlwZXMoYWN0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBmaWx0ZXIuCi0JICovCi0Jdm9pZCBzZXROYW1lRmlsdGVyKFN0cmluZyBmaWx0ZXIsIFN0cmluZyBpc0Nhc2VTZW5zaXRpdmVTdHJpbmcpIHsKLQkJX25hbWVGaWx0ZXIuc2V0TmFtZUZpbHRlcihmaWx0ZXIpOwotCQlpZihmaWx0ZXIgIT0gbnVsbCkKLQkJCSAgX25hbWVGaWx0ZXIuc2V0TmFtZUZpbHRlckV4dGVuc2lvbihnZXRGaWx0ZXJFeHQoZmlsdGVyKSk7Ci0JCV9uYW1lRmlsdGVyLnNldENhc2VTZW5zaXRpdmUoaXNDYXNlU2Vuc2l0aXZlU3RyaW5nKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsdGVyRXh0KFN0cmluZyBmaWx0ZXIpIHsKLQkJcmV0dXJuIGZpbHRlci5zdWJzdHJpbmcoZmlsdGVyLmluZGV4T2YoIi4iKSArIDEpOwotCX0KLQkKLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUgZmlsdGVyLgotCSAqLwotCXZvaWQgc2V0VHlwZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCV90eXBlRmlsdGVyLnNldFR5cGVGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlmaW5hbCBTdHJpbmcgbGluZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJWYWxpZGF0b3JGaWx0ZXI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKLQkJYnVmZmVyLmFwcGVuZCgiICAgICBuYW1lRmlsdGVyID0gIiArIF9uYW1lRmlsdGVyKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxpbmVTZXApOwotCQlidWZmZXIuYXBwZW5kKCIgICAgIHR5cGVGaWx0ZXIgPSAiICsgX3R5cGVGaWx0ZXIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobGluZVNlcCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgYWN0aW9uRmlsdGVyID0gIiArIF9hY3Rpb25GaWx0ZXIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobGluZVNlcCk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIF9uYW1lRmlsdGVyLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JOYW1lRmlsdGVyIGdldF9uYW1lRmlsdGVyKCkgewotCQlyZXR1cm4gX25hbWVGaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNZXRhRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ2MzZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLlZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uLCBhcyBzcGVjaWZpZWQgYnkgYSB2YWxpZGF0b3IncyBwbHVnaW4ueG1sIHRhZ3MuIFRoZXJlIGlzIG9uZQotICogVmFsaWRhdG9yTWV0YURhdGEgZm9yIGVhY2ggVmFsaWRhdG9yLiBObyBWYWxpZGF0b3Igc2hvdWxkIGF0dGVtcHQgdG8gYWNjZXNzIGl0cwotICogVmFsaWRhdG9yTWV0YURhdGE7IGl0IGlzIGZvciB1c2UgYnkgdGhlIGJhc2UgZnJhbWV3b3JrIG9ubHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JGaWx0ZXJbXSBfZmlsdGVyczsKLQlwcml2YXRlIFZhbGlkYXRvck5hbWVGaWx0ZXJbXSBfcHJvamVjdE5hdHVyZUZpbHRlcnM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmYWNldEZpbHRlcnM7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3I7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoQ29udGV4dCBfaGVscGVyOwotCXByaXZhdGUgU3RyaW5nIF92YWxpZGF0b3JEaXNwbGF5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBfdmFsaWRhdG9yVW5pcXVlTmFtZTsKLQlwcml2YXRlIFN0cmluZ1tdIF9hZ2dyZWdhdGVkVmFsaWRhdG9yczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGNvbnRlbnRUeXBlSWRzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF92YWxpZGF0b3JOYW1lczsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBib29sZWFuIF9zdXBwb3J0c0luY3JlbWVudGFsID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX0lOQ1JFTUVOVEFMX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBib29sZWFuIF9zdXBwb3J0c0Z1bGxCdWlsZCA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9GVUxMQlVJTERfREVGQVVMVDsKLQlwcml2YXRlIExvZ2dlciBfbG9nZ2VyOwotCXByaXZhdGUgYm9vbGVhbiBfaXNFbmFibGVkQnlEZWZhdWx0ID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX0VOQUJMRURfREVGQVVMVDsKLQlwcml2YXRlIE1pZ3JhdGlvbk1ldGFEYXRhIF9taWdyYXRpb25NZXRhRGF0YTsKLQlwcml2YXRlIGludCBfcnVsZUdyb3VwID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsKLQlwcml2YXRlIGJvb2xlYW4gX2FzeW5jID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX0FTWU5DX0RFRkFVTFQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRlcGVuZGVudFZhbGlkYXRvciA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkRFUF9WQUxfVkFMVUVfREVGQVVMVDsKLQlwcml2YXRlIFN0cmluZ1tdIG1hcmtlcklkczsKLQlwcml2YXRlIFN0cmluZyBfaGVscGVyQ2xhc3NOYW1lOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IF9oZWxwZXJDbGFzc0VsZW1lbnQ7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgX3ZhbGlkYXRvckNsYXNzRWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gX2Nhbm5vdExvYWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVmFsaWRhdGlvbiA9IHRydWU7Ci0JcHJpdmF0ZSBNYXAgaGVscGVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcCggbmV3IEhhc2hNYXAoKSApOwotCXByaXZhdGUgRXhwcmVzc2lvbiBlbmFibGVtZW50RXhwcmVzc2lvbjsKLQotCVZhbGlkYXRvck1ldGFEYXRhKCkgewotCQkvL2RlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgY2xhc3MgbmFtZXMgb2YgZXZlcnkgdmFsaWRhdG9yIHdoaWNoIHRoaXMgdmFsaWRhdG9yIGFnZ3JlZ2F0ZXMuIEZvcgotCSAqIGV4YW1wbGUsIGlmIHRoZSBFSkIgVmFsaWRhdG9yIGluc3RhbnRpYXRlZCBhbm90aGVyIHZhbGlkYXRvciwgYW5kIHN0YXJ0ZWQgaXRzIHZhbGlkYXRlCi0JICogbWV0aG9kLCB0aGVuIHRoYXQgaW5zdGFudGlhdGVkIGNsYXNzJyBuYW1lIHNob3VsZCBiZSBpbiB0aGlzIGxpc3QuCi0JICovCi0Jdm9pZCBhZGRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoU3RyaW5nW10gdmFsKSB7Ci0JCV9hZ2dyZWdhdGVkVmFsaWRhdG9ycyA9IHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hbWUvdHlwZSBmaWx0ZXIgcGFpcihzKS4KLQkgKi8KLQl2b2lkIGFkZEZpbHRlcnMoVmFsaWRhdG9yRmlsdGVyW10gZmlsdGVycykgewotCQlfZmlsdGVycyA9IGZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9qZWN0IG5hdHVyZSBmaWx0ZXIocykuCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0TmF0dXJlRmlsdGVycyhWYWxpZGF0b3JOYW1lRmlsdGVyW10gZmlsdGVycykgewotCQlfcHJvamVjdE5hdHVyZUZpbHRlcnMgPSBmaWx0ZXJzOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIGZhY2V0ICBmaWx0ZXIocykuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmFjZXRGaWx0ZXJzKFN0cmluZ1tdIGZpbHRlcnMpIHsKLQkJZmFjZXRGaWx0ZXJzID0gZmlsdGVyczsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZhY2V0RmlsdGVycygpIHsKLQkJcmV0dXJuIGZhY2V0RmlsdGVyczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lRmlsdGVycygpIHsKLQkJTGlzdCBuYW1lRmlsdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKF9maWx0ZXJzICE9IG51bGwgJiYgX2ZpbHRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBfZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvckZpbHRlciBmaWx0ZXIgPSBfZmlsdGVyc1tpXTsKLQkJCQlWYWxpZGF0b3JOYW1lRmlsdGVyIG5hbWVGaWx0ZXIgPSBmaWx0ZXIuZ2V0X25hbWVGaWx0ZXIoKTsKLQkJCQlpZiAobmFtZUZpbHRlciAhPSBudWxsKSB7Ci0JCQkJCW5hbWVGaWx0ZXJzLmFkZChuYW1lRmlsdGVyLmdldE5hbWVGaWx0ZXIoKSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVGaWx0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBjbGFzcyBuYW1lcyBvZiB0aGUgcHJpbWFyeSB2YWxpZGF0b3IgYW5kIGl0cyBhZ2dyZWdhdGVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0b3JOYW1lcygpIHsKLQkJaWYgKF92YWxpZGF0b3JOYW1lcyA9PSBudWxsKSB7Ci0JCQlpbnQgYUxlbmd0aCA9IChfYWdncmVnYXRlZFZhbGlkYXRvcnMgPT0gbnVsbCkgPyAwIDogX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzLmxlbmd0aDsKLQkJCV92YWxpZGF0b3JOYW1lcyA9IG5ldyBTdHJpbmdbYUxlbmd0aCArIDFdOyAvLyBhZGQgMSBmb3IgdGhlIHByaW1hcnkgdmFsaWRhdG9yIG5hbWUKLQkJCV92YWxpZGF0b3JOYW1lc1swXSA9IGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQkJCWlmIChfYWdncmVnYXRlZFZhbGlkYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoX2FnZ3JlZ2F0ZWRWYWxpZGF0b3JzLCAwLCBfdmFsaWRhdG9yTmFtZXMsIDEsIGFMZW5ndGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfdmFsaWRhdG9yTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGNsYXNzIG5hbWVzIG9mIGV2ZXJ5IHZhbGlkYXRvciB3aGljaCB0aGlzIHZhbGlkYXRvciBhZ2dyZWdhdGVzLiBGb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgRUpCIFZhbGlkYXRvciBpbnN0YW50aWF0ZWQgYW5vdGhlciB2YWxpZGF0b3IsIGFuZCBzdGFydGVkIGl0cyB2YWxpZGF0ZQotCSAqIG1ldGhvZCwgdGhlbiB0aGF0IGluc3RhbnRpYXRlZCBjbGFzcycgbmFtZSBzaG91bGQgYmUgaW4gdGhpcyBsaXN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRBZ2dyZWdhdGVkVmFsaWRhdG9yTmFtZXMoKSB7Ci0JCXJldHVybiBfYWdncmVnYXRlZFZhbGlkYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lL3R5cGUgZmlsdGVyIHBhaXJzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JGaWx0ZXJbXSBnZXRGaWx0ZXJzKCkgewotCQlyZXR1cm4gX2ZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyB2bWQncyBoZWxwZXIgYW5kIHZhbGlkYXRvciBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLCBhbmQgYWxzbyBpZiB0aGlzCi0JICogdmFsaWRhdG9yJ3MgcGx1Z2luIGlzIGFjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJaWYgKF9oZWxwZXJDbGFzc0VsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKF92YWxpZGF0b3JDbGFzc0VsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShfcGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIHRoZSBoZWxwZXIgY2Fubm90IGJlIGluc3RhbnRpYXRlZCwgZS5nLiwKLQkgKiBpZiB0aGUgaGVscGVyJ3MgcGx1Z2luIGlzIGRpc2FibGVkIGZvciBzb21lIHJlYXNvbi4gQmVmb3JlIHRoZSBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlzCi0JICogdGhyb3duLCB0aGlzIHZhbGlkYXRvciB3aWxsIGJlIGRpc2FibGVkLgotCSAqIAotCSAqIFRoZSBJV29ya2JlbmNoQ29udGV4dCBtdXN0IEFMV0FZUyBoYXZlIGl0cyBwcm9qZWN0IHNldCBiZWZvcmUgaXQgaXMgdXNlZDsgYnV0IGl0IGNhbid0IGJlCi0JICogY3JlYXRlZCB3aXRoIHRoZSBJUHJvamVjdC4gU28sIGJlZm9yZSB1c2luZyB0aGUgc2luZ2xlIGluc3RhbmNlLCBhbHdheXMgaW5pdGlhbGl6ZSB0aGF0Ci0JICogaW5zdGFuY2Ugd2l0aCB0aGUgSVByb2plY3QuCi0JICogCi0JICogSWYgdGhpcyB2YWxpZGF0b3Igc3VwcG9ydHMgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24sIHRoZW4gaW5zdGVhZCBvZiBtYWludGFpbmluZyBhIHNpbmdsZSB0aGUKLQkgKiBoZWxwZXIgaW5zdGFuY2UsIGNyZWF0ZSBhIG5ldyBJV29ya2JlbmNoQ29udGV4dCBpbnN0YW5jZSBldmVyeSB0aW1lIHRoYXQgdGhlIGhlbHBlciBpcyBuZWVkZWQuCi0JICogVGhpcyBmZWF0dXJlIGlzIHByb3ZpZGVkIGJlY2F1c2Ugc2V2ZXJhbCB2YWxpZGF0aW9uIFJ1bm5hYmxlcyBtYXkgYmUgcXVldWVkIHRvIHJ1biwgYW5kIGlmCi0JICogdGhvc2UgUnVubmFibGVzJ3MgcHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCB2YWxpZGF0aW9uJ3MgcHJvamVjdCwgdGhlbiB0aGUKLQkgKiBjdXJyZW50IHZhbGlkYXRpb24gd2lsbCBzdWRkZW5seSBzdGFydCB2YWxpZGF0aW5nIGFub3RoZXIgcHJvamVjdC4KLQkgKi8KLQkvL1RPRE8ganVzdCB3YW50IHRvIHJlbWVtYmVyIHRvIGZpZ3VyZSBvdXQgdGhlIG1hbnktdGVtcG9yYXJ5LW9iamVjdHMgcHJvYmxlbSBpZiB0aGlzIG1ldGhvZAotCS8vIGNvbnRpbnVlcyB0byBuZXcgYW4gSVZhbGlkYXRpb25Db250ZXh0IGV2ZXJ5IHRpbWUgLSBSdXRoCi0JcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChfaGVscGVyID09IG51bGwpIHsKLQkJCV9oZWxwZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlSGVscGVyKF9oZWxwZXJDbGFzc0VsZW1lbnQsIF9oZWxwZXJDbGFzc05hbWUpOwotCQkJaWYgKF9oZWxwZXIgPT0gbnVsbCkgewotCQkJCV9oZWxwZXIgPSBuZXcgV29ya2JlbmNoQ29udGV4dCgpOwotCQkJCS8vc2V0Q2Fubm90TG9hZCgpOwotCQkJCS8vdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19ESVNBQkxFSCwgbmV3IFN0cmluZ1tde19oZWxwZXJDbGFzc05hbWUsIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKX0pKTsKLQkJCX0KLQkJCS8vIFdvbid0IGJlIHVzaW5nIHRoZSBlbGVtZW50ICYgbmFtZSBhZ2Fpbiwgc28gY2xlYXIgdGhlbS4KLQkJCS8vX2hlbHBlckNsYXNzRWxlbWVudCA9IG51bGw7Ci0JCQkvL19oZWxwZXJDbGFzc05hbWUgPSBudWxsOwotCQl9Ci0JCWlmICgoX2hlbHBlci5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgfHwgIShfaGVscGVyLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpKSB7Ci0JCQkvLyBJbml0aWFsaXplIGhlbHBlciB3aXRoIHRoZSBuZXcgcHJvamVjdAotCQkJX2hlbHBlci5zZXRQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBfaGVscGVyOwotCX0KLQotCS8qKgotCSAqIGNhbm5vdExvYWQgaXMgZmFsc2UgaWYgYm90aCB0aGUgSVZhbGlkYXRvciBhbmQgSVdvcmtiZW5jaENvbnRleHQgaW5zdGFuY2UgY2FuIGJlIGluc3RhbnRpYXRlZC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCBhbmQgb25seSBpZiBhbgotCSAqIEluc3RhbnRpYXRpb25FeGNlcHRpb24gd2FzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gY2FuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENhbm5vdExvYWQoKSB7Ci0JCV9jYW5ub3RMb2FkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmFsc2UgaWYgYm90aCB0aGUgSVZhbGlkYXRvciBhbmQgSVdvcmtiZW5jaENvbnRleHQgaW5zdGFuY2UgY2FuIGJlIGluc3RhbnRpYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5ub3RMb2FkKCkgewotCQlyZXR1cm4gX2Nhbm5vdExvYWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIHVudGlsIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHZhbGlkYXRvciBoYXMgYmVlbiBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKF9sb2dnZXIgPT0gbnVsbCkgewotCQkJX2xvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkvKgotCQkJICogLy8gRGVjaWRlZCBhZ2FpbnN0IGhhdmluZyBhIGxvZ2dlciBmb3IgZWFjaCB2YWxpZGF0b3IgYmVjYXVzZSBlYWNoIHZhbGlkYXRvciAvLyB3b3VsZAotCQkJICogbmVlZCB0byBjb250cmlidXRlIGFuIGV4dGVuc2lvbiBpbiB0aGVpciBwbHVnaW5zIGZvciBpdCB0byBiZSByZWNvZ25pemVkIC8vIGJ5IHRoZQotCQkJICogbG9nZ2luZyBwcmVmZXJlbmNlIHBhZ2UuIEZvciBub3csIGp1c3QgdXNlIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaydzIGxvZ2dlci4gX2xvZ2dlciA9Ci0JCQkgKiAoTXNnTG9nZ2VyKU1zZ0xvZ2dlci5nZXRGYWN0b3J5KCkuZ2V0TG9nZ2VyKGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCQkgKiBfbG9nZ2VyLndyaXRlKExldmVsLkNPTkZJRywgZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7Ci0JCQkgKi8KLQkJfQotCQlyZXR1cm4gX2xvZ2dlcjsKLQl9Ci0KLQlwdWJsaWMgTWlncmF0aW9uTWV0YURhdGEgZ2V0TWlncmF0aW9uTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfbWlncmF0aW9uTWV0YURhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUnVsZUdyb3VwIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBncm91cHMgb2YgcnVsZXMgdGhpcyB2YWxpZGF0b3IgcmVjb2duaXplcy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJ1bGVHcm91cCgpIHsKLQkJcmV0dXJuIF9ydWxlR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWx0ZXJzIHdoaWNoIGlkZW50aWZ5IHdoaWNoIHByb2plY3QocykgdGhpcyB2YWxpZGF0b3IgbWF5IHJ1biBvbi4KLQkgKi8KLQlWYWxpZGF0b3JOYW1lRmlsdGVyW10gZ2V0UHJvamVjdE5hdHVyZUZpbHRlcnMoKSB7Ci0JCXJldHVybiBfcHJvamVjdE5hdHVyZUZpbHRlcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdmFsaWRhdG9yIGlmIGl0IGNhbiBiZSBsb2FkZWQ7IGlmIHRoZSB2YWxpZGF0b3IgY2Fubm90IGJlIGxvYWRlZCwKLQkgKiBlLmcuLCBpZiBpdHMgcGx1Z2luIGlzIGRpc2FibGVkIGZvciBzb21lIHJlYXNvbiwgdGhlbiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4KLQkgKiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLiBCZWZvcmUgdGhlIENvcmVFeGNlcHRpb24gaXMgdGhyb3duLCB0aGlzIHZhbGlkYXRvciBpcyBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIElWYWxpZGF0b3IKLQkgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChfdmFsaWRhdG9yID09IG51bGwpIHsKLQkJCV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlVmFsaWRhdG9yKF92YWxpZGF0b3JDbGFzc0VsZW1lbnQsIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0KLQkJCS8vIFNpbmNlIHRoZSBlbGVtZW50IHdvbid0IGJlIHVzZWQgYW55IG1vcmUsIGNsZWFyIGl0LgotCQkJLy9fdmFsaWRhdG9yQ2xhc3NFbGVtZW50ID0gbnVsbDsKLQotCQkJaWYgKF92YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJCXNldENhbm5vdExvYWQoKTsKLQkJCQl0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0RJU0FCTEVWLCBuZXcgU3RyaW5nW117Z2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpfSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yRGlzcGxheU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvclVuaXF1ZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHJlc291cmNlIGlzIGFwcGxpY2FibGUgdG8gdGhlIFZhbGlkYXRvciB3aGljaCB0aGlzIFZhbGlkYXRvck1ldGFEYXRhIGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoLCByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4gZmFsc2UuCi0JICogCi0JICogQSByZXNvdXJjZSBpcyBhcHBsaWNhYmxlIGlmIGl0IHBhc3NlcyB0aGUgbmFtZS90eXBlIGZpbHRlcnMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGVyZQotCSAqIGlzIG5vIHJlc291cmNlIGRlbHRhIChpLmUuLCBhIGZ1bGwgdmFsaWRhdGlvbikuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiBpc0FwcGxpY2FibGVUbyhyZXNvdXJjZSwgVmFsaWRhdG9yQWN0aW9uRmlsdGVyLkFMTF9BQ1RJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgYXBwbGljYWJsZSB0byB0aGUgVmFsaWRhdG9yIHdoaWNoIHRoaXMgVmFsaWRhdG9yTWV0YURhdGEgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgsIHJldHVybiB0cnVlOyBlbHNlIHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBBIHJlc291cmNlIGlzIGFwcGxpY2FibGUgaWYgaXQgcGFzc2VzIHRoZSBuYW1lL3R5cGUgZmlsdGVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVUbyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXNvdXJjZURlbHRhKSB7Ci0JCS8vIElmIG5vIGZpbHRlcnMgYXJlIHNwZWNpZmllZCwgdGhlbiBldmVyeSB0eXBlIG9mIHJlc291cmNlIHNob3VsZCBiZSB2YWxpZGF0ZWQvdHJpZ2dlciBhCi0JCS8vIHJlYnVpbGQgb2YgdGhlIG1vZGVsIGNhY2hlCi0JCWlmIChfZmlsdGVycyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGlzQXBwbGljYWJsZVRvKHJlc291cmNlLCByZXNvdXJjZURlbHRhLCBfZmlsdGVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc291cmNlIHBhc3NlcyB0aGUgbmFtZS90eXBlIGZpbHRlcnMgZm9yIHRoaXMgdmFsaWRhdG9yLgotCSAqLwotCWJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVzb3VyY2VEZWx0YSwKLQkJCVZhbGlkYXRvckZpbHRlcltdIGZpbHRlcnMpIHsKLQkJLy8gQXJlIGFueSBvZiB0aGUgZmlsdGVycyBzYXRpc2ZpZWQ/IChpLmUuLCBPUiB0aGVtLCBub3QgQU5EIHRoZW0uKQotCQlpZiAoY2hlY2tJZlZhbGlkU291cmNlRmlsZShyZXNvdXJjZSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvckZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzW2ldOwotCQkJCWlmIChmaWx0ZXIuaXNBcHBsaWNhYmxlVHlwZShyZXNvdXJjZSkKLQkJCQkJCSYmIGZpbHRlci5pc0FwcGxpY2FibGVOYW1lKHJlc291cmNlKQotCQkJCQkJJiYgZmlsdGVyLmlzQXBwbGljYWJsZUFjdGlvbihyZXNvdXJjZURlbHRhKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlpZiAoZ2V0Q29udGVudFR5cGVJZHMoKSAhPSBudWxsKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5leGlzdHMoKSkKLQkJCQkJZGVzY3JpcHRpb24gPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL1Jlc291cmNlIGV4Y2VwdGlvbnMKLQkJCX0KLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChpc0FwcGxpY2FibGVDb250ZW50VHlwZShkZXNjcmlwdGlvbikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0lmVmFsaWRTb3VyY2VGaWxlKElSZXNvdXJjZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IFZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFZhbGlkYXRpb25IZWxwZXIoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChoZWxwZXIgPT0gbnVsbCB8fCBwcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlJQ29udGFpbmVyW10gb3V0cHV0Q29udGFpbmVycyA9IGhlbHBlci5nZXRPdXRwdXRDb250YWluZXJzKHByb2plY3QpOwotCQkJSUNvbnRhaW5lcltdIHNvdXJjZUNvbnRhaW5lcnMgPSBoZWxwZXIuZ2V0U291cmNlQ29udGFpbmVycyhwcm9qZWN0KTsKLQkJCWZvciAoaW50IGk9MDsgaTxvdXRwdXRDb250YWluZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG91dHB1dFBhdGggPSBvdXRwdXRDb250YWluZXJzW2ldLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgob3V0cHV0UGF0aCkpIHsKLQkJCQkJLy9UaGUgZmlsZSBpcyBpbiBhbiBvdXRwdXQgY29udGFpbmVyLgotCQkJCQkvL0lmIGl0IGlzIGEgc291cmNlIGNvbnRhaW5lciByZXR1cm4gdHJ1ZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCQkJCQlmb3IgKGludCBqPTA7ajxzb3VyY2VDb250YWluZXJzLmxlbmd0aDsgaisrKSB7Ci0JICAgICAgICAgICAgICAgICAgICBpZihvdXRwdXRDb250YWluZXJzW2ldLmVxdWFscyhzb3VyY2VDb250YWluZXJzW2pdKSl7Ci0JICAgICAgICAgICAgICAgICAgICAJcmV0dXJuIHRydWU7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQkKLQkJCi0JLyoqCi0JICogSWYgdGhpcyB2YWxpZGF0b3IgcmVjb2duaXplcyB0aGUgcHJvamVjdCBuYXR1cmUsIHdoZXRoZXIgaW5jbHVkZWQgb3IgZXhjbHVkZWQsIHJldHVybiB0aGUKLQkgKiBuYW1lIGZpbHRlciB3aGljaCBkZXNjcmliZXMgdGhlIG5hdHVyZS4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCVZhbGlkYXRvck5hbWVGaWx0ZXIgZmluZFByb2plY3ROYXR1cmUoU3RyaW5nIHByb2pJZCkgewotCQlpZiAocHJvaklkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKF9wcm9qZWN0TmF0dXJlRmlsdGVycyA9PSBudWxsKSB7Ci0JCQkvLyBJZiBubyB0YWcgaXMgc3BlY2lmaWVkLCB0aGlzIHZhbGlkYXRvciBpcyBjb25maWd1cmVkIG9uIGFsbCBJUHJvamVjdHMKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBfcHJvamVjdE5hdHVyZUZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck5hbWVGaWx0ZXIgZmlsdGVyID0gX3Byb2plY3ROYXR1cmVGaWx0ZXJzW2ldOwotCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSdyZSBub3QgY2hlY2tpbmcgaWYgdGhlIHByb2plY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZpbHRlciBjbGFzcywKLQkJCS8vIGJ1dCBpZiBpdCBoYXMgdGhlIE5hdHVyZSBzcGVjaWZpZWQgaW4gdGhlIGZpbHRlciBjbGFzcy4KLQkJCVN0cmluZyBwcm9qZWN0TmF0dXJlSUQgPSBmaWx0ZXIuZ2V0TmFtZUZpbHRlcigpOwotCQkJaWYgKHByb2pJZC5lcXVhbHMocHJvamVjdE5hdHVyZUlEKSkgewotCQkJCXJldHVybiBmaWx0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSYXRoZXIgdGhhbiBzdG9yZSB0aGUgaXMtdGhpcy12bWQtY29uZmlndXJlZC1vbi10aGlzLUlQcm9qZWN0IGFsZ29yaXRobQotCSAqIGluIHR3byBwbGFjZXMsIHJlZmVyIGJhY2sgdG8gdGhlIHJlYWRlcidzIGNhY2hlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZE9uUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuaXNDb25maWd1cmVkT25Qcm9qZWN0KHRoaXMsIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEJ5RGVmYXVsdCgpIHsKLQkJcmV0dXJuIF9pc0VuYWJsZWRCeURlZmF1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmNyZW1lbnRhbCgpIHsKLQkJcmV0dXJuIF9zdXBwb3J0c0luY3JlbWVudGFsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRnVsbEJ1aWxkKCkgewotCQlyZXR1cm4gX3N1cHBvcnRzRnVsbEJ1aWxkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaXMgdGhyZWFkLXNhZmUgYW5kIGNhbiBiZSBydW4gYXN5bmNocm9ub3VzbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3luYygpIHsKLQkJcmV0dXJuIF9hc3luYzsKLQl9Ci0KLQl2b2lkIHNldEhlbHBlckNsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lKSB7Ci0JCV9oZWxwZXJDbGFzc0VsZW1lbnQgPSBlbGVtZW50OwotCQlfaGVscGVyQ2xhc3NOYW1lID0gaGVscGVyQ2xhc3NOYW1lOwotCX0KLQotCXZvaWQgc2V0RW5hYmxlZEJ5RGVmYXVsdChib29sZWFuIGVuYWJsZWRCeURlZmF1bHQpIHsKLQkJX2lzRW5hYmxlZEJ5RGVmYXVsdCA9IGVuYWJsZWRCeURlZmF1bHQ7Ci0JfQotCi0Jdm9pZCBzZXRJbmNyZW1lbnRhbChib29sZWFuIGlzSW5jcmVtZW50YWwpIHsKLQkJX3N1cHBvcnRzSW5jcmVtZW50YWwgPSBpc0luY3JlbWVudGFsOwotCX0KLQotCXZvaWQgc2V0RnVsbEJ1aWxkKGJvb2xlYW4gZnVsbEJ1aWxkKSB7Ci0JCV9zdXBwb3J0c0Z1bGxCdWlsZCA9IGZ1bGxCdWlsZDsKLQl9Ci0KLQl2b2lkIHNldEFzeW5jKGJvb2xlYW4gaXNBc3luYykgewotCQlfYXN5bmMgPSBpc0FzeW5jOwotCX0KLQotCXZvaWQgc2V0TWlncmF0aW9uTWV0YURhdGEoTWlncmF0aW9uTWV0YURhdGEgbW1kKSB7Ci0JCV9taWdyYXRpb25NZXRhRGF0YSA9IG1tZDsKLQl9Ci0KLQl2b2lkIHNldFJ1bGVHcm91cChpbnQgcnVsZUdyb3VwKSB7Ci0JCV9ydWxlR3JvdXAgPSBydWxlR3JvdXA7Ci0JfQotCi0Jdm9pZCBzZXRWYWxpZGF0b3JDbGFzcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlfdmFsaWRhdG9yQ2xhc3NFbGVtZW50ID0gZWxlbWVudDsKLQkJLy8gdmFsaWRhdG9yIGNsYXNzIG5hbWUgPT0gdmFsaWRhdG9yVW5pcXVlTmFtZQotCX0KLQotCXZvaWQgc2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoU3RyaW5nIHZhbGlkYXRvck5hbWUpIHsKLQkJX3ZhbGlkYXRvckRpc3BsYXlOYW1lID0gdmFsaWRhdG9yTmFtZTsKLQl9Ci0KLQl2b2lkIHNldFZhbGlkYXRvclVuaXF1ZU5hbWUoU3RyaW5nIHZhbGlkYXRvclVuaXF1ZU5hbWUpIHsKLQkJX3ZhbGlkYXRvclVuaXF1ZU5hbWUgPSB2YWxpZGF0b3JVbmlxdWVOYW1lOwotCX0KLQotCXZvaWQgc2V0UGx1Z2luSWQoU3RyaW5nIHZhbGlkYXRvclBsdWdpbklkKSB7Ci0JCV9wbHVnaW5JZCA9IHZhbGlkYXRvclBsdWdpbklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIE1pZ3JhdGlvbk1ldGFEYXRhIHsKLQkJcHJpdmF0ZSBTZXQgX2lkcyA9IG51bGw7Ci0KLQkJcHVibGljIE1pZ3JhdGlvbk1ldGFEYXRhKCkgewotCQkJLy9kZWZhdWx0Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRJZChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgewotCQkJaWYgKG9sZElkID09IG51bGwpIHsKLQkJCQkvLyBsb2cKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChuZXdJZCA9PSBudWxsKSB7Ci0JCQkJLy8gbG9nCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW117b2xkSWQsIG5ld0lkfTsKLQkJCWdldElkcygpLmFkZChpZHMpOwotCQl9Ci0KLQkJcHVibGljIFNldCBnZXRJZHMoKSB7Ci0JCQlpZiAoX2lkcyA9PSBudWxsKSB7Ci0JCQkJX2lkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gX2lkczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGVwZW5kZW50VmFsaWRhdG9yKGJvb2xlYW4gYikgewotCQlkZXBlbmRlbnRWYWxpZGF0b3IgPSBiOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXBlbmRlbnRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBkZXBlbmRlbnRWYWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXJrZXJJZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFya2VySWRzKCkgewotCQlyZXR1cm4gbWFya2VySWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYXJrZXJJZAotCSAqICAgICAgICAgICAgVGhlIG1hcmtlcklkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJJZHMoU3RyaW5nW10gbWFya2VySWQpIHsKLQkJdGhpcy5tYXJrZXJJZHMgPSBtYXJrZXJJZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0J1aWxkVmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIGJ1aWxkVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFZhbGlkYXRpb24oYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsKLQkJdGhpcy5idWlsZFZhbGlkYXRpb24gPSBidWlsZFZhbGlkYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYW51YWxWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gbWFudWFsVmFsaWRhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYW51YWxWYWxpZGF0aW9uKGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbikgewotCQl0aGlzLm1hbnVhbFZhbGlkYXRpb24gPSBtYW51YWxWYWxpZGF0aW9uOwotCX0KLSAgCi0JLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIHZhbGlkYXRvciBkZXNjcmliZWQgYnkgdGhpcyBtZXRhZGF0YSBvYmplY3QgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4gCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIG9iamVjdCBpcyBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGluZygpIHsKLSAgICBTdHJpbmcgdGFyZ2V0SUQgPSBnZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0gICAgcmV0dXJuIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuaGFzRGVsZWdhdGVzKHRhcmdldElEKTsKLSAgfQotICAKLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuICBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlVmFsaWRhdG9yKF92YWxpZGF0b3JDbGFzc0VsZW1lbnQsIGdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBJV29ya2JlbmNoQ29udGV4dCBjcmVhdGVIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlSGVscGVyKF9oZWxwZXJDbGFzc0VsZW1lbnQsIF9oZWxwZXJDbGFzc05hbWUpOwotCQlpZiAoaGVscGVyID09IG51bGwpIHsKLQkJCWhlbHBlciA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCX0KLQkJaGVscGVyLnNldFByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQkgIAotCQotICAgcHVibGljIHZvaWQgYWRkSGVscGVyKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyICl7Ci0JICAgaGVscGVycy5wdXQoIHZhbGlkYXRvciwgaGVscGVyICk7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlbHBlciggSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IgKXsKLQkgICBoZWxwZXJzLnJlbW92ZSggdmFsaWRhdG9yICk7Ci0gICB9Ci0gICAKLSAgIHByaXZhdGUgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciApewotCSAgIHJldHVybiAoSVdvcmtiZW5jaENvbnRleHQpaGVscGVycy5nZXQoIHZhbGlkYXRvciApOwotICAgfSAgIAotICAgCi0gICBwdWJsaWMgSVdvcmtiZW5jaENvbnRleHQgZ2V0SGVscGVyKCBJUHJvamVjdCBwcm9qZWN0LCBJVmFsaWRhdG9yIHZhbGlkYXRvciApewotCSAgIAotCSAgIGlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCSAgIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IGdldEhlbHBlciggKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yICk7Ci0JCSAgIGlmKCBoZWxwZXIgPT0gbnVsbCApewotCQkJICAgdHJ5ewotCQkJCWhlbHBlciA9ICBnZXRIZWxwZXIoIHByb2plY3QgKTsKLQkJCQlyZXR1cm4gaGVscGVyOwotCQkJICAgfWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9CQkJICAgCi0JCSAgIH0KLQkgICAJcmV0dXJuIGhlbHBlcjsKLQkgICB9Ci0JICAgZWxzZXsKLQkJICAgdHJ5IHsKLQkJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9ICBnZXRIZWxwZXIoIHByb2plY3QgKTsKLQkJCXJldHVybiBoZWxwZXI7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gbnVsbDsKLSAgIH0gICAKLSAgIAotICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RW5hYmxlbWVudEV4cHJlc2lvbigpIHsKLQkJcmV0dXJuIGVuYWJsZW1lbnRFeHByZXNzaW9uOwotCX0KLQotICAgcHVibGljIHZvaWQgc2V0RW5hYmxlbWVudEVsZW1lbnQoRXhwcmVzc2lvbiBlbmFibGVtZW50RWxlbWVudCkgewotCSBlbmFibGVtZW50RXhwcmVzc2lvbiA9IGVuYWJsZW1lbnRFbGVtZW50OwotCX0KLQotcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlSWRzKCkgewotCXJldHVybiBjb250ZW50VHlwZUlkczsKLX0KLQotcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGVJZHMoU3RyaW5nW10gY29udGVudFR5cGVJZHMpIHsKLQl0aGlzLmNvbnRlbnRUeXBlSWRzID0gY29udGVudFR5cGVJZHM7Ci19Ci0KLSAKLXByaXZhdGUgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZW50VHlwZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2MpewotCQotCUlDb250ZW50VHlwZSBjdCA9IGRlc2MuZ2V0Q29udGVudFR5cGUoKTsKLQlTdHJpbmdbXSBhcHBsaWNhYmxlQ29udGVudFR5cGVzID0gZ2V0Q29udGVudFR5cGVJZHMoKTsKLQlpZiAoYXBwbGljYWJsZUNvbnRlbnRUeXBlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwbGljYWJsZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkgKyspewotCQkJaWYoYXBwbGljYWJsZUNvbnRlbnRUeXBlc1tpXS5lcXVhbHMoY3QuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck5hbWVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTmFtZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjI5ODhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBuYW1lIGZpbHRlciB0YWcgaW4gYSB2YWxpZGF0b3IncyBwbHVnaW4ueG1sIGZpbGUuIGUuZy4gJmx0O2ZpbHRlciBuYW1lPSIqLioiPiBUaGVuCi0gKiB0aGlzIGNsYXNzIHdvdWxkIHN0b3JlIHRoZSAiKi4qIiwgYW5kIHByb3ZpZGUgdGhlIHdpbGRjYXJkIG1hdGNoaW5nIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JOYW1lRmlsdGVyIHsKLQlwcml2YXRlIFN0cmluZyBfbmFtZUZpbHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lRmlsdGVyRXh0ZW5zaW9uOwotCXByaXZhdGUgYm9vbGVhbiBfaW5jbHVkZSA9IHRydWU7IC8vIGJ5IGRlZmF1bHQsIGZpbHRlciBpbiB0aGUgSUZpbGUgc3BlY2lmaWVkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdJTERDQVJEID0gIioiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIF9pc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOyAvLyBieSBkZWZhdWx0LCB0aGUgZmlsdGVyIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzQvMDAgMTE6MDg6NDEgQU0pCi0JICovCi0JVmFsaWRhdG9yTmFtZUZpbHRlcigpIHsKLQkJLy9kZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBmaWx0ZXIsIGFzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sCi0JICovCi0JU3RyaW5nIGdldE5hbWVGaWx0ZXIoKSB7Ci0JCXJldHVybiBfbmFtZUZpbHRlcjsKLQl9Ci0KLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIF9pc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JYm9vbGVhbiBpc0luY2x1ZGUoKSB7Ci0JCXJldHVybiBfaW5jbHVkZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgYm90aCBhcHBsaWNhYmxlIGFuZCBpbmNsdWRlPSJ0cnVlIi4KLQkgKi8KLQlib29sZWFuIGlzQXBwbGljYWJsZVRvKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gKGlzQXBwbGljYWJsZU5hbWUocmVzb3VyY2UpICYmIGlzSW5jbHVkZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZUZpbHRlckV4dGVuc2lvbihTdHJpbmcgZmlsdGVyRXh0KSB7Ci0JCW5hbWVGaWx0ZXJFeHRlbnNpb24gPSBmaWx0ZXJFeHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBtYXRjaGVzIHRoZSBmaWx0ZXIsIG9yIGlmIHRoZXJlIGlzIG5vIGZpbHRlcgotCSAqIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBJZiBuYW1lIGZpbHRlciBpcyBudWxsLCBtZWFucyBmaWx0ZXIgb3V0IG5vIG5hbWVzLgotCQkvLyBPdGhlcndpc2UsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGdpdmVuIG5hbWUgbWF0Y2hlcwotCQkvLyB0aGUgbmFtZSBmaWx0ZXIuCi0JCWlmIChfbmFtZUZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBuYW1lIGlzIGV4YWN0IG1hdGNoIG9mIHRoZSBfbmFtZUZpbHRlcgotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKF9uYW1lRmlsdGVyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCWludCBpbmRleE9mU3RhckRvdCA9IF9uYW1lRmlsdGVyLmluZGV4T2YoIiouIik7Ci0KLQkJLy9yZXR1cm4gdmFsdWUgaWYgdGhlIGZpbGV0ZXIgbmFtZSBleHRlbnNpb24gbWF0Y2hlcyB0aGUgZXh0ZW5zaW9uCi0JCS8vb2YgdGhlIHJlc291cmNlIAotCQlpZiAoaW5kZXhPZlN0YXJEb3QgIT0gLTEpIHsKLQkJCVN0cmluZyBuYW1lRXh0ZW5zaW9uID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0JCQlyZXR1cm4gbmFtZUZpbHRlckV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKG5hbWVFeHRlbnNpb24pOwotCQl9Ci0KLQkJaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCi0JCXJldHVybiB2ZXJpZnlOYW1lTWF0Y2goX25hbWVGaWx0ZXIsIG5hbWUpOwotCX0KLQotCXZvaWQgc2V0SW5jbHVkZShTdHJpbmcgaW5jbHVkZVZhbHVlKSB7Ci0JCWlmIChpbmNsdWRlVmFsdWUgIT0gbnVsbCkgewotCQkJc2V0SW5jbHVkZShCb29sZWFuLnZhbHVlT2YoaW5jbHVkZVZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldEluY2x1ZGUoYm9vbGVhbiBpbmNsdWRlQm9vbCkgewotCQlfaW5jbHVkZSA9IGluY2x1ZGVCb29sOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmlsdGVyLCBhcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbAotCSAqLwotCXZvaWQgc2V0TmFtZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCV9uYW1lRmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShTdHJpbmcgaXNDYXNlU2Vuc2l0aXZlU3RyaW5nKSB7Ci0JCWlmIChpc0Nhc2VTZW5zaXRpdmVTdHJpbmcgIT0gbnVsbCkgewotCQkJLy8gb25seSBjaGFuZ2UgdGhlIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgaWYgdGhlIGNhc2Utc2Vuc2l0aXZlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkCi0JCQlfaXNDYXNlU2Vuc2l0aXZlID0gQm9vbGVhbi52YWx1ZU9mKGlzQ2FzZVNlbnNpdGl2ZVN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJOYW1lRmlsdGVyOlxuXHRuYW1lRmlsdGVyID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChfbmFtZUZpbHRlcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBmaWx0ZXIuCi0JICogCi0JICogVGhlIG9ubHkgZmlsdGVyIHdpbGRjYXJkIGFsbG93ZWQgaXMgJyonLgotCSAqLwotCXN0YXRpYyBib29sZWFuIHZlcmlmeU5hbWVNYXRjaChmaW5hbCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgbmFtZSkgewotCQkvKgotCQkgKiBUaGVyZSBhcmUgZWlnaHQgcG9zc2libGUgd2lsZGNhcmQgY29tYmluYXRpb25zLCBnaXZlbiB0aGF0IGEgd2lsZGNhcmQgbWF5LCBpZiBwcmVzZW50LCBiZQotCQkgKiBhdCB0aGUgYmVnaW5uaW5nLCBtaWRkbGUsIG9yIGVuZCBvZiBhIG5hbWU7IG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aG9zZSBwb3NpdGlvbnMuIGkuZS4sCi0JCSAqIAotCQkgKiBiZWdpbm5pbmcgbWlkZGxlIGVuZCAwIDAgMCAwIDAgMSAwIDEgMCAwIDEgMSAxIDAgMCAxIDAgMSAxIDEgMCAxIDEgMQotCQkgKiAgCi0JCSAqLwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWx0ZXIsIFdJTERDQVJELCB0cnVlKTsKLQkJYm9vbGVhbiB3aWxkY2FyZEZsYWcgPSBmYWxzZTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2tlbi5lcXVhbHMoV0lMRENBUkQpKSB7Ci0JCQkJd2lsZGNhcmRGbGFnID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdpbGRjYXJkRmxhZykgewotCQkJCQlpbnQgdG9rZW5JbmRleCA9IG5hbWUuaW5kZXhPZih0b2tlbik7Ci0JCQkJCWlmICh0b2tlbkluZGV4ID49IDApIHsKLQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyh0b2tlbkluZGV4ICsgdG9rZW4ubGVuZ3RoKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCh0b2tlbikpIHsKLQkJCQkJCWludCB0b2tlbkluZGV4ID0gdG9rZW4ubGVuZ3RoKCk7Ci0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcodG9rZW5JbmRleCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd2lsZGNhcmRGbGFnID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCF3aWxkY2FyZEZsYWcpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JUeXBlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclR5cGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxNjFkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclR5cGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSB0eXBlIGZpbHRlciB0YWcgaW4gYSB2YWxpZGF0b3IncyBwbHVnaW4ueG1sIGZpbGUuIGUuZy4gJmx0O2ZpbHRlcgotICogb2JqZWN0Q2xhc3M9ImNvbS5pYm0uZm9vLk15Q2xhc3MiPiBUaGVuIHRoaXMgY2xhc3Mgd291bGQgc3RvcmUgdGhlICJjb20uaWJtLmZvby5NeUNsYXNzIiwgYW5kCi0gKiBwcm92aWRlIHRoZSAiaW5zdGFuY2VvZiIgbWF0Y2hpbmcgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclR5cGVGaWx0ZXIgewotCXByaXZhdGUgQ2xhc3MgX3R5cGVGaWx0ZXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX211c3RJbXBsZW1lbnRDbGFzcyA9IG51bGw7IC8vIHRoZSB0eXBlIHNldCBpbiBzZXRUeXBlRmlsdGVyIG11c3QgaW1wbGVtZW50IHRoZQotCi0JLy8gY2xhc3MvaW50ZXJmYWNlIGlkZW50aWZpZWQgYnkgdGhpcyBmdWxseS1xdWFsaWZpZWQKLQkvLyBKYXZhIHN0cmluZy4KLQotCVZhbGlkYXRvclR5cGVGaWx0ZXIoKSB7Ci0JCS8vZGVmYXVsdAotCX0KLQotCVZhbGlkYXRvclR5cGVGaWx0ZXIoU3RyaW5nIG11c3RJbXBsZW1lbnRDbGFzcykgewotCQlzZXRNdXN0SW1wbGVtZW50Q2xhc3MobXVzdEltcGxlbWVudENsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBlIGZpbHRlcnMgYXJlIGFsbG93ZWQgb25seSBmb3IgY2VydGFpbiB0eXBlcyBvZiBjbGFzc2VzLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mCi0JICogdGhlIGNsYXNzIHdoaWNoIHRoaXMgdHlwZSBtdXN0IGltcGxlbWVudCBiZWZvcmUgaXQgY2FuIGJlIGEgZmlsdGVyLgotCSAqLwotCVN0cmluZyBnZXRNdXN0SW1wbGVtZW50Q2xhc3MoKSB7Ci0JCXJldHVybiBfbXVzdEltcGxlbWVudENsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBmaWx0ZXIgYXMgYSBqYXZhLmxhbmcuQ2xhc3Mgb2JqZWN0LgotCSAqLwotCUNsYXNzIGdldFR5cGVGaWx0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIF90eXBlRmlsdGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXNvdXJjZSBwYXNzZWQgaW4gZWl0aGVyIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIGZpbHRlciBjbGFzcywgb3IgaWYKLQkgKiB0aGVyZSBpcyBubyB0eXBlIGZpbHRlciBjbGFzcyBkZWZpbmVkIGluIHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVHlwZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJLy8gSWYgdHlwZSBmaWx0ZXIgaXMgbnVsbCwgbWVhbnMgZmlsdGVyIG91dCBubyB0eXBlcy4KLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0eXBlIGlzIGFuIGluc3RhbmNlIG9mCi0JCS8vIHRoZSB0eXBlIGZpbHRlci4KLQkJaWYgKF90eXBlRmlsdGVyQ2xhc3MgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIElmIHRoZSByZXNvdXJjZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBmaWx0ZXIgY2xhc3MuCi0JCXJldHVybiBpc0luc3RhbmNlKHJlc291cmNlLmdldENsYXNzKCksIF90eXBlRmlsdGVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWx0ZXJDbGFzcyBpcyBhIHBhcmVudCAoaW50ZXJmYWNlIG9yIHN1cGVyY2xhc3MpIG9mIG9iamVjdENsYXNzLgotCSAqLwotCWJvb2xlYW4gaXNJbnN0YW5jZShDbGFzcyBvYmplY3RDbGFzcywgQ2xhc3MgZmlsdGVyQ2xhc3MpIHsKLQkJLy8gVGhlIGphdmEubGFuZy5DbGFzcy5pc0luc3RhbmNlIGNhbGwgZG9lc24ndCBjaGVjayBpbnRlcmZhY2VzIGZ1bGx5LgotCQkvLyBpLmUuLCBpZiBJIGhhdmUgdHdvIGludGVyZmFjZXMsIEEgYW5kIEIsIGFuZCBCIGV4dGVuZHMgQSBidXQKLQkJLy8gZG9lc24ndCBpbXBsZW1lbnQgQSwgdGhlbiB0aGUgaXNJbnN0YW5jZSBjYWxsIHdpbGwgcmV0dXJuIGZhbHNlLgotCQkvLwotCQkvLyBTbywgaW5zdGVhZCBvZiB1c2luZyBDbGFzcy5pc0luc3RhbmNlLCBkbyB0aGUgY2hlY2tpbmcgbXlzZWxmLgotCQlmb3IgKENsYXNzIGNsID0gb2JqZWN0Q2xhc3M7IGNsICE9IG51bGw7IGNsID0gY2wuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlpZiAoY2wuZ2V0TmFtZSgpLmVxdWFscyhmaWx0ZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlDbGFzc1tdIGNsSW50ZXJmYWNlcyA9IGNsLmdldEludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNsSW50ZXJmYWNlc1tpXS5nZXROYW1lKCkuZXF1YWxzKGZpbHRlckNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBpc0luc3RhbmNlKGNsSW50ZXJmYWNlc1tpXSwgZmlsdGVyQ2xhc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBlIGZpbHRlcnMgYXJlIGFsbG93ZWQgb25seSBmb3IgY2VydGFpbiB0eXBlcyBvZiBjbGFzc2VzLiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBuYW1lIG9mIHRoZQotCSAqIGNsYXNzIHdoaWNoIHRoaXMgdHlwZSBtdXN0IGltcGxlbWVudCBiZWZvcmUgaXQgY2FuIGJlIGEgZmlsdGVyLgotCSAqLwotCXZvaWQgc2V0TXVzdEltcGxlbWVudENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJX211c3RJbXBsZW1lbnRDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgZmlsdGVyIGltcGxlbWVudHMgdGhlIG11c3RJbXBsZW1lbnRDbGFzcyAoaW4gVmFsaWRhdG9yRmlsdGVyJ3MgY2FzZSwgSVJlc291cmNlKSwgdGhlbgotCSAqIHRoaXMgaXMgYSB2YWxpZCBmaWx0ZXIsIGFuZCBzdG9yZSB0aGUgZmlsdGVyIHZhbHVlLgotCSAqLwotCXZvaWQgc2V0VHlwZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCUNsYXNzIGZpbHRlckNsYXNzID0gbnVsbDsKLQkJQ2xhc3MgbXVzdEltcGxlbWVudENsYXNzID0gbnVsbDsKLQotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCV90eXBlRmlsdGVyQ2xhc3MgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZpbHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShmaWx0ZXIpOwotCQkJaWYgKGdldE11c3RJbXBsZW1lbnRDbGFzcygpICE9IG51bGwpIHsKLQkJCQltdXN0SW1wbGVtZW50Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGdldE11c3RJbXBsZW1lbnRDbGFzcygpKTsKLQotCQkJCS8vIElmIHRoZSBmaWx0ZXIgY2xhc3MgaXMgbm90IGFuIGluc3RhbmNlIG9mIG11c3RJbXBsZW1lbnRDbGFzcwotCQkJCWlmICghaXNJbnN0YW5jZShmaWx0ZXJDbGFzcywgbXVzdEltcGxlbWVudENsYXNzKSkgewotCQkJCQlfdHlwZUZpbHRlckNsYXNzID0gbnVsbDsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRvclR5cGVGaWx0ZXIuc2V0VHlwZUZpbHRlcihTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldE1lc3NhZ2VUeXBlSUQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlZBTElEX1RZUEVfRklMVEVSKTsKLQkJCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0lOVkFMSURfVFlQRV9GSUxURVIpLCBuZXcgU3RyaW5nW117ZmlsdGVyLCBnZXRNdXN0SW1wbGVtZW50Q2xhc3MoKX0pOwotCQkJCQkJZW50cnkuc2V0VGV4dChyZXN1bHQpOwkJCQkJCQotCQkJCQkJLy9lbnRyeS5zZXRUb2tlbnMobmV3IFN0cmluZ1tde2ZpbHRlciwgZ2V0TXVzdEltcGxlbWVudENsYXNzKCl9KTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjKSB7Ci0JCQlfdHlwZUZpbHRlckNsYXNzID0gbnVsbDsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0b3JUeXBlRmlsdGVyLnNldFR5cGVGaWx0ZXIoU3RyaW5nKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGV4dCgiVGhlIGNsYXNzIG5hbWVkICIgKyBmaWx0ZXIgKyAiIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBuYW1lLCBpbiB0aGUgdmFsaWRhdG9yJ3MgcGx1Z2luLnhtbCBjb250cmlidXRpb24sIGFuZCB0cnkgcmVzdGFydGluZyBlY2xpcHNlIGFnYWluLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlfdHlwZUZpbHRlckNsYXNzID0gZmlsdGVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiVHlwZUZpbHRlcjoiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCIgICAgIF90eXBlRmlsdGVyQ2xhc3MgPSAiICsgX3R5cGVGaWx0ZXJDbGFzcy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIiAgICAgX211c3RJbXBsZW1lbnRDbGFzcyA9ICIgKyBfbXVzdEltcGxlbWVudENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc1ZGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0RlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBieSBjbGllbnRzIHdobyB3YW50IHRvIHByb3ZpZGUKLSAqIGFsdGVybmF0ZSB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zIGZvciBhIGdpdmVuIHZhbGlkYXRvciB0eXBlLgotICogCi0gKiBJdCBsb2NhdGVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBkZWxlZ2F0ZSBmb3IgdGhpcyB2YWxpZGF0b3IgYW5kIGNhbGxzIGl0cwotICogdmFsaWRhdGUgbWV0aG9kLgotICogCi0gKiBAc2VlIElWYWxpZGF0b3IKLSAqIEBzZWUgSURlbGVnYXRpbmdWYWxpZGF0b3IKLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSURlbGVnYXRpbmdWYWxpZGF0b3IKLXsKLSAgcHVibGljIERlbGVnYXRpbmdWYWxpZGF0b3IoKQotICB7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgICAvLyBbSXNzdWVdIFRoaXMgbWV0aG9kIGRvZXMgbm90IGdldCBwYXNzZWQgdGhlIHZhbGlkYXRpb24gY29udGV4dC4gSG93IGFyZQotICAgIC8vIGdvaW5nIHRvIGtub3cgdGhlIGRlbGVnYXRlIGluIG9yZGVyIHRvIGludm9rZSBpdHMgY2xlYW51cCBtZXRob2Q/Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwKLSAgICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIEFwcGFyZW50bHkgdGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGFuIElWYWxpZGF0b3JKb2IuCi0gIH0KLQotICAvKioKLSAgICogV3JhcHMgdGhlIG9yaWdpbmFsIHJlcG9ydGVyIGluc3RhbmNlIHRvIG1ha2UgaXQgbG9vayBsaWtlIHRoaXMgdmFsaWRhdG9yIGlzCi0gICAqIHRoZSBvbmUgZ2VuZXJhdGluZyBtZXNzYWdlcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZnJhbWV3b3JrIGlnbm9yZXMKLSAgICogbWVzc2FnZXMgY29taW5nIGZyb20gdGhlIGRlbGVnYXRlIHZhbGlkYXRvciBiZWNhdXNlIGl0IGlzIG5vdCByZWdpc3RlcmVkCi0gICAqIHdpdGggdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBEZWxlZ2F0aW5nUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIKLSAgewotICAgIC8qKgotICAgICAqIFRoZSByZXBvcnRlciBwYXNzZWQgb3JpZ2luYWxseSB0byB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IgYnkgdGhlCi0gICAgICogZnJhbWV3b3JrLgotICAgICAqLwotICAgIElSZXBvcnRlciBkZWxlZ2F0aW5nUmVwb3J0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAgICovCi0gICAgSVZhbGlkYXRvciBkZWxlZ2F0aW5nVmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgICAqICAgICAgICAgIHRoZSBvcmlnaW5hbCB2YWxpZGF0b3IuCi0gICAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAgICogICAgICAgICAgdGhlIHJlcG9ydGVyIG9yaWdpbmFsbHkgcGFzc2VkIHRvIHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICAgKi8KLSAgICBEZWxlZ2F0aW5nUmVwb3J0ZXIoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElSZXBvcnRlciByZXBvcnRlcikKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIgPSByZXBvcnRlcjsKLSAgICAgIGRlbGVnYXRpbmdWYWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNhZGRNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwKLSAgICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIG9yaWdpbiwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIuYWRkTWVzc2FnZShkZWxlZ2F0aW5nVmFsaWRhdG9yLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI2Rpc3BsYXlTdWJ0YXNrKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciwKLSAgICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKGRlbGVnYXRpbmdWYWxpZGF0b3IsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjZ2V0TWVzc2FnZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGluZ1JlcG9ydGVyLmdldE1lc3NhZ2VzKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNpc0NhbmNlbGxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKQotICAgIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0aW5nUmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbikKLSAgICB7Ci0gICAgICBkZWxlZ2F0aW5nUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZGVsZWdhdGluZ1ZhbGlkYXRvcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luLCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIGRlbGVnYXRpbmdSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhkZWxlZ2F0aW5nVmFsaWRhdG9yLCBvYmplY3QpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3IsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpCi0gICAgewotICAgICAgZGVsZWdhdGluZ1JlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQoZGVsZWdhdGluZ1ZhbGlkYXRvciwgb2JqLCBncm91cE5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iI3ZhbGlkYXRlSW5Kb2Iob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQsCi0gICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgewotICAgIFZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh0aGlzKTsKLSAgICBTdHJpbmcgdmFsaWRhdG9yTmFtZSA9IHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotCi0gICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpcyBhbiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0LiBUaGUKLSAgICAvLyBsaW1pdGF0aW9uIG9mIHVzaW5nIGFuIElWYWxpZGF0aW9uQ29udGV4dCBpcyB0aGF0IGl0IGRvZXMgbm90IHJlYWRpbHkKLSAgICAvLyBwcm92aWRlIHRoZSBwcm9qZWN0IHRoZSB2YWxpZGF0b3IgaXMgYmVpbmcgaW52b2tlZCB1cG9uLgotCi0gICAgaWYgKCEoaGVscGVyIGluc3RhbmNlb2YgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1dST05HX0NPTlRFWFRfRk9SX0RFTEVHQVRFLCBuZXcgU3RyaW5nW10geyB2YWxpZGF0b3JOYW1lIH0pKSk7Ci0gICAgfQotCi0gICAgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBwcm9qZWN0Q29udGV4dCA9IChJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0KSBoZWxwZXI7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RDb250ZXh0LmdldFByb2plY3QoKTsKLQotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZWxlZ2F0ZURlc2NyaXB0b3IgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJvamVjdENvbmZpZyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQotICAgICAgZGVsZWdhdGVEZXNjcmlwdG9yID0gcHJvamVjdENvbmZpZy5nZXREZWxlZ2F0ZURlc2NyaXB0b3Iodm1kKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBbHJlYWR5IGRlYWx0IHdpdGggYnkgdGhlIGZyYW1ld29yay4KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChkZWxlZ2F0ZURlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX05PX0RFTEVHQVRFLCBuZXcgU3RyaW5nW10geyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSB9KSkpOwotICAgICAgfQotICAgIH0KLQotICAgIElWYWxpZGF0b3JKb2IgZGVsZWdhdGUgPSAoSVZhbGlkYXRvckpvYilkZWxlZ2F0ZURlc2NyaXB0b3IuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIG1ha2UgaXQgbG9vayBsaWtlIHRoaXMgdmFsaWRhdG9yIGlzIHRoZSBvbmUgZ2VuZXJhdGluZwotICAgIC8vIG1lc3NhZ2VzIHNvIHdlIHdyYXAgdGhlIHJlcG9ydGVyIGFuZCB1c2UgdGhpcyB2YWxpZGF0b3IgYXMgdGhlIHNvdXJjZS4KLSAgICAvLyBUaGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZG9lcyBub3QgcmVjb2duaXplIG91ciB2YWxpZGF0b3JzIGJlY2F1c2UgdGhleQotICAgIC8vIGFyZSBub3QgcmVnaXN0ZXJlZCBkaXJlY3RseSB3aXRoIHRoZSBmcmFtZXdvcmsuCi0gICAgLy8gV2UgY291bGQgbWFrZSB0aGVtIHdvcmsgbGlrZSB0aGUgYWdncmVnYXRlZCB2YWxpZGF0b3JzIGJ1dCB0aGF0IHdvdWxkCi0gICAgLy8gY3JlYXRlIHByb2JsZW1zIHdpdGggbWFya2VycyBub3QgYmVpbmcgY2xlYW5lZCB1cCBpZiBzb21lb25lIHN3aXRjaGVzCi0gICAgLy8gdmFsaWRhdG9ycy4KLSAgICAvLyBUT0RPIDogTWF5YmUgd2UgY291bGQgY2xlYXIgYWxsIHRoZSBtYXJrZXJzIGdlbmVyYXRlZCBieSBhIGRlbGVnYXRlIHdoZW4KLSAgICAvLyB0aGUgdXNlciBjaG9vc2VzIGEgZGlmZmVyZW50IGRlbGVnYXRlIGltcGxlbWVudGF0aW9uPwotCi0gICAgRGVsZWdhdGluZ1JlcG9ydGVyIGRlbGVnYXRpbmdSZXBvcnRlciA9IG5ldyBEZWxlZ2F0aW5nUmVwb3J0ZXIodGhpcywgcmVwb3J0ZXIpOwotCi0gICAgSVN0YXR1cyBzdGF0dXMgPSBkZWxlZ2F0ZS52YWxpZGF0ZUluSm9iKGhlbHBlciwgZGVsZWdhdGluZ1JlcG9ydGVyKTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9JRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvSURlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3OWVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9JRGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci0KLS8qKgotICogQSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBkZWxlZ2F0ZXMgdGhlIGFjdHVhbCB2YWxpZGF0aW9uIHdvcmsgdG8gYSBkZWxlZ2F0ZQotICogdmFsaWRhdG9yLiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGZyYW1ld29yayB0bwotICogZGV0ZXJtaW5lIGlmIGEgZGVsZWdhdGUgaXMgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAqIAotICogW0lzc3VlXSBDb3VsZC9zaG91bGQgdGhpcyBpbnRlcmZhY2UgYmUgcmVwbGFjZWQgd2l0aCBhbiBhdHRyaWJ1dGUgb24gdGhlCi0gKiB2YWxpZGF0b3JzIGV4dGVuc2lvbiBkZWZpbml0aW9uPwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsZWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIElWYWxpZGF0b3JKb2IKLXsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmEwYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3Igc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgZGVsZWdhdGUgdmFsaWRhdG9yLgotICogCi0gKiBJdCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0b3IgaXQgZGVzY3JpYmVzLiBUbwotICogb2J0YWluIHRoZSBpbnN0YW5jZSBjYWxsIGdldFZhbGlkYXRvcigpLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiBUaGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBlbGVtZW50IGRlc2NyaWJpbmcgdGhpcyBkZWxlZ2F0ZS4KLSAgICovCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlbGVnYXRlQ29uZmlndXJhdGlvbjsKLQotICAvKioKLSAgICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgSUQuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBkZWxlZ2F0aW5nVmFsaWRhdG9ySUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0ZSdzIElELgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0ZSdzIGRpc3BsYXkgbmFtZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBkZXNjcmlwdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGlkCi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0ZSdzIHVuaXF1ZXMgaWQuIE11c3QgYmUgdW5pcXVlIGluIHRoZSBjb250ZXh0IG9mIGEKLSAgICogICAgICAgICAgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24KLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRlcyBjb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgICogQHBhcmFtIGRlbGVnYXRlTmFtZQotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGUncyBkaXNwbGF5IG5hbWUuCi0gICAqIEBwYXJhbSB0YXJnZXRWYWxpZGF0b3JJRAotICAgKiAgICAgICAgICB0aGUgdGFyZ2V0IHZhbGlkYXRvcidzIHVuaXF1ZSBpZC4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IoU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVsZWdhdGVDb25maWd1cmF0aW9uLCBTdHJpbmcgZGVsZWdhdGVOYW1lLCBTdHJpbmcgdGFyZ2V0VmFsaWRhdG9ySUQpCi0gIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gICAgdGhpcy5kZWxlZ2F0ZUNvbmZpZ3VyYXRpb24gPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gZGVsZWdhdGVOYW1lOwotICAgIHRoaXMuZGVsZWdhdGluZ1ZhbGlkYXRvcklEID0gdGFyZ2V0VmFsaWRhdG9ySUQ7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlbGVnYXRlJ3MgSUQuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yCi0gICAqICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBpZDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgZGVsZWdhdGUncyBuYW1lLgotICAgKiAKLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB2YWxpZGF0b3IncyBkaXNwbGF5IG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0cmlldmVzIHRoZSB0YXJnZXQgdmFsaWRhdG9yJ3MgSUQuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBkZWxlZ2F0aW5nCi0gICAqICAgICAgICAgdmFsaWRhdG9yIHdobyB3aWxsIGRlbGVnYXRlIGl0cyBpbXBsZW1lbnRhdGlvbiB0byB0aGUgdmFsaWRhdG9yCi0gICAqICAgICAgICAgZGVzY3JpYmVkIGJ5IHRoaXMgZGVzY3JpcHRvci4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRpbmdWYWxpZGF0b3JJRDsKLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSBwb2ludGVkIHRvIGJ5IHRoaXMKLSAgICogZGVzY3JpcHRvci4KLSAgICogCi0gICAqIEByZXR1cm4gYW4gSVZhbGlkYXRvciBpbnN0YW5jZS4KLSAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVZhbGlkYXRvciBkZWxlZ2F0ZSA9IChJVmFsaWRhdG9yKSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlci5DTEFTU19BVFRSSUJVVEUpOwotICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0cmluZyBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShnZXRUYXJnZXRJRCgpKS5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpOwotICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0NBTk5PVF9JTlNUQU5USUFURV9ERUxFR0FURSwgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZSgpLCBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSB9KSkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjk4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSBpcyBhIHNpbmdsZXRvbiB1c2VkIHRvIHN0b3JlIHZhbGlkYXRvciBkZWxlZ2F0ZQotICogZGVzY3JpcHRvcnMgZm9yIGVhY2ggZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeQotewotICAvKioKLSAgICogVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgaW5zdGFuY2U7Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICogCi0gICAqIFRoZSBhY3R1YWwgcGxhdGZvcm0gZXh0ZW5zaW9uIHJlZ2lzdHJ5IHJlYWRpbmcgaGFwcGVucyBhdCB0aGlzIHRpbWUuCi0gICAqIAotICAgKiBAc2VlIFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IgZGVsZWdhdGVzIHJlZ2lzdHJ5IHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkoKTsKLQotICAgICAgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyKGluc3RhbmNlKTsKLSAgICAgIHJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1hcCBvZiB0YXJnZXQgdmFsaWRhdG9yIGlkIHRvIE1hcCBvZiBkZWxlZ2F0ZXMgYnkgaWQuCi0gICAqLwotICBwcml2YXRlIE1hcCBkZWxlZ2F0ZXNCeVRhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBkZXNjcmlwdG9yIHRvIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIHRvIGFkZC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHZvaWQgYWRkKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RyaW5nIHRhcmdldElEID0gZGVzY3JpcHRvci5nZXRUYXJnZXRJRCgpOwotCi0gICAgTWFwIGRlbGVnYXRlcyA9IChNYXApIGRlbGVnYXRlc0J5VGFyZ2V0LmdldCh0YXJnZXRJRCk7Ci0KLSAgICBpZiAoZGVsZWdhdGVzID09IG51bGwpCi0gICAgewotICAgICAgZGVsZWdhdGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgIGRlbGVnYXRlc0J5VGFyZ2V0LnB1dCh0YXJnZXRJRCwgZGVsZWdhdGVzKTsKLSAgICB9Ci0KLSAgICBkZWxlZ2F0ZXMucHV0KGRlc2NyaXB0b3IuZ2V0SWQoKSwgZGVzY3JpcHRvcik7Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIGRlZmF1bHQgZGVsZWdhdGUgSUQgZm9yIHRoZSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvciBJRC4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBJRC4KLSAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBkZWxlZ2F0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERlbGVnYXRlKFN0cmluZyB0YXJnZXRJRCkKLSAgewotICAgIE1hcCBkZWxlZ2F0ZXMgPSBnZXREZWxlZ2F0ZURlc2NyaXB0b3JzKHRhcmdldElEKTsKLQotICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYSBkZWZhdWx0IGF0dHJpYnV0ZSBhbmQgdXNlIHRoYXQgdG8gZ2V0IHRoZSBkZWZhdWx0PwotICAgIC8vIFdoYXQgaGFwcGVucyBpZiB0d28gb3IgbW9yZSBkZWxlZ2F0ZXMgY2xhaW0gdG8gYmUgdGhlIGRlZmF1bHQgb25lPwotICAgIC8vIEZvciBub3csIGp1c3QgcGljayB0aGUgZmlyc3Qgb25lIGluIHRoZSBsaXN0LgotCi0gICAgSXRlcmF0b3IgZGVsZWdhdGVzSXRlcmF0b3IgPSBkZWxlZ2F0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIGlmICghZGVsZWdhdGVzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcikgZGVsZWdhdGVzSXRlcmF0b3IubmV4dCgpOwotCi0gICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZXMgYSBkZWxlZ2F0ZSBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgdGFyZ2V0IGFuZCBkZWxlZ2F0ZSBJRHMuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgSUQuCi0gICAqIEBwYXJhbSBkZWxlZ2F0ZUlECi0gICAqICAgICAgICAgIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IncyBJRC4KLSAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgZGVsZWdhdGUgdmFsaWRhdG9yIG9yIG51bGwgaWYgb25lIGNhbm5vdCBiZQotICAgKiAgICAgICAgIGZvdW5kLgotICAgKi8KLSAgcHVibGljIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGUoU3RyaW5nIHRhcmdldElELCBTdHJpbmcgZGVsZWdhdGVJRCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KLSAgewotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcih0YXJnZXRJRCwgZGVsZWdhdGVJRCk7Ci0KLSAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIElWYWxpZGF0b3IgZGVsZWdhdGUgPSBkZXNjcmlwdG9yLmdldFZhbGlkYXRvcigpOwotCi0gICAgcmV0dXJuIGRlbGVnYXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGEgbWFwIHdpdGggYWxsIGRlbGVnYXRlcyBkZXNjcmlwdG9ycyBmb3IgdGhlIGdpdmVuIHRhcmdldCwga2V5ZWQKLSAgICogYnkgdGhlaXIgSUQuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIHRhcmdldCAoZGVsZWdhdGluZykgdmFsaWRhdG9yIGlkLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIGEgTWFwIDxzdHJpbmcsIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4uIE1heSBiZSBudWxsIGlmIHRoZSBJRAotICAgKiAgICAgICAgIHBhc3NlZCBpbiBpcyBub3QgYSBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyhTdHJpbmcgdGFyZ2V0SUQpCi0gIHsKLSAgICByZXR1cm4gKE1hcCkgZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElEKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyBhIGRlbGVnYXRlIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIHRhcmdldCBpZCBhbmQgZGVsZWdhdGUgaWQuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0SUQKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgaWQKLSAgICogQHBhcmFtIGRlbGVnYXRlSUQKLSAgICogICAgICAgICAgdGhlIGRlbGVnYXRlIGlkCi0gICAqIEByZXR1cm4gYSBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0YXJnZXQgYW5kIGlkIG9yIG51bGwKLSAgICogICAgICAgICBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyB0YXJnZXRJRCwgU3RyaW5nIGRlbGVnYXRlSUQpCi0gIHsKLSAgICBNYXAgZGVsZWdhdGVzID0gKE1hcCkgZGVsZWdhdGVzQnlUYXJnZXQuZ2V0KHRhcmdldElEKTsKLQotICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBObyBkZWxlZ2F0ZXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0YXJnZXQuCi0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGlmIChkZWxlZ2F0ZUlEID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcikgZGVsZWdhdGVzLmdldChkZWxlZ2F0ZUlEKTsKLQotICAgIHJldHVybiBkZXNjcmlwdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgYSBnaXZlbiB2YWxpZGF0b3IgaGFzIGRlbGVnYXRlcy4KLSAgICogCi0gICAqIEBwYXJhbSB0YXJnZXRJRAotICAgKiAgICAgICAgICB0aGUgdGFyZ2V0IHZhbGlkYXRvciBpZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIHJlZ2lzdGVyZWQgZGVsZWdhdGVzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNEZWxlZ2F0ZXMoU3RyaW5nIHRhcmdldElEKQotICB7Ci0gICAgTWFwIGRlbGVnYXRlc0J5SUQgPSAoTWFwKSBkZWxlZ2F0ZXNCeVRhcmdldC5nZXQodGFyZ2V0SUQpOwotCi0gICAgYm9vbGVhbiBoYXNEZWxlZ2F0ZXMgPSAoZGVsZWdhdGVzQnlJRCAhPSBudWxsICYmICFkZWxlZ2F0ZXNCeUlELmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIGhhc0RlbGVnYXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NGUyNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5IGFuZCByZWdpc3RlcnMgZWFjaCBkZWxlZ2F0aW5nCi0gKiB2YWxpZGF0b3IgZGVzY3JpcHRvciB3aXRoIHRoZSBkZWxlZ2F0ZXMgcmVnaXN0cnkuCi0gKiAKLSAqIEBzZWUgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkKLSAqLwotY2xhc3MgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWxlZ2F0ZSBjbGFzcyBhdHRyaWJ1dGUuIE11c3QgYmUgdmlzaWJsZSBpbiB0aGUgcGFja2FnZSBiZWNhdXNlIGl0IGlzCi0gICAqIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyBpbiB0aGUgcGFja2FnZS4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgZGVsZWdhdGUgZWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVHQVRFX0VMRU1FTlQgPSAiZGVsZWdhdGUiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSB2YWxpZGF0b3IgZGVsZWdhdGVzIGV4dGVuc2lvbiBwb2ludCBpZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAidmFsaWRhdG9yRGVsZWdhdGVzIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgZGVsZWdhdGUgbmFtZSBhdHRyaWJ1dGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogUGx1Z2luIGlkLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlIHRhcmdldCBpZCBhdHRyaWJ1dGUgbmFtZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQVRUUklCVVRFID0gInRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogVGhlIHZhbGlkYXRvciByZWdpc3RyeSB3aGVyZSB0aGUgZGVzY3JpcHRvcnMgYmVpbmcgcmVhZCB3aWxsIGJlIHBsYWNlZC4KLSAgICovCi0gIHByaXZhdGUgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJlZ2lzdHJ5Ci0gICAqICAgICAgICAgIHRoZSByZWdpc3RyeSB3aGVyZSB0aGUgZGVzY3JpcHRvcnMgYmVpbmcgcmVhZCB3aWxsIGJlIHBsYWNlZC4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlcihWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgICAgIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYmVpbmcgcmVhZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0gICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERUxFR0FURV9FTEVNRU5UKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmcgZGVsZWdhdGVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUpOwotICAgICAgU3RyaW5nIHRhcmdldFZhbGlkYXRvcklEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFSR0VUX0FUVFJJQlVURSk7Ci0KLSAgICAgIFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcihkZWxlZ2F0ZUlELCBlbGVtZW50LCBkZWxlZ2F0ZU5hbWUsIHRhcmdldFZhbGlkYXRvcklEKTsKLQotICAgICAgcmVnaXN0cnkuYWRkKGRlc2NyaXB0b3IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGZyb20gdGhlIGV4dGVuc2lvbnMgcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0KLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCi0gICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpbmRleF0pOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FsbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BbGxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmRhMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FsbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIFRoaXMgb3BlcmF0aW9uIHJ1bnMgYWxsIHZhbGlkYXRvcnM6IGVuYWJsZWQgdmFsaWRhdG9ycywgZGlzYWJsZWQgdmFsaWRhdG9ycywgaW5jcmVtZW50YWwKLSAqIHZhbGlkYXRvcnMsIGZ1bGwgdmFsaWRhdG9ycy4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcyhwcm9qZWN0LCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gYWxsIGNvbmZpZ3VyZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgaXMgZW5hYmxlZAotCSAqIG9yIGRpc2FibGVkIGJ5IHRoZSB1c2VyLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuCi0JICogSWYgYXN5bmMgaXMgZmFsc2UsIG5vIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgQWxsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIHRydWUsIGFzeW5jKTsvLyBhbHdheXMgZm9yY2UgdmFsaWRhdGlvbiB0byBydW4KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0VmFsaWRhdG9ycygpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFdmVudE1hbmFnZXI6OmNsb3NpbmcoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0UmVzb3VyY2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRGVmYXVsdFJlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMWQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0UmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBsaW5lIG51bWJlciBjYWxjdWxhdG9yIChhbHdheXMgcmV0dXJucyAiMCIpLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlc291cmNlVXRpbCBpbXBsZW1lbnRzIElSZXNvdXJjZVV0aWwgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSZXNvdXJjZVV0aWwjZ2V0TGluZU5vKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAwOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYyNmRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEltcGxlbWVudGVkIFZhbGlkYXRvcnMgbXVzdCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFueW9uZSBvdGhlciB0aGFuIGluc3RhbmNlcyBvZgotICogVmFsaWRhdGlvbk9wZXJhdGlvbiwgYmVjYXVzZSBzb21lIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWxpZGF0b3IsIGFuZCBoYW5kbGluZyBvZiBlcnJvcgotICogY29uZGl0aW9ucywgaXMgZG9uZSBpbiB0aGUgb3BlcmF0aW9uLiBUaGUgaW5pdGlhbGl6YXRpb24gaXMgc2VwYXJhdGVkIGJlY2F1c2Ugc29tZSBvZiB0aGUKLSAqIGluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSB2YWxpZGF0b3IgKGkuZS4sIHRoZSBwcm9qZWN0KSBpc24ndCBrbm93biB1bnRpbCBydW50aW1lLgotICogCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBvcGVyYXRpb24gbG9hZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyZWQgdmFsaWRhdG9ycywgYW5kIHJ1biB0aGUgdmFsaWRhdG9ycyBpZgotICogdGhleSBhcmUgYm90aCBlbmFibGVkIGFuZCBpbmNyZW1lbnRhbC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gewotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlCi0JICogICAgICAgICAgICAgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCwgSVJlc291cmNlRGVsdGEsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdGhpcyhwcm9qZWN0LCBkZWx0YSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsIHJ1bGVHcm91cCwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UKLQkgKiAgICAgICAgICAgICBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgU2V0IHZhbGlkYXRvcnMsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsIHJ1bGVHcm91cCwgREVGQVVMVF9BU1lOQyk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgZGVsdGEgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyBpcwotCSAqIHBlcmZvcm1lZC4gSWYgZGVsdGEgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMKLQkgKiBpbiB0aGUgZGVsdGEgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIGFzeW5jKTsKLQl9Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBkZWx0YSBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIGlzCi0JICogcGVyZm9ybWVkLiBJZiBkZWx0YSBpcyBub3QgbnVsbCwgYWxsIGVuYWJsZWQgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyB0aGF0IHZhbGlkYXRlIHJlc291cmNlcwotCSAqIGluIHRoZSBkZWx0YSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgY29udGV4dCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LGNvbnRleHQsIGRlbHRhLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBhc3luYyk7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgZGVsdGEgaXMgbnVsbCwgYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QgdXNpbmcgb25seSB0aGUgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyBpcwotCSAqIHBlcmZvcm1lZC4gSWYgZGVsdGEgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMKLQkgKiBpbiB0aGUgZGVsdGEgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsSVdvcmtiZW5jaENvbnRleHQgY29udGV4dCwgSVJlc291cmNlRGVsdGEgZGVsdGEsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgcnVsZUdyb3VwLCBzaG91bGRGb3JjZShkZWx0YSksIGFzeW5jKTsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyh0cnVlKSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRW5hYmxlZEluY3JlbWVudGFsVkFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdDwiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiPiwgSVJlc291cmNlRGVsdGEsIGludCwgYm9vbGVhbikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNldERlbHRhKGRlbHRhKTsKLQkJc2V0Q29udGV4dChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGRlbHRhIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgaXMKLQkgKiBwZXJmb3JtZWQuIElmIGRlbHRhIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgcmVzb3VyY2VzCi0JICogaW4gdGhlIGRlbHRhIHdpbGwgdmFsaWRhdGUgdGhvc2UgcmVzb3VyY2VzLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLAotCSAqIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwgdmFsaWRhdG9ycyB3aWxsCi0JICogcnVuIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBydWxlR3JvdXAsIHNob3VsZEZvcmNlKGRlbHRhKSwgYXN5bmMpOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXNldEVuYWJsZWRWYWxpZGF0b3JzKEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKHRydWUpKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJFbmFibGVkSW5jcmVtZW50YWxWQWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0PCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICI+LCBJUmVzb3VyY2VEZWx0YSwgaW50LCBib29sZWFuKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0RGVsdGEoZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QsIGJlIG9wZW4sIGFuZCBjb250YWluIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGluIGNoYW5nZWRSZXNvdXJjZXMuIElmIHNvbWUKLQkgKiBvZiB0aGUgcmVzb3VyY2VzIGluIGNoYW5nZWRSZXNvdXJjZXMgYmVsb25nIHRvIGRpZmZlcmVudCBwcm9qZWN0cywgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogSWYgY2hhbmdlZFJlc291cmNlcyBpcyBudWxsLCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCB1c2luZyBvbmx5IHRoZSBpbmNyZW1lbnRhbAotCSAqIHZhbGlkYXRvcnMgaXMgcGVyZm9ybWVkLiBJZiBjaGFuZ2VkUmVzb3VyY2VzIGlzIG5vdCBudWxsLCBhbGwgZW5hYmxlZCBpbmNyZW1lbnRhbCB2YWxpZGF0b3JzCi0JICogdGhhdCB2YWxpZGF0ZSByZXNvdXJjZXMgaW4gdGhlIGNoYW5nZWRSZXNvdXJjZXMgYXJyYXkgd2lsbCB2YWxpZGF0ZSB0aG9zZSByZXNvdXJjZXMuCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsCi0JICogYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbCB2YWxpZGF0b3JzIHdpbGwKLQkgKiBydW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsSVdvcmtiZW5jaENvbnRleHQgYVdvcmtiZW5jaENvbnRleHQsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgc2hvdWxkRm9yY2UoY2hhbmdlZFJlc291cmNlcyksIGFzeW5jKTsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyh0cnVlKSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUmVzb3VyY2VbXSwgSVByb2plY3Q8IiArIHByb2plY3QuZ2V0TmFtZSgpICsgIj4sIGJvb2xlYW4pIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vY29uc3RydWN0IGFuIGFycmF5IG9mIElGaWxlRGVsdGFbXSB0byB3cmFwIHRoZSBPYmplY3RbXTsgb25lIElGaWxlRGVsdGEgZm9yIGVhY2ggT2JqZWN0IGluIHRoZSBhcnJheQotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkpOwotCQlzZXRDb250ZXh0KGFXb3JrYmVuY2hDb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCwgYmUgb3BlbiwgYW5kIGNvbnRhaW4gYWxsIG9mIHRoZSByZXNvdXJjZXMgaW4gY2hhbmdlZFJlc291cmNlcy4gSWYgc29tZQotCSAqIG9mIHRoZSByZXNvdXJjZXMgaW4gY2hhbmdlZFJlc291cmNlcyBiZWxvbmcgdG8gZGlmZmVyZW50IHByb2plY3RzLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBJZiBjaGFuZ2VkUmVzb3VyY2VzIGlzIG51bGwsIGEgZnVsbCB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IHVzaW5nIG9ubHkgdGhlIGluY3JlbWVudGFsCi0JICogdmFsaWRhdG9ycyBpcyBwZXJmb3JtZWQuIElmIGNoYW5nZWRSZXNvdXJjZXMgaXMgbm90IG51bGwsIGFsbCBlbmFibGVkIGluY3JlbWVudGFsIHZhbGlkYXRvcnMKLQkgKiB0aGF0IHZhbGlkYXRlIHJlc291cmNlcyBpbiB0aGUgY2hhbmdlZFJlc291cmNlcyBhcnJheSB3aWxsIHZhbGlkYXRlIHRob3NlIHJlc291cmNlcy4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwKLQkgKiBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsIHZhbGlkYXRvcnMgd2lsbAotCSAqIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyxJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIHNob3VsZEZvcmNlKGNoYW5nZWRSZXNvdXJjZXMpLCBhc3luYyk7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldChwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSkpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVJlc291cmNlW10sIElQcm9qZWN0PCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICI+LCBib29sZWFuKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvL2NvbnN0cnVjdCBhbiBhcnJheSBvZiBJRmlsZURlbHRhW10gdG8gd3JhcCB0aGUgT2JqZWN0W107IG9uZSBJRmlsZURlbHRhIGZvciBlYWNoIE9iamVjdCBpbiB0aGUgYXJyYXkKLQkJc2V0RmlsZURlbHRhcyhGaWx0ZXJVdGlsLmdldEZpbGVEZWx0YXMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDdiY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotCi0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIG9wZXJhdGlvbiBydW4gZXZlcnkgZW5hYmxlZCB2YWxpZGF0b3IgKGJvdGggZnVsbCBhbmQgaW5jcmVtZW50YWwpIG9uIHRoZQotICogcHJvamVjdC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBleHRlbmRzIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiB7Ci0JCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIERFRkFVTFRfQVNZTkMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0LCBpbnQsCi0JICogICAgICAgICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgaW50IHJ1bGVHcm91cCkgewotCQl0aGlzKHByb2plY3QsIHJ1bGVHcm91cCwgREVGQVVMVF9GT1JDRSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QsIGludCwKLQkgKiAgICAgICAgICAgICBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlKSB7Ci0JCXRoaXMocHJvamVjdCwgcnVsZUdyb3VwLCBmb3JjZSwgREVGQVVMVF9BU1lOQyk7Ci0JfQotCi0JLyoqCi0JICogUnVuIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgREVGQVVMVF9GT1JDRSwgYXN5bmMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gYWxsIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHVibGljIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElXb3JrYmVuY2hDb250ZXh0IGFXb3JrYmVuY2hDb250ZXh0LCBib29sZWFuIGFzeW5jKSB7Ci0JCXRoaXMocHJvamVjdCwgYVdvcmtiZW5jaENvbnRleHQsIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIERFRkFVTFRfRk9SQ0UsIGFzeW5jKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVuIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3Qgd2l0aCB0aGUgaWRlbnRpZmllZCBydWxlR3JvdXAuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXB1YmxpYyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJV29ya2JlbmNoQ29udGV4dCBhV29ya2JlbmNoQ29udGV4dCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIGFXb3JrYmVuY2hDb250ZXh0LCBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KSwgcnVsZUdyb3VwLCBmb3JjZSwgYXN5bmMpOwotCX0KLQkKLQotCS8qKgotCSAqIFJ1biBhbGwgZW5hYmxlZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIGlkZW50aWZpZWQgcnVsZUdyb3VwLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlIAotCSAqIGluIHRoZSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24gdGhyZWFkLCBpZiBhc3luYyBpcyBmYWxzZSwgaXQgd291bGQgcnVuIGluIHRoZSBtYWluIHRocmVhZC4gCi0JICogQWxsIHZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIElWYWxpZGF0b3IgaW50ZXJmYWNlIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZCByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZy4KLQkgKi8KLQlwdWJsaWMgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgewotCQl0aGlzKHByb2plY3QsIFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpLCBydWxlR3JvdXAsIGZvcmNlLCBhc3luYyk7Ci0JfQotCi0JLyoqCi0JICogUnVuIHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXByb3RlY3RlZCBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBlbmFibGVkVmFsaWRhdG9ycywgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgREVGQVVMVF9GT1JDRSwgYXN5bmMpOyAKLQkJLy8gdHJ1ZSA9IGZvcmNlIHZhbGlkYXRpb24gdG8gcnVuIHdoZXRoZXIgb3Igbm90IGF1dG8tdmFsaWRhdGUgaXMgb24KLQl9Ci0JCi0JLyoqCi0JICogUnVuIHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvcnMgb24gdGhlIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXByb3RlY3RlZCBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LElXb3JrYmVuY2hDb250ZXh0IGFXb3JrYmVuY2hDb250ZXh0LCBTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LGFXb3JrYmVuY2hDb250ZXh0LCBlbmFibGVkVmFsaWRhdG9ycywgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgREVGQVVMVF9GT1JDRSwgYXN5bmMpOyAKLQkJLy8gdHJ1ZSA9IGZvcmNlIHZhbGlkYXRpb24gdG8gcnVuIHdoZXRoZXIgb3Igbm90IGF1dG8tdmFsaWRhdGUgaXMgb24KLQl9Ci0KLQkvKioKLQkgKiBSdW4gdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9ycyBvbiB0aGUgcHJvamVjdCB3aXRoIHRoZSBydWxlR3JvdXAuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvckpvYiBpbnRlcmZhY2UgCi0JICogaW4gdGhlIGJhY2tncm91bmQgdmFsaWRhdGlvbiB0aHJlYWQsIGlmIGFzeW5jIGlzIGZhbHNlLCBpdCB3b3VsZCBydW4gaW4gdGhlIG1haW4gdGhyZWFkLiAKLQkgKiBBbGwgdmFsaWRhdG9ycyBpbXBsZW1lbnRpbmcgSVZhbGlkYXRvciBpbnRlcmZhY2Ugd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBmbGFnLgotCSAqLwotCXByb3RlY3RlZCBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgZm9yY2UsIHJ1bGVHcm91cCwgYXN5bmMpOwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkVmFsaWRhdG9ycyk7Ci0JfQotCQotCS8qKgotCSAqIFJ1biB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3JzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIHJ1bGVHcm91cC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9ySm9iIGludGVyZmFjZSAKLQkgKiBpbiB0aGUgYmFja2dyb3VuZCB2YWxpZGF0aW9uIHRocmVhZCwgaWYgYXN5bmMgaXMgZmFsc2UsIGl0IHdvdWxkIHJ1biBpbiB0aGUgbWFpbiB0aHJlYWQuIAotCSAqIEFsbCB2YWxpZGF0b3JzIGltcGxlbWVudGluZyBJVmFsaWRhdG9yIGludGVyZmFjZSB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcuCi0JICovCi0JcHJvdGVjdGVkIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElXb3JrYmVuY2hDb250ZXh0IGFXb3JrYmVuY2hDb250ZXh0LCBTZXQgZW5hYmxlZFZhbGlkYXRvcnMsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCxhV29ya2JlbmNoQ29udGV4dCxmb3JjZSwgcnVsZUdyb3VwLCBhc3luYyk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJlc291cmNlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMzRiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSVJlc291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlVXRpbCB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgT2JqZWN0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iaik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSdWxlR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JUnVsZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmFkMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lSdWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBncm91cCBvZiBydWxlcyB3aGljaCBhIHZhbGlkYXRvciBjaGVja3MuIEZvciBub3csIHRoZSBvbmx5IGdyb3VwaW5nIGlzIGJ5Ci0gKiBzcGVlZDogaWYgYSBzZXQgb2YgcnVsZXMgY2FuIGJlIGNoZWNrZWQgcXVpY2tseSwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgUEFTU19GQVNUIGdyb3VwLAotICogb3RoZXJ3aXNlLCBpdCBpcyBncm91cGVkIGluIHRoZSBQQVNTX0ZVTEwgZ3JvdXAuCi0gKiAKLSAqIEluIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBleHRlbmRlZCB0byBpbmNsdWRlIHNldmVyaXRpZXMuIFRvIGJlIGFibGUgdG8gZ3JvdXAgYnkgc2V2ZXJpdHkgaGVscHMKLSAqIHdpdGggdGhlIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbi4gQSB2YWxpZGF0b3Igc2hvdWxkIHJlcG9ydCBlcnJvcnMgZmlyc3QsIGFuZCB0aGVuIHdhcm5pbmdzLCBhbmQKLSAqIHRoZW4gaW5mb3MsIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBtZXNzYWdlIGxpbWl0IGJlaW5nIHJlYWNoZWQgYmVmb3JlIHRoZSBtb3N0IHNldmVyZSBwcm9ibGVtcyBhcmUKLSAqIHJlcG9ydGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdWxlR3JvdXAgewotCS8vIFRoZSBmb2xsb3dpbmcgZmlsdGVycyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIGdyb3VwIG9mIHZhbGlkYXRpb24gY2hlY2tzLgotCi0JLy8gcmV0cmlldmVzIHRoZSB0eXBlIG9mIHBhc3MsIGZyb20gdGhlIElWYWxpZGF0aW9uQ29udGV4dCwgd2hpY2ggdGhlIHZhbGlkYXRvciBzaG91bGQgZXhlY3V0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NfTEVWRUwgPSAiUEFTU19MRVZFTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9uIHRoZSBGQVNUX1BBU1MsIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGNoZWNrIHRoZSBydWxlcyB3aGljaCBkbyBub3QKLQkvLyB0YWtlIG11Y2ggdGltZSB0byBjaGVjaywgYW5kIGV4Y2x1ZGUgdGhlIHJ1bGVzIHdoaWNoIGFyZSB2YWxpZCBvbmx5Ci0JLy8gYmVmb3JlIHNvbWUgYWN0aW9uIChlLmcuIGV4cG9ydGluZyBvciBkZXBsb3lpbmcpLgotCS8vIAotCS8vIFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZXMgaXMgaXJyZWxldmFudC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTX0ZBU1QgPSAweDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19GQVNUX05BTUUgPSAiZmFzdCI7IC8vJE5PTi1OTFMtMSQgLy8gSW4gcGx1Z2luLnhtbCwgaWRlbnRpZnkgdGhpcyBwYXNzIGJ5IHRoaXMgY29uc3RhbnQKLQotCS8vIE9uIHRoZSBGVUxMX1BBU1MsIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGNoZWNrIGV2ZXJ5dGhpbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU19GVUxMID0gMHgyIHwgUEFTU19GQVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NfRlVMTF9OQU1FID0gImZ1bGwiOyAvLyROT04tTkxTLTEkIC8vIEluIHBsdWdpbi54bWwsIGlkZW50aWZ5IHRoaXMgcGFzcyBieSB0aGlzIGNvbnN0YW50Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JV29ya2JlbmNoQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lXb3JrYmVuY2hDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjQyODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lXb3JrYmVuY2hDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogSW4gdGhlIGVjbGlwc2UgZW52aXJvbm1lbnQsIG5vdCBvbmx5IGRvZXMgdGhlIElWYWxpZGF0aW9uQ29udGV4dCBuZWVkIHRvIGJlIGFibGUgdG8gbG9hZCB0aGUgTU9GIG1vZGVsLCBpdAotICogYWxzbyBuZWVkcyB0byBsb2FkIGl0ZW1zIGZyb20gdGhlIGVjbGlwc2Ugd29ya2JlbmNoLiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgZXh0ZW5kZWQgYnkKLSAqIHdvcmtiZW5jaCBJSGVscGVycywgc28gdGhhdCBpdGVtcyBjYW4gYmUgYWRkZWQgdG8sIGFuZCBmcm9tLCB0aGUgdGFzayBsaXN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXb3JrYmVuY2hDb250ZXh0IGV4dGVuZHMgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCB7Ci0JLyoqCi0JICogV2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgc28gdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQgY2FuCi0JICogY2xlYW4gdXAgYW55IHJlc291cmNlcyBpdCBhbGxvY2F0ZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIElmIHRoZSBjbGVhbnVwIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgc3VidGFzayBtZXNzYWdlcyBzaG91bGQgYmUgc2VudCB0byB0aGUgSVJlcG9ydGVyLgotCSAqLwotCXZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcik7Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBjbG9zaW5nLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlIHRob3NlCi0JICogcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYQotCSAqIG5vLW9wLgotCSAqLwotCXZvaWQgY2xvc2luZygpOwotCi0JLyoqCi0JICogV2hlbiB0aGUgSVByb2plY3QgaXMgYmVpbmcgZGVsZXRlZCwgcGVyZm9ybSBhbnkgY2xlYW51cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuIFdoZW4gdGhpcwotCSAqIG1ldGhvZCBpcyBjYWxsZWQsIGlmIHRoZSBoZWxwZXIgaGFzIGNhY2hlZCBhbnkgcmVzb3VyY2VzIGZyb20gdGhlIElQcm9qZWN0LCBpdCBzaG91bGQgcmVsZWFzZQotCSAqIHRob3NlIHJlc291cmNlcy4gSWYgeW91IGRvIG5vdCBhbGxvY2F0ZSByZXNvdXJjZXMgaW4geW91ciBoZWxwZXIsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0JICogYSBuby1vcC4KLQkgKi8KLQl2b2lkIGRlbGV0aW5nKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBPYmplY3QsIGlmIHRoZSBvYmplY3QgaGFzIGEgY29ycmVzcG9uZGluZyBJRmlsZSBpbiB0aGUgd29ya2JlbmNoLCByZXR1cm4gdGhlIElGaWxlLgotCSAqIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlci4gSW4gZWNsaXBzZSwgaW4gb3JkZXIgdG8gYWRkIG9yIHJlbW92ZSBhIHRhc2sKLQkgKiBsaXN0IGVudHJ5LCB0aGUgSVJlc291cmNlLCB0byB3aGljaCB0aGUgZW50cnkgYXBwbGllcywgbXVzdCBiZSBpZGVudGlmaWVkLiBUaGUgSVJlcG9ydGVyCi0JICogaW50ZXJmYWNlIHBhc3NlcyBpbiBhbiBPYmplY3QgaW4gdGhlc2UgbWV0aG9kczoKLQkgKiAKLQkgKiBhZGRWYWxpZGF0aW9uTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkgLy8gT2JqZWN0IGlzIGEgcGFydCBvZiBJTWVzc2FnZQotCSAqIAotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCksCi0JICogCi0JICogVGh1cywgdGhlIFdvcmtiZW5jaFJlcG9ydGVyIG5lZWRzIHRvIGtub3cgaG93LCBnaXZlbiB0aGUgT2JqZWN0LCB3aGljaCBJRmlsZSB0aGF0IHRoZSBPYmplY3QKLQkgKiByZXByZXNlbnRzIGluIHRoZSB3b3JrYmVuY2gsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gYWRkIHRoZSB0YXNrIGxpc3QgZW50cnkuCi0JICogCi0JICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLCB0aGVuIHRoZSBXb3JrYmVuY2hSZXBvcnRlciB3aWxsIGFkZCB0aGUgbWVzc2FnZSB0byB0aGUgSVByb2plY3QKLQkgKiBpbnN0ZWFkIG9mIGFuIElGaWxlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEltcGxlbWVudCBnZXRSZXNvdXJjZShPYmplY3QpIGluc3RlYWQuCi0JICovCi0JSUZpbGUgZ2V0RmlsZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIE9iamVjdCwgaWYgdGhlIG9iamVjdCBoYXMgYSBjb3JyZXNwb25kaW5nIElSZXNvdXJjZSBpbiB0aGUgd29ya2JlbmNoLCByZXR1cm4gdGhlCi0JICogSVJlc291cmNlZS4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLiBJbiBlY2xpcHNlLCBpbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgdGFzawotCSAqIGxpc3QgZW50cnksIHRoZSBJUmVzb3VyY2UsIHRvIHdoaWNoIHRoZSBlbnRyeSBhcHBsaWVzLCBtdXN0IGJlIGlkZW50aWZpZWQuIFRoZSBJUmVwb3J0ZXIKLQkgKiBpbnRlcmZhY2UgcGFzc2VzIGluIGFuIE9iamVjdCBpbiB0aGVzZSBtZXRob2RzOgotCSAqIAotCSAqIGFkZFZhbGlkYXRpb25NZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSAvLyBPYmplY3QgaXMgYSBwYXJ0IG9mIElNZXNzYWdlCi0JICogCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSwKLQkgKiAKLQkgKiBUaHVzLCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgbmVlZHMgdG8ga25vdyBob3csIGdpdmVuIHRoZSBPYmplY3QsIHdoaWNoIElGaWxlIHRoYXQgdGhlIE9iamVjdAotCSAqIHJlcHJlc2VudHMgaW4gdGhlIHdvcmtiZW5jaCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHRhc2sgbGlzdCBlbnRyeS4KLQkgKiAKLQkgKiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwsIHRoZW4gdGhlIFdvcmtiZW5jaFJlcG9ydGVyIHdpbGwgYWRkIHRoZSBtZXNzYWdlIHRvIHRoZSBJUHJvamVjdAotCSAqIGluc3RlYWQgb2YgYW4gSVJlc291cmNlLgotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCwgcmV0dXJuIHRoZSBsaW5lIG51bWJlciwgb2YgdGhlIElGaWxlLCB3aGljaCB0aGUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlcHJlc2VudHMsIGlmIHBvc3NpYmxlLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIG9yIGlmIGFjY2VzcyB0byBsaW5lIG51bWJlcnMgaXMgbm90Ci0JICogcG9zc2libGUsIHJldHVybiBhIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZXRoZXIgb3Igbm90IHRoZSBJUmVzb3VyY2UgaXMgYW4gSUZpbGUsIElGb2xkZXIsIG9yIElQcm9qZWN0LgotCSAqIExpbmUgbnVtYmVycyBhcmUgdmFsaWQgb25seSBmb3IgSUZpbGUgdHlwZXM7IGlmIHRoZSByZXNvdXJjZSBpcyBub3QgYW4gSUZpbGUsIHRoZW4gYSB0ZXh0Ci0JICogZGVzY3JpcHRpb24gb2YgdGhlIGxvY2F0aW9uIG11c3QgYmUgcmV0dXJuZWQuCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSwgd2l0aG91dCB0aGUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpbiBmcm9udC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFZhbGlkYXRpb25PcGVyYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBub24tZW52aXJvbm1lbnQgc3BlY2lmaWMgbmFtZXMgb2YKLQkgKiB0aGUgZmlsZXMuIE9ubHkgdGhlIElXb3JrYmVuY2hDb250ZXh0IGltcGxlbWVudGF0aW9uIGtub3dzIGhvdyBtdWNoIGluZm9ybWF0aW9uIHRvIHN0cmlwIG9mZgotCSAqIG9mIHRoZSBJUmVzb3VyY2UgbmFtZS4gRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGFuIEVKQiBQcm9qZWN0IG5hbWVkICJNeUVKQlByb2plY3QiLCBhbmQgaXQKLQkgKiB1c2VzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciB0aGUgc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycywgInNvdXJjZSIgYW5kICJlamJNb2R1bGUiLAotCSAqIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBFSkIgSGVscGVyIGtub3dzIGhvdyBtdWNoIG9mIHRoYXQgc3RydWN0dXJlCi0JICogaXMgZWNsaXBzZS1zcGVjaWZpYy4KLQkgKiAKLQkgKiBTaW5jZSB0aGUgInNvdXJjZSIgZm9sZGVyIGNvbnRhaW5zIEphdmEgc291cmNlIGZpbGVzLCBhIHBvcnRhYmxlIG5hbWUgd291bGQgYmUgdGhlCi0JICogZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIHdpdGhvdXQgdGhlIGVjbGlwc2Utc3BlY2lmaWMgcHJvamVjdCBhbmQgZm9sZGVyIG5hbWVzCi0JICogaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZS4gVGhlIEVKQkhlbHBlciBrbm93cyB0aGF0IGV2ZXJ5dGhpbmcgdXAgdG8gdGhlICJzb3VyY2UiIGZvbGRlciwgZm9yCi0JICogZXhhbXBsZSwgY2FuIGJlIHJlbW92ZWQsIGJlY2F1c2UsIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgRUpCIFByb2plY3QsIGV2ZXJ5dGhpbmcKLQkgKiBjb250YWluZWQgaW4gdGhlIHNvdXJjZSBmb2xkZXIgaXMgamF2YSBzb3VyY2UgY29kZS4gU28gaWYgdGhlcmUgaXMgYW4gSVJlc291cmNlIGluIGFuIEVKQgotCSAqIFByb2plY3QgbmFtZWQgIi9NeUVKQlByb2plY3Qvc291cmNlL2NvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIsIHRoaXMgbWV0aG9kIHdvdWxkCi0JICogbWFrZSB0aGlzIG5hbWUgcG9ydGFibGUgYnkgc3RyaXBwaW5nIG9mZiB0aGUgIi9NeUVKQlByb2plY3Qvc291cmNlIiwgYW5kIHJldHVybmluZwotCSAqICJjb20vaWJtL215Y2xhc3Nlcy9NeUphdmFGaWxlLmphdmEiLgotCSAqIAotCSAqIFRoZSBvdXRwdXQgb2YgdGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbiwgd2hlbiBpdCBpcyBjYWxjdWxhdGluZyB0aGUgbGlzdAotCSAqIG9mIGFkZGVkL2NoYW5nZWQvZGVsZXRlZCBmaWxlIG5hbWVzIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiBJZiBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlKQotCSAqIHJldHVybnMgbnVsbCwgdGhhdCBtZWFucyB0aGF0IHRoZSBJV29ya2JlbmNoQ29udGV4dCdzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhhdAotCSAqIHBhcnRpY3VsYXIgdHlwZSBvZiByZXNvdXJjZSwgYW5kIHRoZSByZXNvdXJjZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhcnJheSBvZgotCSAqIElGaWxlRGVsdGEgb2JqZWN0cyBpbiB0aGUgSVZhbGlkYXRvcidzICJ2YWxpZGF0ZSIgbWV0aG9kLgotCSAqLwotCVN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8gYmUgdmFsaWRhdGVkLiBFYWNoIElXb3JrYmVuY2hDb250ZXh0IGtub3dzIGhvdyB0bwotCSAqIHRyYXZlcnNlIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0LCBmb3IgZXhhbXBsZSwgYW4gRUpCIHByb2plY3Qgb3IgYSB3ZWIgcHJvamVjdC4KLQkgKi8KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwgdGhlIFdvcmtiZW5jaFJlcG9ydGVyCi0JICogZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJUmVzb3VyY2UuIFNvbWV0aW1lcyBtb3JlIHRoYW4gb25lIHRhcmdldAotCSAqIG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZSBJUmVzb3VyY2UgKHVzdWFsbHkgdGhlIElQcm9qZWN0LCB3aGljaCBpcyB0aGUgZGVmYXVsdCBJUmVzb3VyY2UKLQkgKiB3aGVuIGFuIElGaWxlIGNhbm5vdCBiZSBmb3VuZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYnkgdGhlIFdvcmtiZW5jaFJlcG9ydGVyLCBzbyB0aGF0IHRoZQotCSAqIFdvcmtiZW5jaFJlcG9ydGVyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBJTWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSBzYW1lIElSZXNvdXJjZSwgYnV0Ci0JICogcmVmZXIgdG8gZGlmZmVyZW50IHRhcmdldCBvYmplY3RzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsCi0JICogT2JqZWN0KSBtZXRob2QsIHNvIHRoYXQgd2hlbiBvbmUgdGFyZ2V0IG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndAotCSAqIHJlbW92ZSBhbm90aGVyIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbiBpZCB3aGljaCBjYW4gdW5pcXVlbHkKLQkgKiBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuIFRoZSBpZCBuZWVkcyB0byBiZSB1bmlxdWUgb25seSB3aXRoaW4gb25lCi0JICogcGFydGljdWxhciBJVmFsaWRhdG9yLgotCSAqLwotCVN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogV2hldGhlciBmdWxsIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgcnVubmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGJ5IHRoZQotCSAqIFZhbGlkYXRpb24gRnJhbWV3b3JrLCBmb3IgZXZlcnkgSVJlc291cmNlIHdoaWNoIGlzIGZpbHRlcmVkIGluIGJ5IHRoZSBJVmFsaWRhdG9yLCBzbyB0aGF0IHRoZQotCSAqIElWYWxpZGF0aW9uQ29udGV4dCBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCBvbmUgb2YgdGhlIHJlc291cmNlcywgd2hpY2ggdmFsaWRhdGlvbiB3aWxsIHJ1biBvbiwgaXMKLQkgKiBiZWluZyBmaWx0ZXJlZCBpbi4KLQkgKi8KLQl2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmssIHRvIGluaXRpYWxpemUgdGhlIElXb3JrYmVuY2hDb250ZXh0IHNvIHRoYXQKLQkgKiBpdCBjYW4gZ2F0aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdC4KLQkgKi8KLQl2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIElXb3JrYmVuY2hDb250ZXh0IHRoYXQgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrIGlzIHNodXR0aW5nIGRvd24uIFRoZXJlIHdpbGwgYmUKLQkgKiBjYWxscyB0byBjbG9zaW5nKElQcm9qZWN0KSBhbmQgcG9zc2libHkgZGVsZXRpbmcoSVByb2plY3QpIGZvbGxvd2luZyB0aGlzIGNhbGwsIGJ1dCB0aGUKLQkgKiByZXNvdXJjZXMgbWF5IGFscmVhZHkgYmUgY2xvc2VkIGJ5IHRoZSB0aW1lIHRoYXQgdGhvc2UgbWV0aG9kcyBhcmUgY2FsbGVkLCBzbyBFVkVSWVRISU5HCi0JICogc2hvdWxkIGJlIGNsZWFuZWQgdXAgaW4gdGhpcyBtZXRob2QuIFRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIHRoZSBwcm9qZWN0IHdoaWNoIGlzIGFib3V0IHRvCi0JICogc2h1dCBkb3duLiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBldmVyeSBJUHJvamVjdCBpbiB0aGUgd29ya2JlbmNoLiBUaGUgSVByb2plY3QKLQkgKiBtYXksIG9yIG1heSBub3QsIGJlIGNsb3NlZC4KLQkgKi8KLQl2b2lkIHNodXRkb3duKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMzA1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHZhbGlkYXRvcnMgd2hpY2ggcnVuIG9ubHkgaW4gVUkgYW5kIHdob3NlIG1lc3NhZ2VzLCBiZWNhdXNlIHRoZXkKLSAqIGNvbWUgZnJvbSBhbm90aGVyIHRvb2wsIGFyZSBhbHJlYWR5IGxvY2FsaXplZC4gTG9jYWxpemVkTWVzc2FnZSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgdmFsaWRhdG9yCi0gKiB3aGljaCBuZWVkcyB0byBydW4gaW4gYm90aCBXZWJTcGhlcmUgYW5kIFdTQUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2U7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTWFudWFsSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDVmMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRmlsdGVyVXRpbDsKLQotCi0vKioKLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gZXh0ZW5kcyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBNYW51YWxJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlciggcHJvamVjdCApOwotCX0JCi0JcHVibGljIE1hbnVhbEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXN1cGVyKCBwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzICk7Ci0JCXNldEZpbGVEZWx0YXMoIEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkgKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjJjZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01hbnVhbFZhbGlkYXRvcnNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotCi0KLS8qKgotICogSW1wbGVtZW50ZWQgVmFsaWRhdG9ycyBtdXN0IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW55b25lIG90aGVyIHRoYW4gaW5zdGFuY2VzIG9mCi0gKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWNhdXNlIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHZhbGlkYXRvciwgYW5kIGhhbmRsaW5nIG9mIGVycm9yCi0gKiBjb25kaXRpb25zLCBpcyBkb25lIGluIHRoZSBvcGVyYXRpb24uIFRoZSBpbml0aWFsaXphdGlvbiBpcyBzZXBhcmF0ZWQgYmVjYXVzZSBzb21lIG9mIHRoZQotICogaW5mb3JtYXRpb24gbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHZhbGlkYXRvciAoaS5lLiwgdGhlIHByb2plY3QpIGlzbid0IGtub3duIHVudGlsIHJ1bnRpbWUuCi0gKiAKLSAqIEluc3RhbmNlcyBvZiB0aGlzIG9wZXJhdGlvbiBydW4gZXZlcnkgZW5hYmxlZCB2YWxpZGF0b3IgKGJvdGggZnVsbCBhbmQgaW5jcmVtZW50YWwpIG9uIHRoZQotICogcHJvamVjdC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uIGV4dGVuZHMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCwgREVGQVVMVF9GT1JDRSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgdHJ1ZSk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldE1hbnVhbEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpKTsKLQl9CQotCXB1YmxpYyBNYW51YWxWYWxpZGF0b3JzT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIE9iamVjdFtdIGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJc3VwZXIocHJvamVjdCwgc2hvdWxkRm9yY2UoY2hhbmdlZFJlc291cmNlcyksIFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQsIHRydWUpOwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNYW51YWxFbmFibGVkVmFsaWRhdG9ycyhwcm9qZWN0KSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9NZXNzYWdlSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01lc3NhZ2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTlmY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL01lc3NhZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlSW5mbyB7Ci0KLQlwcml2YXRlIFN0cmluZwkJbWVzc2FnZU93bmVySWQ7CQotCXByaXZhdGUgSVJlc291cmNlCXJlc291cmNlOwotCXByaXZhdGUgU3RyaW5nCQlsb2NhdGlvbjsJCi0JcHJpdmF0ZSBTdHJpbmcJCXRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcJCXRhcmdldE9iamVjdE5hbWU7CQotCXByaXZhdGUgU3RyaW5nCQltYXJrZXJJZDsJCi0JcHJpdmF0ZSBJTWVzc2FnZQltc2c7Ci0KLQkJCQkKLQkKLQlwdWJsaWMgTWVzc2FnZUluZm8oKXsKLQkJCi0JfQotCQotCXB1YmxpYyBNZXNzYWdlSW5mbyhTdHJpbmcgbWVzc2FnZU93bmVySWQsCi0JCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCQlTdHJpbmcgbG9jYXRpb24sIAotCQkJCQkJU3RyaW5nIHRleHQsCi0JCQkJCQlTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwKLQkJCQkJCVN0cmluZyBtYXJrZXJJZCwKLQkJCQkJCUlNZXNzYWdlIG1zZyl7Ci0JCQotCQl0aGlzLm1lc3NhZ2VPd25lcklkID0gbWVzc2FnZU93bmVySWQ7CQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsJCi0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JCXRoaXMudGFyZ2V0T2JqZWN0TmFtZSA9IHRhcmdldE9iamVjdE5hbWU7CQotCQl0aGlzLm1hcmtlcklkID0gbWFya2VySWQ7CQotCQl0aGlzLm1zZyA9IG1zZzsKLQl9CQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJJZCgpIHsKLQkJcmV0dXJuIG1hcmtlcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcmtlcklkKFN0cmluZyBtYXJrZXJJZCkgewotCQl0aGlzLm1hcmtlcklkID0gbWFya2VySWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlT3duZXJJZCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VPd25lcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPd25lcklkKFN0cmluZyBtZXNzYWdlT3duZXJJZCkgewotCQl0aGlzLm1lc3NhZ2VPd25lcklkID0gbWVzc2FnZU93bmVySWQ7Ci0JfQotCi0JcHVibGljIElNZXNzYWdlIGdldE1zZygpIHsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNc2coSU1lc3NhZ2UgbXNnKSB7Ci0JCXRoaXMubXNnID0gbXNnOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRhcmdldE9iamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0T2JqZWN0TmFtZShTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSkgewotCQl0aGlzLnRhcmdldE9iamVjdE5hbWUgPSB0YXJnZXRPYmplY3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9PbmVWYWxpZGF0b3JPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9PbmVWYWxpZGF0b3JPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExZWMxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvT25lVmFsaWRhdG9yT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWdpc3RyeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBWYWxpZGF0b3JzIG11c3Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbnlvbmUgb3RoZXIgdGhhbiBpbnN0YW5jZXMgb2YKLSAqIFZhbGlkYXRpb25PcGVyYXRpb24sIGJlY2F1c2Ugc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdmFsaWRhdG9yLCBhbmQgaGFuZGxpbmcgb2YgZXJyb3IKLSAqIGNvbmRpdGlvbnMsIGlzIGRvbmUgaW4gdGhlIG9wZXJhdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIGlzIHNlcGFyYXRlZCBiZWNhdXNlIHNvbWUgb2YgdGhlCi0gKiBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsaWRhdG9yIChpLmUuLCB0aGUgcHJvamVjdCkgaXNuJ3Qga25vd24gdW50aWwgcnVudGltZS4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gcnVucyBhIHNpbmdsZSB2YWxpZGF0b3Igb24gYSBwcm9qZWN0LgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE9uZVZhbGlkYXRvck9wZXJhdGlvbiBleHRlbmRzIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiB7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgT25lVmFsaWRhdG9yT3BlcmF0aW9uKHByb2plY3QsIHZhbGlkYXRvcklkLAotCSAqICAgICAgICAgICAgIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3QsIHZhbGlkYXRvcklkLCBERUZBVUxUX0ZPUkNFLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBPbmVWYWxpZGF0b3JPcGVyYXRpb24ocHJvamVjdCwgdmFsaWRhdG9ySWQsCi0JICogICAgICAgICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgT25lVmFsaWRhdG9yT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWxpZGF0b3JJZCwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdCwgdmFsaWRhdG9ySWQsIGZvcmNlLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBPbmVWYWxpZGF0b3JPcGVyYXRpb24oSVByb2plY3QsIFN0cmluZywKLQkgKiAgICAgICAgICAgICBib29sZWFuLCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQsIGJvb2xlYW4gZm9yY2UsIGludCBydWxlR3JvdXApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3QsIHZhbGlkYXRvcklkLCBmb3JjZSwgcnVsZUdyb3VwLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsaWRhdG9ySWQKLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gaWQgb2YgdGhlIHZhbGlkYXRvciB3aGljaCB5b3Ugd2lzaCB0byBydW4uCi0JICogQHBhcmFtIGZvcmNlCi0JICogICAgICAgICAgICBJZiB0aGUgdmFsdWUgaXMgInRydWUiLCB0aGUgdmFsaWRhdG9yIHNob3VsZCBiZSBydW4gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZQotCSAqICAgICAgICAgICAgZW52aXJvbm1lbnQgc2V0dGluZ3MgYXJlOyBpZiB0aGUgdmFsdWUgaXMgImZhbHNlIiwgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHJ1bgotCSAqICAgICAgICAgICAgb25seSBpZiB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIHdpbGwgbm90IHJ1biB0aGUgdmFsaWRhdG9yLgotCSAqIAotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgbmFtZWQgdmFsaWRhdG9yIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoZQotCSAqIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3QsIHZhbGlkYXRvcklkLCBmb3JjZSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIE9uZVZhbGlkYXRvck9wZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAotCSAqIEBwYXJhbSB2YWxpZGF0b3JJZAotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBpZCBvZiB0aGUgdmFsaWRhdG9yIHdoaWNoIHlvdSB3aXNoIHRvIHJ1bi4KLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBpcyAidHJ1ZSIsIHRoZSB2YWxpZGF0b3Igc2hvdWxkIGJlIHJ1biByZWdhcmRsZXNzIG9mIHdoYXQgdGhlCi0JICogICAgICAgICAgICBlbnZpcm9ubWVudCBzZXR0aW5ncyBhcmU7IGlmIHRoZSB2YWx1ZSBpcyAiZmFsc2UiLCB0aGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcnVuCi0JICogICAgICAgICAgICBvbmx5IGlmIHRoZSB2YWxpZGF0aW9uIGJ1aWxkZXIgd2lsbCBub3QgcnVuIHRoZSB2YWxpZGF0b3IuCi0JICogQHBhcmFtIHJ1bGVHcm91cAotCSAqICAgICAgICAgICAgV2hldGhlciBhIEZVTEwgb3IgRkFTVCBwYXNzIHNob3VsZCBiZSBpbnZva2VkLgotCSAqIAotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgbmFtZWQgdmFsaWRhdG9yIGlzIG5vdCBjb25maWd1cmVkIG9uIHRoZQotCSAqIHByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIE9uZVZhbGlkYXRvck9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9ySWQsIGJvb2xlYW4gZm9yY2UsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gYXN5bmMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0LCBmb3JjZSwgcnVsZUdyb3VwLCBhc3luYyk7Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkvLyBObyB2YWxpZGF0b3IsIHdpdGggdGhhdCBwbHVnaW4gaWQsIGNhbiBiZSBydW4gb24gdGhhdCBwcm9qZWN0LgotCQkJLy8gRWl0aGVyIHRoZSB2YWxpZGF0b3IgaXNuJ3QgaW5zdGFsbGVkLCBvciB0aGUgSVByb2plY3QgcGFzc2VkIGluCi0JCQkvLyBkb2Vzbid0IGhhdmUgdGhlIG5lY2Vzc2FyeSBuYXR1cmUuCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHZhbGlkYXRvcklkKTsKLQkJfQotCi0JCWlmICghdm1kLmlzQ29uZmlndXJlZE9uUHJvamVjdChwcm9qZWN0KSkgewotCQkJLy8gTm8gdmFsaWRhdG9yLCB3aXRoIHRoYXQgcGx1Z2luIGlkLCBjYW4gYmUgcnVuIG9uIHRoYXQgcHJvamVjdC4KLQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJLy8gZG9lc24ndCBoYXZlIHRoZSBuZWNlc3NhcnkgbmF0dXJlLgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2YWxpZGF0b3JJZCk7Ci0JCX0KLQotCQlTZXQgZW5hYmxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWVuYWJsZWQuYWRkKHZtZCk7Ci0JCXNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNWY5NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlZmVyZW5jaWFsRmlsZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAzLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgewotCQotCS8qKgotCSAqIEFuc3dlciB0aGUgcmVmZXJlbmNlZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRGaWxlcwotCSAqIEByZXR1cm4gYSBsaXN0IG9mIElGaWxlJ3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlZEZpbGUoTGlzdCBpbnB1dEZpbGVzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwNmZmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckhlbHBlciB7Ci0JcHVibGljIFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWxlcyBjb250YWluZWQgaW4gcHJvamVjdCB0byBpbmZpbml0ZSBkZXB0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQcm9qZWN0RmlsZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBjb2xsZWN0RmlsZXMocHJvamVjdC5tZW1iZXJzKCksIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgY29sbGVjdEZpbGVzKElSZXNvdXJjZVtdIG1lbWJlcnMsIExpc3QgcmVzdWx0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHJlY3Vyc2l2ZWx5IGNvbGxlY3QgZmlsZXMgZm9yIHRoZSBnaXZlbiBtZW1iZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlcyA9IG1lbWJlcnNbaV07Ci0JCQlpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCWNvbGxlY3RGaWxlcygoKElGb2xkZXIpIHJlcykubWVtYmVycygpLCByZXN1bHQpOwotCQkJfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJlc3VsdC5hZGQocmVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NDJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4gVGhpcyBjbGFzcyByZXRyaWV2ZXMgdGhlIFN0cmluZ3MgZnJvbSB0aGUKLSAqICAgICAgICAgICAgIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBtYWNoaW5lJ3MgTG9jYWxlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyIHsKLQkvL0RlZmF1bHQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9UYXNrTGlzdEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Rhc2tMaXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzJkYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1Rhc2tMaXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci0KLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhlCi0gKiAgICAgICAgICAgICBUYXNrTGlzdEhlbHBlciBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGFza0xpc3RIZWxwZXIgX3Rhc2tMaXN0SGVscGVyID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVGFza0xpc3RIZWxwZXIgZ2V0VGFza0xpc3QoKSB7Ci0JCWlmIChfdGFza0xpc3RIZWxwZXIgPT0gbnVsbCkgewotCQkJX3Rhc2tMaXN0SGVscGVyID0gbmV3IFRhc2tMaXN0SGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF90YXNrTGlzdEhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKHBsdWdpbklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2VJZCwgbWVzc2FnZSwgbWFya2VyVHlwZSwgdGFyZ2V0T2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhpbnQgc2V2ZXJpdHksIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3Moc2V2ZXJpdHksIHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5KSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBzZXZlcml0eSk7Ci0JfQotCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZU93bmVyKSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXIpOwotCX0KLQotCXB1YmxpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycykgewotCQlyZXR1cm4gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIHJlc291cmNlIGFuZCBpdHMgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgdGFza3MgZnJvbSB0aGUgcmVzb3VyY2UuIElmIHRoZSByZXNvdXJjZSBpcyBhbiBJUHJvamVjdCwgYWxsIHRhc2tzCi0JICogYXJlIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0J3MgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVyLCBvYmplY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSBzdWJzZXQgb2YgdGFza3MgZnJvbSB0aGUgcHJvamVjdCwgaW5jbHVkaW5nIGNoaWxkIHRhc2tzLiBFdmVyeSB0YXNrCi0JICogd2hpY2ggYmVsb25ncyB0byB0aGUgZ3JvdXAsIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLCB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFza1N1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIGFsbCB2YWxpZGF0b3IgbWFya2VycyB3aGljaCBhcmUgb3duZWQgYnkgImZyb20iIHRvIG1ha2UgdGhlaXIgb3duZXIgInRvIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVPd25lcihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS51cGRhdGVPd25lcihmcm9tLCB0byk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyBhbGwgdmFsaWRhdG9yIG1hcmtlcnMgb24gdGhlIElSZXNvdXJjZSBhbmQgaXRzIGNoaWxkcmVuLiBBbGwgbWFya2VycwotCSAqIG93bmVkIGJ5ICJmcm9tIiBoYXZlIHRoZWlyIG93bmVyIHJlYXNzaWduZWQgdG8gInRvIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVPd25lcihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnVwZGF0ZU93bmVyKGZyb20sIHRvLCByZXNvdXJjZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uQnVpbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjM5NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRpbWVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBWYWxpZGF0aW9uIEZyYW1ld29yayBCdWlsZGVyLgotICogCi0gKiBUaGlzIGJ1aWxkZXIgaXMgY29uZmlndXJlZCBvbiBKMkVFIElQcm9qZWN0cyBhdXRvbWF0aWNhbGx5LCBjYW4gYmUgYWRkZWQgdG8gb3RoZXIgdHlwZXMgb2YKLSAqIHByb2plY3RzIHRocm91Z2ggdGhlIFByb3BlcnRpZXMgcGFnZSwgYW5kIGxhdW5jaGVzIHZhbGlkYXRpb24gb24gdGhlIHByb2plY3QgaWYgdGhlIHByb2plY3QgaGFzCi0gKiBidWlsZCB2YWxpZGF0aW9uIGVuYWJsZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0RFTFRBX0NIQU5HRSA9IC0xOwotCXByb3RlY3RlZCBMaXN0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaENvbnRleHQgd29ya2JlbmNoQ29udGV4dCA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdGlvbkJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdFtdIGdldEFsbFJlZmVyZW5jZWRQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBTZXQgdmlzaXRlZFByb2plY3RzKSB7Ci0JCWlmICh2aXNpdGVkUHJvamVjdHMgPT0gbnVsbCkKLQkJCXZpc2l0ZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWVsc2UgaWYgKHZpc2l0ZWRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSkKLQkJCXJldHVybiBnZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJZWxzZQotCQkJdmlzaXRlZFByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJaWYgKHJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJUHJvamVjdFtdIHJlZlByb2pBcnJheSA9IHByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCQkJY29sbGVjdFJlZmVyZWNlZFByb2plY3QocmVmUHJvakFycmF5KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2pBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQlJUHJvamVjdCByZWZQcm9qZWN0ID0gcmVmUHJvakFycmF5W2ldOwotCQkJCQlnZXRBbGxSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdCwgdmlzaXRlZFByb2plY3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldFdvcmtiZW5jaENvbnRleHQoKSB7Ci0JCWlmKHdvcmtiZW5jaENvbnRleHQgPT0gbnVsbCkgewotCQkJd29ya2JlbmNoQ29udGV4dCA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCQl3b3JrYmVuY2hDb250ZXh0LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gd29ya2JlbmNoQ29udGV4dDsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSByZWZlcmVuY2VkUHJvamVjdHMyCi0JICogQHBhcmFtIHJlZlByb2pBcnJheQotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0UmVmZXJlY2VkUHJvamVjdChJUHJvamVjdFtdIHJlZlByb2pBcnJheSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlByb2pBcnJheS5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlZlByb2pBcnJheVtpXTsKLQkJCWlmICghcmVmZXJlbmNlZFByb2plY3RzLmNvbnRhaW5zKHByb2plY3QpKQotCQkJCXJlZmVyZW5jZWRQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIjY2xlYW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCB8fCAhY3VycmVudFByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKGN1cnJlbnRQcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0VmFsaWRhdG9ycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdm1kc1tpXTsKLQkJCQkvLyBGb3IgdmFsaWRhdG9ycyB3aG8gYXJlbid0IGdvaW5nIHRvIHJ1biwgY2xlYXIgdGhlaXIgbWVzc2FnZXMgZnJvbSB0aGUgdGFzayBsaXN0LgotCQkJCS8vIERvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIGJlY2F1c2UgZWFjaCBWYWxpZGF0b3IgbXVzdCBiZSB1bmlxdWUuCi0JCQkJLy8gVGhlIHVuaXF1ZW5lc3Mgb2YgZWFjaCBWYWxpZGF0b3IgaXMgY2hlY2tlZCBieSB0aGUgcGx1Z2luIHJlZ2lzdHJ5LgotCQkJCVdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGN1cnJlbnRQcm9qZWN0LCB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRvck1hbmFnZXIudXBkYXRlVGFza0xpc3QoIiArIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0W10gZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlJUHJvamVjdFtdIHJlZlByb2pBcnJheSA9IG5ldyBJUHJvamVjdFtyZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZlByb2pBcnJheVtpXSA9IChJUHJvamVjdCkgcmVmZXJlbmNlZFByb2plY3RzLmdldChpKTsKLQkJfQotCQlyZXR1cm4gcmVmUHJvakFycmF5OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaW50IGV4ZWN1dGlvbk1hcCA9IDB4MDsKLQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJSVByb2plY3RbXSByZWZlcmVuY2VkID0gZ2V0QWxsUmVmZXJlbmNlZFByb2plY3RzKHByb2plY3QsIG51bGwpOwotCQl0cnkgewotCQkJaWYgKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzU3VzcGVuZGVkKHByb2plY3QpKSB7Ci0JCQkJLy8gRG8gbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiB0aGlzIHByb2plY3QKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgxOwotCQkJCXJldHVybiByZWZlcmVuY2VkOwotCQkJfQotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCWRlbHRhID0gZ2V0RGVsdGEocHJvamVjdCk7Ci0JCQlib29sZWFuIGRvRnVsbEJ1aWxkID0gKGtpbmQgPT0gRlVMTF9CVUlMRCk7Ci0vLwkJCWJvb2xlYW4gZG9BdXRvQnVpbGQgPSAoKGRlbHRhICE9IG51bGwpICYmIChraW5kID09IEFVVE9fQlVJTEQpKTsKLS8vCQkJYm9vbGVhbiBkb0luY3JlbWVudGFsQnVpbGQgPSAoKGRlbHRhICE9IG51bGwpICYmIChraW5kID09IElOQ1JFTUVOVEFMX0JVSUxEKSk7Ci0vLwkJCWlmICgoZG9GdWxsQnVpbGQgfHwgZG9JbmNyZW1lbnRhbEJ1aWxkKSAmJiAhcHJqcC5pc0J1aWxkVmFsaWRhdGUoKSkgewotLy8JCQkJLy8gSXMgYSBidWlsZCB2YWxpZGF0aW9uIGFib3V0IHRvIGJlIGludm9rZWQ/IElmIHNvLCBkb2VzIHRoZQotLy8JCQkJLy8gdXNlciB3YW50IGJ1aWxkIHZhbGlkYXRpb24gdG8gcnVuPwotLy8JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjsKLS8vCQkJCXJldHVybiByZWZlcmVuY2VkOwotLy8JCQl9Ci0JCQkvLyBJdCBpcyBwb3NzaWJsZSBmb3Iga2luZCB0byA9PSBBVVRPX0JVSUxEIHdoaWxlIGRlbHRhIGlzIG51bGwKLQkJCS8vIChzYXcgdGhpcwotCQkJLy8gd2hlbiBjcmVhdGluZyBhIHByb2plY3QgYnkgY29weWluZyBhbm90aGVyIHByb2plY3QuKQotCQkJLy8gSG93ZXZlciwgYSAiUmVidWlsZCBQcm9qZWN0IiB3aWxsIGludm9rZSB0aGlzIGJ1aWxkZXIgd2l0aAotCQkJLy8ga2luZD09RlVMTF9CVUlMRAotCQkJLy8gYW5kIGEgbnVsbCBkZWx0YSwgYW5kIHZhbGlkYXRpb24gc2hvdWxkIHJ1biBpbiB0aGF0IGNhc2UuCi0JCQlpZiAoIWRvRnVsbEJ1aWxkICYmIGRlbHRhID09IG51bGwpIHsKLQkJCQlpZiAoaXNSZWZlcmVuY2VkUHJvamVjdEluRGVsdGEocmVmZXJlbmNlZCkpIHsKLQkJCQkJcGVyZm9ybUZ1bGxCdWlsZEZvclJlZmVyZW5jZWRQcm9qZWN0Q2hhbmdlZChtb25pdG9yLCBwcmpwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmdbXSBtc2dQYXJtcyA9IG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKX07Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX05VTExfREVMVEEsIG1zZ1Bhcm1zKSk7Ci0JCQkJCS8vIEEgbnVsbCBkZWx0YSBtZWFucyB0aGF0IGEgZnVsbCBidWlsZCBtdXN0IGJlIHBlcmZvcm1lZCwKLQkJCQkJLy8gYnV0IHRoaXMgYnVpbGRlciB3YXMgaW52b2tlZCB3aXRoIGFuIGluY3JlbWVudGFsIG9yCi0JCQkJCS8vIGF1dG9tYXRpYwotCQkJCQkvLyBidWlsZCBraW5kLiBSZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZyBzbyB0aGF0IHRoZQotCQkJCQkvLyB1c2VyCi0JCQkJCS8vIGRvZXNuJ3QgaGF2ZSB0byB3YWl0IGZvcmV2ZXIuCi0JCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDQ7Ci0JCQkJfQotCQkJCXJldHVybiByZWZlcmVuY2VkOwotCQkJfQotCQkJaWYgKGRvRnVsbEJ1aWxkKSB7Ci0JCQkJcGVyZm9ybUZ1bGxCdWlsZChtb25pdG9yLCBwcmpwKTsKLQkJCX0gZWxzZSB7Ci0vLwkJCQlpZiAoZG9BdXRvQnVpbGQgJiYgIXByanAuaXNBdXRvVmFsaWRhdGUoKSkgewotLy8JCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDg7Ci0vLwkJCQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0vLwkJCQl9Ci0JCQkJaWYgKGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCkgewotCQkJCQlpZiAoaXNSZWZlcmVuY2VkUHJvamVjdEluRGVsdGEocmVmZXJlbmNlZCkpCi0JCQkJCQlwZXJmb3JtRnVsbEJ1aWxkRm9yUmVmZXJlbmNlZFByb2plY3RDaGFuZ2VkKG1vbml0b3IsIHByanApOwotCQkJCQllbHNlCi0JCQkJCQlleGVjdXRpb25NYXAgfD0gMHgxMDsKLQkJCQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JCQkJfQotCQkJCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCwgZGVsdGEsIHRydWUpOwotCQkJCW9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCWxvZ0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24obG9nZ2VyLCBleGMpOwotCQkJZXhlY3V0aW9uTWFwIHw9IDB4MjA7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJbG9nQnVpbGRFcnJvcihsb2dnZXIsIGV4Yyk7Ci0JCQlleGVjdXRpb25NYXAgfD0gMHg0MDsKLQkJCXJldHVybiByZWZlcmVuY2VkOwotCQl9IGZpbmFsbHkgewotCQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJCS8vIFRoZSBidWlsZGVyJ3MgdGltZSBuZWVkcyB0byBiZSBGSU5FIGJlY2F1c2UgdGhlIGJ1aWxkZXIgaXMKLQkJCS8vIGNhbGxlZCBvZnRlbi4KLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlsb2dCdWlsZGVyVGltZUVudHJ5KHN0YXJ0LCBleGVjdXRpb25NYXAsIGxvZ2dlciwgZGVsdGEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVmZXJlbmNlZFByb2plY3RJbkRlbHRhKElQcm9qZWN0W10gcmVmZXJlbmNlZCkgewotCQlJUHJvamVjdCBwID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VkLmxlbmd0aDsgaSsrKSB7Ci0JCQlwID0gcmVmZXJlbmNlZFtpXTsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZ2V0RGVsdGEocCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCAmJiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1GdWxsQnVpbGRGb3JSZWZlcmVuY2VkUHJvamVjdENoYW5nZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1GdWxsQnVpbGQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXBlcmZvcm1GdWxsQnVpbGQobW9uaXRvciwgcHJqcCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRnVsbEJ1aWxkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCwgYm9vbGVhbiBvbmx5RGVwZW5kZW50VmFsaWRhdG9ycykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzID0gcHJqcC5nZXRFbmFibGVkRnVsbEJ1aWxkVmFsaWRhdG9ycyh0cnVlLCBvbmx5RGVwZW5kZW50VmFsaWRhdG9ycyk7Ci0JCWlmICgoZW5hYmxlZFZhbGlkYXRvcnMgIT0gbnVsbCkgJiYgKGVuYWJsZWRWYWxpZGF0b3JzLmxlbmd0aCA+IDApKSB7Ci0JCQlTZXQgZW5hYmxlZFZhbGlkYXRvcnNTZXQgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KGVuYWJsZWRWYWxpZGF0b3JzKTsKLQkJCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZFZhbGlkYXRvcnNTZXQsIHRydWUpOwotCQkJb3AucnVuKG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oTG9nZ2VyIGxvZ2dlciwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uQnVpbGRlcjo6YnVpbGQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nQnVpbGRFcnJvcihMb2dnZXIgbG9nZ2VyLCBUaHJvd2FibGUgZXhjKSB7Ci0JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJaWYoICEgKGV4YyBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKSApewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uQnVpbGRlci5idWlsZChpbnQsIE1hcCwgSVByb2dyZXNzTW9uaXRvcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dCdWlsZGVyVGltZUVudHJ5KGxvbmcgc3RhcnQsIGludCBleGVjdXRpb25NYXAsIExvZ2dlciBsb2dnZXIsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCVRpbWVFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0VGltZUVudHJ5KCk7Ci0JCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uQnVpbGRlci5idWlsZChpbnQsIE1hcCwgSVByb2dyZXNzTW9uaXRvcikiKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRQcm9qZWN0TmFtZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQllbnRyeS5zZXRFeGVjdXRpb25NYXAoZXhlY3V0aW9uTWFwKTsKLQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCk7Ci0JCWlmIChkZWx0YSA9PSBudWxsKSB7Ci0JCQllbnRyeS5zZXREZXRhaWxzKCJkZWx0YSA9PSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbnRyeS5zZXRUb29sTmFtZSgiVmFsaWRhdGlvbkJ1aWxkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjBmYTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotICogCi0gKiBDb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIHN0cmluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbHVnaW4uCi0gKiAKLSAqIFNlZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSwgaW4gdGhlIHBsdWdpbidzIGRpcmVjdG9yeSwgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5ncy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uQ29uc3RhbnRzIGV4dGVuZHMgUmVzb3VyY2VDb25zdGFudHMgewotCS8vRGVmYXVsdAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOGExZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLklIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVByb2plY3RWYWxpZGF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZWdpc3RyeUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRpbWVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRvckxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLk1lc3NhZ2VMaW1pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBWYWxpZGF0b3JzIG1ldGhvZHMgbXVzdCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoaXMgY2xhc3MsIHNpbmNlCi0gKiBzb21lIGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgaXMgZG9uZSBoZXJlICh2aWEgdGhlIGdldFByb2plY3QoKSBtZXRob2QpLiBUaGUKLSAqIGluaXRpYWxpemF0aW9uIGlzIHNlcGFyYXRlZCBiZWNhdXNlIHRoZSBJUHJvamVjdCBpc24ndCBrbm93biB1bnRpbCBydW50aW1lLgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvdXRzaWRlIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkvLyBTaW5jZSBJUmVzb3VyY2VDb25zdGFudHMgZG9uJ3QgaGF2ZSBhICJubyBkZWx0YSIgZmxhZywgbGV0IHRoaXMgY29uc3RhbnQgYmUgdGhlIGZsYWcuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fREVMVEFfQ0hBTkdFID0gLTE7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9BU19TVFJJTkcgPSAiSUZpbGVEZWx0YVt7MH1dICd7J3sxfSd9JyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfQVNZTkMgPSB0cnVlOyAvLyBGb3IgdGhlIGRlcHJlY2F0ZWQKLQkvLyBjb25zdHJ1Y3RvcnMsIGJ5Ci0JLy8gZGVmYXVsdCB0aGUKLQkvLyBvcGVyYXRpb24gd2lsbCBub3QKLQkvLyBmb3JrLgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0ZPUkNFID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OTEFVTkNIRVJNU0cgPSAiV2FpdGluZyBmb3IgYnVpbGQiOyAKLQkKLQljbGFzcyBWYWxpZGF0aW9uTGF1bmNoZXJKb2IgZXh0ZW5kcyBKb2IgewotCSAgICBwcml2YXRlIEpvYiB2YWxpZGF0aW9uSm9iOwotCSAgICBwdWJsaWMgVmFsaWRhdGlvbkxhdW5jaGVySm9iKEpvYiB2YWxpZGF0aW9uSm9iKSB7Ci0JICAgICAgICAgICAgc3VwZXIoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoIlZCRl9WQUxJREFUSU9OX0pPQl9NU0ciKSk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgc2V0U3lzdGVtKHRydWUpOwotCSAgICAgICAgICAgIHNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uSm9iPSB2YWxpZGF0aW9uSm9iOwotCSAgICB9Ci0JICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkgICAgCQl2YWxpZGF0aW9uSm9iLnNjaGVkdWxlKCk7Ci0JICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgREVGQVVMVF9BU1lOQwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0ZPUksgPSBmYWxzZTsgLy8gQGRlcHJlY2F0ZWQKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0ID0gbnVsbDsgLy8gcHJvamVjdCB0byBiZSB2YWxpZGF0ZWQKLQlwcml2YXRlIGludCBfcnVsZUdyb3VwID0gUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVDsgLy8gd2hpY2gKLQkvLyBwYXNzCi0JLy8gc2hvdWxkCi0JLy8gdGhlCi0JLy8gdmFsaWRhdGlvbgotCS8vIGludm9rZQotCXByaXZhdGUgYm9vbGVhbiBfZm9yayA9IERFRkFVTFRfQVNZTkM7IC8vIGRvIG5vdCBmb3JrIHRoZSB2YWxpZGF0aW9uIGludG8gYQotCS8vIGRpZmZlcmVudCB0aHJlYWQgYnkgZGVmYXVsdAotCXByaXZhdGUgTWFwIF9maWxlRGVsdGFzID0gbnVsbDsgLy8gVG8gcmVkdWNlIG9iamVjdCBjcmVhdGlvbiwKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIF9kZWx0YSA9IG51bGw7Ci0JLy8gdGhlIHJlc291cmNlIGRlbHRhIHRyZWUgdG8gYmUgcHJvY2Vzc2VkLCBvciBudWxsIGlmIGEgZnVsbCBidWlsZC9tZW51Ci0JLy8gb3B0aW9uIHdhcyB0cmlnZ2VyZWQuIFRoaXMgdmFsdWUgaXMgY2FjaGVkIHNvIHRoYXQgdmFsaWRhdGlvbiBjYW4gYmUgcnVuCi0JLy8gZWl0aGVyIGZyb20gYSBidWlsZGVyLCBvciBmcm9tIGEgbWVudSBpdGVtLiAoVGhlIE9wZXJhdGlvbiBpbnRlcmZhY2UKLQkvLyBkb2Vzbid0IGFsbG93IGFueSBwYXJhbWV0ZXIgb24gZXhlY3V0ZSBleGNlcHQgdGhlIElQcm9ncmVzc01vbml0b3IuKQotCXByaXZhdGUgU2V0IF9lbmFibGVkVmFsaWRhdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIF9mb3JjZSA9IERFRkFVTFRfRk9SQ0U7IC8vIGZvcmNlIHRoaXMgb3BlcmF0aW9uIHRvIHJ1biBldmVuCi0JLy8gaWYgaXQgZG9lc24ndCBuZWVkIHRvPwotCXByaXZhdGUgYm9vbGVhbiBfaXNGdWxsVmFsaWRhdGUgPSBmYWxzZTsgLy8gUnVuIGEgZnVsbCB2YWxpZGF0aW9uIG9yIGFuCi0JLy8gaW5jcmVtZW50YWw/ICh0cnVlID0gZnVsbCkKLQlwcml2YXRlIEJvb2xlYW4gX2lzQXV0b0J1aWxkID0gbnVsbDsgLy8gSXMgdGhlIGdsb2JhbCBhdXRvLWJ1aWxkIHByZWZlcmVuY2UKLQkvLyBlbmFibGVkPwotCXByaXZhdGUgU2V0IF9sYXVuY2hlZFZhbGlkYXRvcnMgPSBudWxsOyAvLyBBIGxpc3Qgb2YgdGhlIHZhbGlkYXRvcnMgdGhhdAotCQotCXByb3RlY3RlZCBJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0OwotCi0JLy8gYXJlIGVuYWJsZWQgYW5kIHdlcmUgbGF1bmNoZWQKLQkvLyAoaS5lLiwgdGhhdCBoYXZlIGlucHV0IHRvCi0JLy8gdmFsaWRhdGUpLiBGb3IgaW50ZXJuYWwKLQkvLyB2YWxpZGF0aW9uIGZyYW1ld29yayB1c2Ugb25seTsKLQkvLyBpdCdzIG5lZWRlZCBmb3IgdGhlIGF1dG9tYXRpYwotCS8vIHRlc3RzLgotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIEZJTkVTVCBsb2dnaW5nLCB0byByZXBvcnQgZXhhY3RseSB3aGF0IGRlbHRhcyB3ZXJlIGFib3V0IHRvIGJlCi0JICogdmFsaWRhdGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWx0YUFzU3RyaW5nKElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQlTdHJpbmcgYXJncyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1BcmdzID0gMDsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCW51bUFyZ3MgPSBkZWx0YS5sZW5ndGg7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUEpOwotCQkJCWJ1ZmZlci5hcHBlbmQoZGVsdGFbaV0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlidWZmZXIucmVwbGFjZSgwLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8gbWFnaWMgbnVtYmVycyAwIGFuZCAxID0+IFJlbW92ZSBmaXJzdCBDT01NQSBmcm9tIHRoZSBsaXN0IChoZW5jZSBpbmRleCAwKTsgbGVuZ3RoIG9mIENPTU1BIGlzIDIsIGhlbmNlIGluZGV4IDAsIDEuCi0JCQlhcmdzID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERFTFRBX0FTX1NUUklORywgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKG51bUFyZ3MpLCBhcmdzfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmIChyZXBvcnRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRm9yY2UoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuICgoZGVsdGEgPT0gbnVsbCkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBzaG91bGRGb3JjZShPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXJldHVybiAoKChjaGFuZ2VkUmVzb3VyY2VzID09IG51bGwpIHx8IChjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aCA9PSAwKSkgPyBERUZBVUxUX0ZPUkNFIDogZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25PcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIERFRkFVTFRfQVNZTkMsIERFRkFVTFRfRk9SQ0UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBudWxsLCBudWxsLCBSZWdpc3RyeUNvbnN0YW50cy5BVFRfUlVMRV9HUk9VUF9ERUZBVUxULCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkLiBXaWxsIGJlIHJlbW92ZWQgaW4gTWlsZXN0b25lIDMuIFVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uKHByb2plY3QsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBpbnQgcnVsZUdyb3VwKSB7Ci0JCXRoaXMocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBERUZBVUxUX0ZPUkNFLCBERUZBVUxUX0FTWU5DKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZC4gV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCwKLQkgKiAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEsIEJvb2xlYW4sIGludCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgYm9vbGVhbiBpc0F1dG9CdWlsZCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBmb3JrKSB7Ci0JCXRoaXMocHJvamVjdCwgZGVsdGEsICgoaXNBdXRvQnVpbGQpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSksIHJ1bGVHcm91cCwgZm9yaywgZm9yY2UpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhLCBCb29sZWFuIGlzQXV0b0J1aWxkLCBpbnQgcnVsZUdyb3VwLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGZvcmspIHsKLQkJc3VwZXIoKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfZGVsdGEgPSBkZWx0YTsKLQkJX2lzQXV0b0J1aWxkID0gaXNBdXRvQnVpbGQ7Ci0JCV9ydWxlR3JvdXAgPSBydWxlR3JvdXA7Ci0JCV9mb3JrID0gZm9yazsKLQkJX2ZvcmNlID0gZm9yY2U7Ci0JCV9lbmFibGVkVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCQotCS8qKgotCSAqIEludGVybmFsLgotCSAqLwotCXByb3RlY3RlZCBWYWxpZGF0aW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIElXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgQm9vbGVhbiBpc0F1dG9CdWlsZCwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBmb3JrKSB7Ci0JCXN1cGVyKCk7Ci0JCV9wcm9qZWN0ID0gcHJvamVjdDsKLQkJX2RlbHRhID0gZGVsdGE7Ci0JCV9pc0F1dG9CdWlsZCA9IGlzQXV0b0J1aWxkOwotCQlfcnVsZUdyb3VwID0gcnVsZUdyb3VwOwotCQlfZm9yayA9IGZvcms7Ci0JCV9mb3JjZSA9IGZvcmNlOwotCQlfZW5hYmxlZFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQljb250ZXh0ID0gYUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlcm1pbmF0ZUNsZWFudXAoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJU2V0IGVuYWJsZWRWYWxpZGF0b3JzID0gZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmFibGVkVmFsaWRhdG9ycy5pdGVyYXRvcigpOwotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBudWxsOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfQ0xFQU5VUCwgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQkJdHJ5IHsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh2bWQuZ2V0VmFsaWRhdG9yKCkpOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCWZpbmFsIExvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb246OnRlcm1pbmF0ZUNsZWFudXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWFkZENhbmNlbFRhc2sodm1kKTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfVkFMSURBVE9SX1RFUk1JTkFURUQsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pKTsKLQkJfQotCX0gCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBzdGFydAotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGxvZ1ZhbGlkYXRpb25JbmZvKFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSUZpbGVEZWx0YVtdIGRlbHRhLCBMb2dnZXIgbG9nZ2VyLCBsb25nIHN0YXJ0KSB7Ci0vLwkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLS8vCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotLy8JCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLmxhdW5jaFZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0vLwkJZW50cnkuc2V0UHJvamVjdE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0vLwkJZW50cnkuc2V0VG9vbE5hbWUodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0vLwkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotLy8JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLS8vCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLS8vCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9IGVsc2UgewotLy8JCQkJaWYgKGRlbHRhLmxlbmd0aCA9PSAwKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoZ2V0RGVsdGFBc1N0cmluZyhkZWx0YSkpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWVudHJ5LnNldERldGFpbHMoYnVmZmVyLnRvU3RyaW5nKCkpOwotLy8JCX0KLS8vCQlsb2dnZXIud3JpdGUoTGV2ZWwuSU5GTywgZW50cnkpOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gZXhjCi0JICovCi0vLwlwcml2YXRlIHZvaWQgaGFuZGxlVGhyb3dhYmxlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBUaHJvd2FibGUgZXhjKSB7Ci0vLwkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvciBDbGFzc0Nhc3QsCi0vLwkJLy8gZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgIiBtZXNzc2FnZS4KLS8vCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzIElCTQotLy8JCS8vIFNlcnZpY2UuCi0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLS8vCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLS8vCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0vLwkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotLy8JCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotLy8JCXRyeSB7Ci0vLwkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLS8vCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLS8vCQkJdGhyb3cgZTsKLS8vCQl9Ci0vLwkJcmV0dXJuOwotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIHZtZAotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gZXhjMgotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIGhhbmRsZUluc3RhbnRpYXRpb25FeGNlcHRpb24oVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0vLwkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLS8vCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotLy8JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotLy8JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLS8vCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb246OmxhdW5jaFZhbGlkYXRvciAoZGVwcmVjYXRlZCkiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjMik7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVWYWxpZGF0aW9uRXhjZXB0aW9ucyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotLy8JCS8vIEZpcnN0LCBzZWUgaWYgYSB2YWxpZGF0b3IganVzdCBjYXVnaHQgYWxsIFRocm93YWJsZXMgYW5kCi0vLwkJLy8gYWNjaWRlbnRhbGx5IHdyYXBwZWQgYSBNZXNzYWdlTGltaXRFeGNlcHRpb24gaW5zdGVhZCBvZiBwcm9wYWdhdGluZwotLy8JCS8vIGl0LgotLy8JCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLS8vCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNZXNzYWdlTGltaXRFeGNlcHRpb24pIHsKLS8vCQkJCU1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBtc3NnRXhjID0gKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbikgZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKTsKLS8vCQkJCXRocm93IG1zc2dFeGM7Ci0vLwkJCX0gZWxzZSBpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0vLwkJCQkJdmV4Yy5zZXRDbGFzc0xvYWRlcih2bWQuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsgLy8gZmlyc3QsCi0vLwkJCQkJLy8gc2V0IHRoZSBjbGFzcyBsb2FkZXIsc28gdGhhdCB0aGUgZXhjZXB0aW9uJ3MgZ2V0TWVzc2FnZSgpIG1ldGhvZCBjYW4gcmV0cmlldmUKLS8vCQkJCQkvLyB0aGUgcmVzb3VyY2UgYnVuZGxlCi0vLwkJCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBsb2cgdGhlIGVycm9yCi0vLwkJLy8gYW5kIGNvbnRpbnVlCi0vLwkJLy8gd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0vLwkJdHJ5IHsKLS8vCQkJZXhjLnNldENsYXNzTG9hZGVyKHZtZC5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOyAvLyBmaXJzdCwKLS8vCQkJLy8gc2V0IHRoZSBjbGFzcyBsb2FkZXIsc28gdGhhdCB0aGUgZXhjZXB0aW9uJ3MgZ2V0TWVzc2FnZSgpIG1ldGhvZCBjYW4gcmV0cmlldmUgdGhlCi0vLwkJCS8vIHJlc291cmNlIGJ1bmRsZQotLy8JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQloYW5kbGVJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHZtZCwgbG9nZ2VyLCBleGMyKTsKLS8vCQl9Ci0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbi52YWxpZGF0ZShXb3JrYmVuY2hNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotLy8JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0vLwkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLS8vCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLS8vCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQkJfQotLy8JCX0KLS8vCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0vLwkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0vLwkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpICE9IG51bGwpIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0vLwkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjMikgewotLy8JCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVIZWxwZXJDbGVhbnVwRXhjZXB0aW9ucyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBMb2dnZXIgbG9nZ2VyLCBUaHJvd2FibGUgZXhjKSB7Ci0vLwkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvciBDbGFzc0Nhc3QsCi0vLwkJLy8gZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgIiBtZXNzc2FnZS4KLS8vCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzIElCTQotLy8JCS8vIFNlcnZpY2UuCi0vLwkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0vLwkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLS8vCQl9Ci0vLwkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLS8vCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLS8vCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0vLwkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotLy8JCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotLy8JCXRyeSB7Ci0vLwkJCXJlcG9ydGVyLmFkZE1lc3NhZ2Uodm1kLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLS8vCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YzIpIHsKLS8vCQkJaGFuZGxlSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih2bWQsIGxvZ2dlciwgZXhjMik7Ci0vLwkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLS8vCQkJdGhyb3cgZTsKLS8vCQl9Ci0vLwkJcmV0dXJuOwotLy8JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3JrKCkgewotCQlyZXR1cm4gX2Zvcms7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3JjZSgpIHsKLQkJcmV0dXJuIF9mb3JjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZShib29sZWFuIGZvcmNlKSB7Ci0JCV9mb3JjZSA9IGZvcmNlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb2RlIHRoYXQgaW52b2tlZCB0aGlzIG9wZXJhdGlvbiBzdXNwZW5kZWQgYXV0by1idWlsZCBiZWZvcmUgaW52b2tpbmcgdGhpcyBvcGVyYXRpb24sCi0JICogdGhlIHVzZXIncyBhdXRvLWJ1aWxkIHNldHRpbmcgaXMgc3RvcmVkIGluIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9CdWlsZCgpIHsKLQkJaWYgKF9pc0F1dG9CdWlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCk7Ci0JCX0KLQkJcmV0dXJuIF9pc0F1dG9CdWlsZC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvT24pIHsKLQkJX2lzQXV0b0J1aWxkID0gKChhdXRvT24pID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGdWxsVmFsaWRhdGUoKSB7Ci0JCXJldHVybiBfaXNGdWxsVmFsaWRhdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZ1bGxWYWxpZGF0ZShib29sZWFuIGIpIHsKLQkJX2lzRnVsbFZhbGlkYXRlID0gYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFJ1bGVHcm91cCgpIHsKLQkJcmV0dXJuIF9ydWxlR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbGlkYXRvciBtdXN0IHJ1biAoaS5lLiwgaXQgaGFzIGNoYW5nZXMgdG8gdmFsaWRhdGUsIGFuZCBpdCB3YXMgbm90Ci0JICogcnVuIGF1dG9tYXRpY2FsbHkuKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25OZWNlc3NhcnkoVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJLy8gVmFsaWRhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGlmOgotCQkvLyAgICAxLiBhdXRvLXZhbGlkYXRpb24gaGFzIHJ1biBhbmQgdGhlIHZhbGlkYXRvciBpcyBpbmNyZW1lbnRhbCwKLQkJLy8gICAgMi4gVGhlcmUgYXJlIG5vIGZpbGVzIGZvciB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlLgotCQkvLyBUaGVyZSBhcmUgZmlsZXMgdG8gdmFsaWRhdGUgaWYgdGhpcyBpcyBhIGZ1bGwgdmFsaWRhdGlvbiBvciBpZiB0aGUKLQkJLy8gdmFsaWRhdG9yIGZpbHRlcmVkIGluIHNvbWUgb2YgdGhlIGRlbHRhcy4KLQkJYm9vbGVhbiBhdXRvVmFsaWRhdGVSYW4gPSBmYWxzZTsKLQkJaWYgKF9pc0F1dG9CdWlsZCAhPSBudWxsKSB7Ci0JCQkvLyBVc2VyIHNldCB0aGUgYXV0b0J1aWxkIGRlZmF1bHQsIHNvIGNoZWNrIGlmIHZhbGlkYXRpb24gaXMKLQkJCS8vIG5lY2Vzc2FyeSBvciBub3QuCi0JCQlhdXRvVmFsaWRhdGVSYW4gPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0F1dG9WYWxpZGF0ZShnZXRQcm9qZWN0KCksIF9pc0F1dG9CdWlsZC5ib29sZWFuVmFsdWUoKSkgJiYgdm1kLmlzSW5jcmVtZW50YWwoKTsKLQkJfQotCQlib29sZWFuIGhhc0ZpbGVzID0gKGlzRnVsbFZhbGlkYXRlKCkgfHwgKGRlbHRhLmxlbmd0aCA+IDApKTsKLQkJcmV0dXJuICghYXV0b1ZhbGlkYXRlUmFuICYmIGhhc0ZpbGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiwgZ2l2ZW4gdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBhbmQgZmlsZSBkZWx0YXMsIHRoZXJlIGlzIHdvcmsgZm9yIHRoaXMKLQkgKiBvcGVyYXRpb24gdG8gZG8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlTZXQgZW5hYmxlZFZhbGlkYXRvcnMgPSBnZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCQlpZiAoKGVuYWJsZWRWYWxpZGF0b3JzID09IG51bGwpIHx8IChlbmFibGVkVmFsaWRhdG9ycy5zaXplKCkgPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNGdWxsVmFsaWRhdGUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmFibGVkVmFsaWRhdG9ycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpc1ZhbGlkYXRpb25OZWNlc3Nhcnkodm1kLCBnZXRGaWxlRGVsdGFzKG1vbml0b3IsIHZtZCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTWFwIGdldEZpbGVEZWx0YXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChfZmlsZURlbHRhcyA9PSBudWxsKSB7Ci0JCQlsb2FkRmlsZURlbHRhcyhtb25pdG9yKTsKLQkJfQotCQlyZXR1cm4gX2ZpbGVEZWx0YXM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZURlbHRhW10gZ2V0RmlsZURlbHRhcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXQgcmVzdWx0ID0gKFNldCkgZ2V0RmlsZURlbHRhcyhtb25pdG9yKS5nZXQodm1kKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElGaWxlRGVsdGFbMF07Ci0JCX0KLQkJSUZpbGVEZWx0YVtdIHRlbXAgPSBuZXcgSUZpbGVEZWx0YVtyZXN1bHQuc2l6ZSgpXTsKLQkJcmVzdWx0LnRvQXJyYXkodGVtcCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIHRoZSBmaWxlIGRlbHRhcyAoVk1EIDw9PlNldFtJRmlsZURlbHRhXSkgaWYgdGhlIGZpbGUgZGVsdGFzIGhhdmVuJ3QgYmVlbiBsb2FkZWQuIElmIHRoZQotCSAqIGRlbHRhcyBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQsIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRmlsZURlbHRhcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gQWx0aG91Z2gsIGZvciBhIGZ1bGwgYnVpbGQsIHdlIGRvbid0IGJ1aWxkIHVwIGEgbGlzdCBvZiBjaGFuZ2VkCi0JCS8vIGZpbGVzLCB3ZSBkbyBuZWVkIHRvIG5vdGlmeSBlYWNoIElXb3JrYmVuY2hDb250ZXh0IHRoYXQgYW4KLQkJLy8gSVJlc291cmNlIGhhcyBiZWVuIGZpbHRlcmVkIGluLgotCQkvLyBJdCdzIGEgZnVsbCB2YWxpZGF0aW9uIGlmIHRoZSBJUmVzb3VyY2VEZWx0YSBpcyBudWxsIGFuZCB0aGUKLQkJLy8gT2JqZWN0W10gKG9yIElSZXNvdXJjZVtdKSBpcyBhbHNvIG51bGwuCi0JCS8vIGkuZS4sIGl0J3MgYSBmdWxsIHZhbGlkYXRpb24gaWYgbm8gaW5jcmVtZW50YWwgaW5wdXQgaGFzIGJlZW4gc2V0LgotCQlzZXRGdWxsVmFsaWRhdGUoKGdldERlbHRhKCkgPT0gbnVsbCkgJiYgKF9maWxlRGVsdGFzID09IG51bGwpKTsKLQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLQkJCV9maWxlRGVsdGFzID0gRmlsdGVyVXRpbC5sb2FkRGVsdGFzKG1vbml0b3IsIGdldEVuYWJsZWRWYWxpZGF0b3JzKCksIGdldFByb2plY3QoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlfZmlsZURlbHRhcyA9IEZpbHRlclV0aWwubG9hZERlbHRhcyhtb25pdG9yLCBnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBnZXREZWx0YSgpKTsgLy8gdHJhdmVyc2UsCi0JCQkvLyBhbmQgcHJvY2VzcywgZWFjaCByZXNvdXJjZSBpbiB0aGUgZGVsdGEgdHJlZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmlsZURlbHRhcyhNYXAgZGVsdGFzKSB7Ci0JCV9maWxlRGVsdGFzID0gZGVsdGFzOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YSgpIHsKLQkJcmV0dXJuIF9kZWx0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlfZGVsdGEgPSBkZWx0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcmVWYWxpZGF0b3JzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIChnZXRFbmFibGVkVmFsaWRhdG9ycygpLnNpemUoKSAhPSAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvcnMgd2hpY2ggYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwgKGFzIHN0b3JlZCBpbgotCSAqIGdldFByb2plY3QoKSksIGFuZCBlbmFibGVkIGJ5IHRoZSB1c2VyIG9uIHRoaXMgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldEVuYWJsZWRWYWxpZGF0b3JzKCkgewotCQlyZXR1cm4gX2VuYWJsZWRWYWxpZGF0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLCBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4gSXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlCi0JICogYXV0b21hdGVkIHZhbGlkYXRpb24gZnJhbWV3b3JrIHRlc3RzLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkgewotCQlpZiAoX2xhdW5jaGVkVmFsaWRhdG9ycyA9PSBudWxsKSB7Ci0JCQlfbGF1bmNoZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCQlyZXR1cm4gX2xhdW5jaGVkVmFsaWRhdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkVmFsaWRhdG9ycyhTZXQgZXZtZHMpIHsKLQkJLy8gQ2hlY2sgdGhhdCBldmVyeSBWTUQgaW4gdGhlIHNldCBpcyBjb25maWd1cmVkIG9uIHRoaXMgcHJvamVjdC4KLQkJLy8gTmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzZXIgY2FuIG1hbnVhbGx5IGNob29zZSB3aGljaCB2YWxpZGF0b3JzCi0JCS8vIHRvIGxhdW5jaCwgYW5kIHRoZSB2YWxpZGF0b3IgbWF5IG5vdCBiZSBpbnN0YWxsZWQuCi0JCV9lbmFibGVkVmFsaWRhdG9ycy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGV2bWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJX2VuYWJsZWRWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSVByb2plY3QgdGhhdCB0aGlzIFZhbGlkYXRpb25PcGVyYXRpb24gd2FzIGNyZWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VW5pdHNPZldvcmsoKSB7Ci0JCS8qCi0JCSAqIC8vIExldCBvbmUgdW5pdCBvZiB3b3JrIGVxdWFsIG9uZSByZXNvdXJjZS4gbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyAvLyBpLmUuLCBlYWNoCi0JCSAqIGVuYWJsZWQgdmFsaWRhdG9yIG11c3QgcHJvY2VzcyAoYXQgbW9zdCkgZWFjaCByZXNvdXJjZSBpbiB0aGUgcHJvamVjdDsgY291bnQgZWFjaCBwcm9jZXNzCi0JCSAqIGFzIG9uZSB1bml0IG9mIHdvcmsgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBjZWlsaW5nIG51bWJlciwgYmVjYXVzZSBpZiB3ZSdyZSBkb2luZyBhbgotCQkgKiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCBub3QgYWxsIHJlc291cmNlcyB3aWxsIC8vIGJlIHZhbGlkYXRlZC4KLQkJICogc2V0TnVtUmVzb3VyY2VzKGNvdW50UmVzb3VyY2VzKGdldFByb2plY3QoKSkpOyBnZXRFbmFibGVkVmFsaWRhdG9ycygpLnNpemUoKTsKLQkJICovCi0JCS8vIFVudGlsIHRoZSB2YWxpZGF0b3JzIGNhbiByZXBvcnQgdW5pdHMtb2Ytd29yayBjb21wbGV0ZSwKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgbW9uaXRvciB3aXRoIGFuIHVua25vd24gYW1vdW50IG9mIHdvcmsuCi0JCS8vIChTbyB0aGUgdXNlciB3aWxsIHNlZSBtb3ZlbWVudCBpbiB0aGUgcHJvZ3Jlc3MgYmFyLCBldmVuCi0JCS8vIGlmIHRoZSBtb3ZlbWVudCBkb2Vzbid0IGluZGljYXRlIHRoZSBhbW91bnQgb2Ygd29yayBkb25lLikKLQkJcmV0dXJuIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdXNlciBpcyBjYW5jZWxsaW5nIHZhbGlkYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvamVjdC9yZXNvdXJjZSwgQWRkIGFuIGluZm9ybWF0aW9uIHRhc2sKLQkgKiB0byB0aGUgdGFzayBsaXN0IGluZm9ybWluZyB0aGUgdXNlciB0aGF0IHZhbGlkYXRpb24gaGFzIG5vdCBiZWVuIHJ1biBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENhbmNlbFRhc2soVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCUludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuYWRkT3BlcmF0aW9uVGFzayhnZXRQcm9qZWN0KCksIHZtZCwgUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIHRoZSB2YWxpZGF0aW9uIG9mIGVhY2ggY29uZmlndXJlZCBlbmFibGVkIHZhbGlkYXRvciBvbiB0aGUgY3VycmVudAotCSAqIHByb2plY3QuCi0JICogCi0JICogVGhlIElQcm9ncmVzc01vbml0b3IgcGFzc2VkIGluIG11c3Qgbm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZpbmFsIExvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQl0cnkgewotCQkJLy8gSW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciBvciBub3QgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsbGVkLAotCQkJLy8gdGhlIG1vbml0b3IgbXVzdCBub3QgYmUgbnVsbC4KLQkJCWlmIChwcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc1N1c3BlbmRlZChnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCFhcmVWYWxpZGF0b3JzRW5hYmxlZCgpKSB7Ci0JCQkJLy8gc2F2ZSBzb21lIHByb2Nlc3NpbmcgdGltZS4uLgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgV29ya2JlbmNoUmVwb3J0ZXIoZ2V0UHJvamVjdCgpLCBwcm9ncmVzc01vbml0b3IpOwotCi0JCQl0cnkgewotCQkJCS8vIFBlcmlvZGljYWxseSBjaGVjayBpZiB0aGUgdXNlciBoYXMgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24KLQkJCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJCQlwcmVWYWxpZGF0ZShyZXBvcnRlcik7Ci0JCQkJdmFsaWRhdGUocmVwb3J0ZXIpOwotCQkJCXZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ucnVuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLnJ1bihXb3JrYmVuY2hNb25pdG9yKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0UHJvamVjdE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJZW50cnkuc2V0VG9vbE5hbWUoIlZhbGlkYXRpb25PcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldEVsYXBzZWRUaW1lKGZpbmlzaCAtIHN0YXJ0KTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVmZXJlbmNpYWxGaWxlcyhXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3JSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJCVJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciByZWZGaWxlVmFsaWRhdG9yID0gcmVhZGVyLmdldFJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcigpOwotCQkJaWYgKHJlZkZpbGVWYWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCWlmIChfZGVsdGEgIT0gbnVsbCkgewotCQkJCQlyZWZGaWxlVmFsaWRhdGVGaWxlRGVsdGEocmVwb3J0ZXIsIHJlZkZpbGVWYWxpZGF0b3IpOwotCQkJCX0gZWxzZSBpZiAoX3Byb2plY3QgIT0gbnVsbCkgewotCQkJCQlwb3N0VmFsaWRhdGVQcm9qZWN0KHJlcG9ydGVyLCByZWZGaWxlVmFsaWRhdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZkZpbGVWYWxpZGF0ZUZpbGVEZWx0YShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9yIHJlZkZpbGVWYWxpZGF0b3IpIHsKLQkJSVJlc291cmNlRGVsdGFbXSByZXNvdXJjZURlbHRhID0gX2RlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCk7Ci0JCUxpc3QgaW5wdXRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIEEgbGlzdCBvZiBJRmlsZSdzCi0JCUxpc3QgcmVmZXJlbmNpbmdGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlc291cmNlRGVsdGEgIT0gbnVsbCAmJiByZXNvdXJjZURlbHRhLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRGVsdGFbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCWdldEZpbGVSZXNvdXJjZURlbHRhSW5Gb2xkZXIocmVzb3VyY2VEZWx0YVtpXSwgaW5wdXRGaWxlcyk7Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotCQkJCQlpbnB1dEZpbGVzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQlMaXN0IHJGaWxlc1RvVmFsaWRhdGUgPSByZWZGaWxlVmFsaWRhdG9yLmdldFJlZmVyZW5jZWRGaWxlKGlucHV0RmlsZXMpOwotCQkJaWYgKHJGaWxlc1RvVmFsaWRhdGUgIT0gbnVsbCAmJiAhckZpbGVzVG9WYWxpZGF0ZS5pc0VtcHR5KCkpCi0JCQkJcmVmZXJlbmNpbmdGaWxlcy5hZGRBbGwockZpbGVzVG9WYWxpZGF0ZSk7Ci0JCQl0cnkgewotCQkJCWlmICghcmVmZXJlbmNpbmdGaWxlcy5pc0VtcHR5KCkpCi0JCQkJCXZhbGlkYXRlUmVmZXJlbmNpbmdGaWxlcyhyZXBvcnRlciwgcmVmZXJlbmNpbmdGaWxlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldEZpbGVSZXNvdXJjZURlbHRhSW5Gb2xkZXIoSVJlc291cmNlRGVsdGEgZGVsdGEsIExpc3QgaW5wdXRGaWxlcykgewotCQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlRGVsdGEgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VEZWx0YS5sZW5ndGg7IGkrKykgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VEZWx0YVtpXS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlpbnB1dEZpbGVzLmFkZChyZXNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikKLQkJCQlnZXRGaWxlUmVzb3VyY2VEZWx0YUluRm9sZGVyKHJlc291cmNlRGVsdGFbaV0sIGlucHV0RmlsZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIHJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3N0VmFsaWRhdGVQcm9qZWN0KFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBSZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IgcmVmRmlsZVZhbGlkYXRvcikgewotCQlTZXQgc2V0ID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKF9wcm9qZWN0KTsKLQkJSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgZGF0YSA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXQubmV4dCgpOwotCQkJTGlzdCBmaWx0ZXJzID0gZGF0YS5nZXROYW1lRmlsdGVycygpOwotCQkJTGlzdCBmaWxlcyA9IGdldEFsbEZpbGVzRm9yRmlsdGVyKGZpbHRlcnMpOwotCQkJaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGZpbGVGb3JWYWxpZGF0aW9uID0gcmVmRmlsZVZhbGlkYXRvci5nZXRSZWZlcmVuY2VkRmlsZShmaWxlcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJdmFsaWRhdGVSZWZlcmVuY2luZ0ZpbGVzKHJlcG9ydGVyLCBmaWxlRm9yVmFsaWRhdGlvbik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsdGVycwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QWxsRmlsZXNGb3JGaWx0ZXIoTGlzdCBmaWx0ZXJzKSB7Ci0JCWlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgYWxsUHJvamVjdEZpbGVzID0gUmVmZXJlbmNpYWxGaWxlVmFsaWRhdG9ySGVscGVyLmdldEFsbFByb2plY3RGaWxlcyhfcHJvamVjdCk7Ci0JCQlMaXN0IGZpbHRlckZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgZmlsdGVycy5nZXQoaSk7Ci0JCQkJaWYgKGZpbGVOYW1lID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUHJvamVjdEZpbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJCUlGaWxlIHByb2plY3RGaWxlID0gKElGaWxlKSBhbGxQcm9qZWN0RmlsZXMuZ2V0KGopOwotCQkJCQlpZiAoZmlsZU5hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJCQkJU3RyaW5nIGV4dE5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMiwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCQkJCQkJU3RyaW5nIGV4dCA9IHByb2plY3RGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJCWlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzKGV4dE5hbWUpKQotCQkJCQkJCWZpbHRlckZpbGVzLmFkZChwcm9qZWN0RmlsZSk7Ci0JCQkJCX0gZWxzZSBpZiAoZmlsZU5hbWUuZXF1YWxzKHByb2plY3RGaWxlLmdldE5hbWUoKSkpCi0JCQkJCQlmaWx0ZXJGaWxlcy5hZGQocHJvamVjdEZpbGUpOwotCQkJCX0KLQotCQkJfQotCQkJcmV0dXJuIGZpbHRlckZpbGVzOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jaW5nRmlsZXMoSVJlcG9ydGVyIHJlcG9ydGVyLCBMaXN0IHJlZmVyZW5jaW5nRmlsZXMpIHRocm93cyBFeGNlcHRpb24gewotCQlIYXNoU2V0IHZhbGlkYXRlZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2luZ0ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmlsZSByZWZGaWxlID0gKElGaWxlKSByZWZlcmVuY2luZ0ZpbGVzLmdldChpKTsKLQkJCWlmICghdmFsaWRhdGVkRmlsZXMuY29udGFpbnMocmVmRmlsZSkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZWZGaWxlLmdldFBhcmVudCgpOwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICEocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkpCi0JCQkJCXByb2plY3QgPSBnZXRQcm9qZWN0Q29udGFpbmVyKHJlc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJU2V0IHNldCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShwcm9qZWN0KTsKLS8vCQkJCQlJRmlsZURlbHRhW10gY2hhbmdlZGZpbGVzID0gbmV3IEZpbGVEZWx0YVtde25ldyBXb3JrYmVuY2hGaWxlRGVsdGEocmVmRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSwgSUZpbGVEZWx0YS5DSEFOR0VELCByZWZGaWxlKX07Ci0JCQkJCUl0ZXJhdG9yIGl0ID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCVZhbGlkYXRvck1ldGFEYXRhIGRhdGEgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0Lm5leHQoKTsKLQkJCQkJCWlmIChkYXRhLmlzQXBwbGljYWJsZVRvKHJlZkZpbGUpKSB7Ci0JCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBkYXRhLmdldFZhbGlkYXRvcigpOwotCQkJCQkJCXZhbGlkYXRvci52YWxpZGF0ZShkYXRhLmdldEhlbHBlcihwcm9qZWN0KSxyZXBvcnRlcik7Ci0JCQkJCQkJdmFsaWRhdGVkRmlsZXMuYWRkKHJlZkZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0Q29udGFpbmVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUmVzb3VyY2UgcFJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCWlmICghKHBSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSkKLQkJCXJldHVybiBnZXRQcm9qZWN0Q29udGFpbmVyKHBSZXNvdXJjZSk7Ci0JCXJldHVybiAoSVByb2plY3QpIHBSZXNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVWYWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gTG9hZCB0aGUgaW5wdXQuCi0JCWdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBhbmQgcnVuIHRoZSB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIGEgYmFja2dyb3VuZAotCSAqIHRocmVhZCwgYW5kIHRoZSBub3QtdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGlzIHRocmVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJcmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfUFJPR1JFU1NNT05JVE9SX1RJVExFKSwgZ2V0VW5pdHNPZldvcmsoKSk7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotLy8JCVdvcmtiZW5jaFJlcG9ydGVyIG51bGxSZXBvcnRlciA9IG5ldyBXb3JrYmVuY2hSZXBvcnRlcihnZXRQcm9qZWN0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlmaW5hbCBMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbDsKLQkJCi0JCUhhc2hTZXQgam9iVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUhhc2hTZXQgdmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQkKLQkJaXRlcmF0b3IgPSBnZXRFbmFibGVkVmFsaWRhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCQotCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApewotCQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlWYWxpZGF0b3IgdmFsSW5zdGFuY2UgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXZhbEluc3RhbmNlID0gdm1kLmdldFZhbGlkYXRvcigpOwotCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQkJaWYoIVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2JsZW1WYWxpZGF0b3JzKCkuY29udGFpbnModm1kKSkgewotCQkJCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvYmxlbVZhbGlkYXRvcnMoKS5hZGQodm1kKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlMS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCQlpZiggaXNGb3JrKCkgJiYgKHZhbEluc3RhbmNlICE9IG51bGwpICYmIHZhbEluc3RhbmNlIGluc3RhbmNlb2YgSVZhbGlkYXRvckpvYiApewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkZWx0YSA9IGdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIHZtZCk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiB3aWxsUnVuID0gKGlzRm9yY2UoKSB8fCBpc1ZhbGlkYXRpb25OZWNlc3Nhcnkodm1kLCBkZWx0YSkpOwotCQkJCQkJaWYoIHdpbGxSdW4gKXsKLQkJCQkJCQlqb2JWYWxpZGF0b3JzLmFkZCggdm1kICk7Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmICh2YWxJbnN0YW5jZSAhPSBudWxsKXsKLQkJCQkJCXZhbGlkYXRvcnMuYWRkKCB2bWQgKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiggam9iVmFsaWRhdG9ycy5zaXplKCkgPiAwICl7Ci0JCQkJbGF1bmNoSm9icyggam9iVmFsaWRhdG9ycywgcmVwb3J0ZXIgKTsKLQkJCX0KLQkJCi0JCQotCQl0cnkgewotCQkJLy9pdGVyYXRvciA9IGdldEVuYWJsZWRWYWxpZGF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJCWl0ZXJhdG9yID0gdmFsaWRhdG9ycy5pdGVyYXRvcigpOwotCQkJCi0JCQkvLyBJbiBvcmRlciB0byBhbGxvdyB2YWxpZGF0b3JzIHRvIHJ1biwgbXVzdCBmaXJzdCBjaGVjayBpZiB0aGVyZSdzCi0JCQkvLyBzcGFjZSBmb3IgbmV3IG1hcmtlcnMuCi0JCQkvLyBCdXQgd2UgZG9uJ3Qgd2FudCB0aGUgb2xkIG1hcmtlcnMgdG8gcHJldmVudCB2YWxpZGF0aW9uIGZyb20KLQkJCS8vIHJ1bm5pbmcgYWdhaW4sIHNvIGRlbGV0ZSBhbGwKLQkJCS8vIG9mIHRoZSBvbGQgbWFya2VycyBmaXJzdCwgYW5kIHRoZW4gcnVuIHZhbGlkYXRpb24uCi0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gSXMgdmFsaWRhdGlvbiBhYm91dCB0byBiZSBydW4gb24gdGhpcyB2YWxpZGF0b3I/Ci0JCQkJLy8gVmFsaWRhdGlvbiB3aWxsIHJ1biBlaXRoZXIgaWYgdGhpcyBvcGVyYXRpb24gZm9yY2VzCi0JCQkJLy8gcmVnYXJkbGVzcwotCQkJCS8vIG9mIG5lZWQsIG9yIGlmIHRoZSB2YWxpZGF0b3Igd2FzIG5vdCBydW4gYXV0b21hdGljYWxseS4KLQkJCQkvLyBJZiB2YWxpZGF0aW9uIGlzIG5vdCBhYm91dCB0byBiZSBydW4sIHRoZW4gZG9uJ3QgYWN0aXZhdGUKLQkJCQkvLyB0aGUgcGx1Z2luCi0JCQkJdHJ5IHsKLQkJCQkJZGVsdGEgPSBnZXRGaWxlRGVsdGFzKHJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLCB2bWQpOwotCQkJCQlib29sZWFuIHdpbGxSdW4gPSAoaXNGb3JjZSgpIHx8IGlzVmFsaWRhdGlvbk5lY2Vzc2FyeSh2bWQsIGRlbHRhKSk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJCQkJVGltZUVudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRUaW1lRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLnZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRQcm9qZWN0TmFtZShnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCQkJCWVudHJ5LnNldFRvb2xOYW1lKHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCkpOwotCQkJCQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoMCk7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgid2lsbCBydW4/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKHdpbGxSdW4pOwotCQkJCQkJYnVmZmVyLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCgiaXMgZm9yY2U/ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKGlzRm9yY2UoKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKCJpc0F1dG9CdWlsZD8gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoX2lzQXV0b0J1aWxkKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoImlzQXV0b1ZhbGlkYXRlPyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYm9vbGVhbiBhdXRvQnVpbGQgPSAoX2lzQXV0b0J1aWxkID09IG51bGwpID8gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkgOiBfaXNBdXRvQnVpbGQuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQXV0b1ZhbGlkYXRlKGdldFByb2plY3QoKSwgYXV0b0J1aWxkKSk7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlidWZmZXIuYXBwZW5kKCJpc0luY3JlbWVudGFsPyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnVmZmVyLmFwcGVuZCh2bWQuaXNJbmNyZW1lbnRhbCgpKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgiRVZFUllUSElORyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChkZWx0YS5sZW5ndGggPT0gMCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCJOT1RISU5HIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKGdldERlbHRhQXNTdHJpbmcoZGVsdGEpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbnRyeS5zZXREZXRhaWxzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FU1QsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQlpZiAoIXdpbGxSdW4pIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLnZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCQkvKgotCQkJCQkgVGhlIGNvZGUgIGJlbG93ICBjYXVzZXMgYnVuZGxlIG5vdCBmb3VuZCBleGNlcHRpb24gc2luY2UsIHRoZSAgYnVuZGxlIGhlcmUgaXMKLQkJCQkJIHZhbGlkYXRlX2Jhc2UgYW5kIHdlICBhcmUgIHRyeWluZyB0byBsb2FkIHRoYXQgYnVuZGxlIGZyb20gdGhlIGNsYXNzbG9hZGVyIG9mIAotCQkJCQkgdGhlIFZhbGlkYXRvci4gCi0JCQkgIAotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkJCSovCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQljb250ZXh0ID0gdm1kLmdldEhlbHBlcihnZXRQcm9qZWN0KCkpOwotCQkJCQlpbml0VmFsaWRhdGVDb250ZXh0KGRlbHRhKTsKLQkJCQkJdmFsaWRhdG9yID0gdm1kLmdldFZhbGlkYXRvcigpOwotCQkJCQkKLQkJCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uOjp2YWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotLy8JCQkJaWYgKGlzRm9yaygpICYmIHZtZC5pc0FzeW5jKCkpIHsKLS8vCQkJCQkvLyBEb24ndCBhcHBlYXIgdG8gcnVuIGluIHRoZSBmb3JlZ3JvdW5kIGJ5IHNlbmRpbmcKLS8vCQkJCQkvLyBwcm9ncmVzcyB0byB0aGUgSVByb2dyZXNzTW9uaXRvciBpbiB0aGUKLS8vCQkJCQkvLyBXb3JrYmVuY2hNb25pdG9yLiBTdXBwcmVzcyB0aGUgc3RhdHVzIG1lc3NhZ2VzIGJ5Ci0vLwkJCQkJLy8gY2hhbmdpbmcgdGhlIElQcm9ncmVzc01vbml0b3IgdG8gYQotLy8JCQkJCS8vIE51bGxQcm9ncmVzc01vbml0b3IuCi0vLwkJCQkJVlRocmVhZE1hbmFnZXIuZ2V0TWFuYWdlcigpLnF1ZXVlKHdyYXBJblJ1bm5hYmxlKG51bGxSZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsKFdvcmtiZW5jaENvbnRleHQpZ2V0Q29udGV4dCgpLGRlbHRhLCBpdGVyYXRvcikpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlpbnRlcm5hbFZhbGlkYXRlKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgY29udGV4dCwgZGVsdGEpOwotLy8JCQkJfQotCQkJCWludGVybmFsVmFsaWRhdGUocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBjb250ZXh0LCBkZWx0YSk7Ci0JCQkJfQotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCWhhbmRsZU9wZXJhdGlvbkNhbmNlbGxlZFZhbGlkYXRlRXhjZXB0aW9uKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgaXRlcmF0b3IsIGxvZ2dlciwgZXhjKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbGVhc2VDYWNoZWRNYXBzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVsZWFzZUNhY2hlZE1hcHMoKSB7Ci0JCWlmIChWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkucHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YSAhPSBudWxsKSB7Ci0JCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkucHJvamVjdFZhbGlkYXRpb25NZXRhRGF0YS5jbGVhcigpOwotCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLnByb2plY3RWYWxpZGF0aW9uTWV0YURhdGEgPSBudWxsOwotCQl9Ci0JCUlQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciBoZWxwZXIgPSBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRWYWxpZGF0aW9uSGVscGVyKCk7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkKLQkJCWhlbHBlci5kaXNwb3NlSW5zdGFuY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRlQ29udGV4dChJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJIGlmIChjb250ZXh0IGluc3RhbmNlb2YgV29ya2JlbmNoQ29udGV4dCkgewotCQkJICgoV29ya2JlbmNoQ29udGV4dCljb250ZXh0KS5zZXRWYWxpZGF0aW9uRmlsZVVSSXMobmV3IEFycmF5TGlzdCgpKTsKLQkJCSBmb3IoaW50IGkgPSAwOyBpIDwgZGVsdGEubGVuZ3RoOyBpKyspIHsKLQkJCQkgSUZpbGVEZWx0YSBmaWxlID0gZGVsdGFbaV07Ci0JCQkJIGlmKGZpbGUuZ2V0RGVsdGFUeXBlKCkgIT0gSUZpbGVEZWx0YS5ERUxFVEVEICkgewotCQkJCQkgKChXb3JrYmVuY2hDb250ZXh0KWNvbnRleHQpLmdldFZhbGlkYXRpb25GaWxlVVJJcygpLmFkZChmaWxlLmdldEZpbGVOYW1lKCkpOwotCQkJCSB9Ci0JCQkgfSAKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gdm1kCi0JICogQHBhcmFtIGl0ZXJhdG9yCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqIEBwYXJhbSBleGMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlT3BlcmF0aW9uQ2FuY2VsbGVkVmFsaWRhdGVFeGNlcHRpb24oV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIEl0ZXJhdG9yIGl0ZXJhdG9yLCBmaW5hbCBMb2dnZXIgbG9nZ2VyLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJLyoKLQkJICogSWYgdGhlIHVzZXIgdGVybWluYXRlcyB2YWxpZGF0aW9uIChpLmUuLCBwcmVzc2VzICJjYW5jZWwiIG9uIHRoZSBwcm9ncmVzcyBtb25pdG9yKSBiZWZvcmUKLQkJICogdGhlIHZhbGlkYXRpb24gY29tcGxldGVzLCBwZXJmb3JtIGNsZWFuIHVwIG9uIGVhY2ggY29uZmlndXJlZCBlbmFibGVkIHZhbGlkYXRvci4KLQkJICogCi0JCSAqIFRvIGNsZWFuIHVwLCBzZXZlcmFsIHN0ZXBzIGFyZSBwZXJmb3JtZWQ6IDEuIGNhbGwgPGNvZGU+PC9jb2RlPiBvbiBlYWNoIGNvbmZpZ3VyZWQKLQkJICogZW5hYmxlZCB2YWxpZGF0b3IsIHNvIHRoYXQgZWFjaCB2YWxpZGF0b3IgY2FuIHBlcmZvcm0gY2xlYW51cCB0aGF0IGl0IGtub3dzIGlzIG5lY2Vzc2FyeS4KLQkJICogMi4gcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IHRoaXMgdmFsaWRhdG9yIGhhcyBhZGRlZCB0byB0aGUgdGFzayBsaXN0IDMuIGFkZCBhbm90aGVyIHRhc2sgdG8KLQkJICogdGhlIHRhc2sgbGlzdCB0byBzYXkgdGhhdCB2YWxpZGF0aW9uLCB1c2luZyB0aGlzIHZhbGlkYXRvciBvbiB0aGlzIHByb2plY3QsIHdhcwotCQkgKiB0ZXJtaW5hdGVkLgotCQkgKiAKLQkJICogU3RlcHMgMiBhbmQgMyBhcmUgZG9uZSBzbyB0aGF0IGl0J3MgY2xlYXIgd2hhdCBoYXMsIGFuZCBoYXMgbm90LCBiZWVuIHZhbGlkYXRlZC4gSWYgdGhlc2UKLQkJICogc3RlcHMgd2VyZW4ndCBwZXJmb3JtZWQsIHZhbGlkYXRpb24gY291bGQgYmUgZG9uZSBvbiBzb21lIGl0ZW1zIGluIHRoZSBwcm9qZWN0LCBidXQgbm90Ci0JCSAqIG90aGVyczsgYW5kIHRoZSB1c2VyIGNvdWxkIG1pc3Rha2VubHkgYmVsaWV2ZSB0aGF0IHRob3NlIGFyZSB0aGUgb25seSBwcm9ibGVtcyB3aXRoIHRoZQotCQkgKiBwcm9qZWN0LiBVbmxlc3MgdGhlIHVzZXIga25vd3MgdGhhdCBhIGZ1bGwgdmVyaWZpY2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUsIGhlL3NoZSBjb3VsZAotCQkgKiBjb250aW51ZSB0byByZWx5IG9uIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24sIGFuZCBuZXZlciBrbm93IHRoYXQgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggYQotCQkgKiByZXNvdXJjZSB3aGljaCBoYXNuJ3QgYmVlbiB2YWxpZGF0ZWQuCi0JCSAqLwotCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQLCBuZXcgU3RyaW5nW117dm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KSk7Ci0JCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JCWFkZENhbmNlbFRhc2sodm1kKTsKLQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdG9yID0gdm1kLmdldFZhbGlkYXRvcigpOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMyKSB7Ci0JCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0JCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uOjp2YWxpZGF0ZShXb3JrYmVuY2hSZXBvcnRlcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjMik7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1ZBTElEQVRPUl9DTEVBTlVQLCBuZXcgU3RyaW5nW117dm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KSk7Ci0JCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQkJYWRkQ2FuY2VsVGFzayh2bWQpOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19WQUxJREFUT1JfVEVSTUlOQVRFRCwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSkpOwotCQl9Ci0JCXRocm93IGV4YzsgLy8gcHJvcGFnYXRlIHRoZSBleGNlcHRpb24gdXAgdG8gdGhlIGZyYW1ld29yayBzbyB0aGF0Ci0JCS8vIHRoZSBmcmFtZXdvcmsgY2FuIGRpc3BsYXkgdGhlIGNvcnJlY3QgImNhbmNlbGxlZCIKLQkJLy8gbWVzc2FnZSBpbiB0aGUgZGlhbG9nCi0KLQl9Ci0KLQkvKiBwYWNrYWdlICovCi0Jdm9pZCBpbnRlcm5hbFZhbGlkYXRlKGZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgZmluYWwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLGZpbmFsIElXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBmaW5hbCBJRmlsZURlbHRhW10gZGVsdGEpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIExvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQl0cnkgewotCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQlyZW1vdmVPbGRNZXNzYWdlcyhyZXBvcnRlciwgdmFsaWRhdG9yLCB2bWQsIGRlbHRhKTsKLQkJCS8vIERvIE5PVCBjaGVjayBpZiB0aGUgbWVzc2FnZSBsaW1pdCBpcyBleGNlZWRlZCBiZWZvcmUgbGF1bmNoaW5nCi0JCQkvLyB0aGUgdmFsaWRhdG9yLgotCQkJLy8gRXZlbiBpZiB0aGUgbGltaXQgaXMgZXhjZWVkZWQgd2hlbiB0aGUgbWVzc2FnZXMgYXJlIHJlbW92ZWQgZnJvbQotCQkJLy8gdGhlIGRlbHRhCi0JCQkvLyBmaWxlcywgaXQgY291bGQgYmUgdGhhdCB0aGUgdmFsaWRhdG9yIGl0c2VsZiB3aWxsIHJlbW92ZQotCQkJLy8gbWVzc2FnZXMgYmVmb3JlCi0JCQkvLyBwcm9jZWVkaW5nLiBMZXQgdGhlIHZhbGlkYXRvciBydW4gc28gdGhhdCBpdCBjYW4gcmVtb3ZlIG1lc3NhZ2VzCi0JCQkvLyBpZiBpdAotCQkJLy8gbmVlZHMgdG8sIGFuZCBpZiBpdCB0cmllcyB0byBhZGQgYSBtZXNzYWdlIHdoZW4gdGhlIGxpbWl0IGlzCi0JCQkvLyBleGNlZWRlZCwgbGV0Ci0JCQkvLyB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgdGFrZSBjYXJlIG9mIGl0LgotCQkJbGF1bmNoVmFsaWRhdG9yKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgYUNvbnRleHQsIGRlbHRhKTsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIHZhbGlkYXRlKFdvcmtiZW5jaFJlcG9ydGVyKSBtZXRob2QuCi0JCQl0aHJvdyBleGM7Ci0JCX1jYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgbG9nIHRoZQotCQkJLy8gZXJyb3IgYW5kIGNvbnRpbnVlCi0JCQkvLyB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCS8vIElmIGEgcnVudGltZSBleGNlcHRpb24gaGFzIG9jY3VyZWQsIGUuZy4gTnVsbFBvaW50ZXIgb3IKLQkJCS8vIENsYXNzQ2FzdCwgZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKLQkJCS8vICIgbWVzc3NhZ2UuCi0JCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzCi0JCQkvLyBJQk0gU2VydmljZS4KLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLmludGVybmFsVmFsaWRhdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCi0JCQkvKgotCQkJIFRoZSBjb2RlICBiZWxvdyAgY2F1c2VzIGJ1bmRsZSBub3QgZm91bmQgZXhjZXB0aW9uIHNpbmNlLCB0aGUgIGJ1bmRsZSBoZXJlIGlzCi0JCQkgdmFsaWRhdGVfYmFzZSBhbmQgd2UgIGFyZSAgdHJ5aW5nIHRvIGxvYWQgdGhhdCBidW5kbGUgZnJvbSB0aGUgY2xhc3Nsb2FkZXIgb2YgCi0JCQkgdGhlIFZhbGlkYXRvci4gCi0JCQkgIAotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkqLwotCQl9IGZpbmFsbHkgewotCQkJLy8gSWYgdXNlciBmaXhlcyBwcm9ibGVtLCBhbmQgbGltaXQgZXhjZWVkZWQsIGFkZCAiZXhjZWVkZWQiCi0JCQkvLyBtZXNzYWdlLCBvcgotCQkJLy8gaWYgbGltaXQgbm90IGV4Y2VlZGVkIGFueSBtb3JlLCByZW1vdmUgImV4Y2VlZGVkIiBtZXNzYWdlLgotCQkJLy9NZXNzYWdlIExpbWl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgZnJhbWV3b3JrCi0JCQkvL1ZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmNoZWNrTWVzc2FnZUxpbWl0KGdldFByb2plY3QoKSwgdHJ1ZSk7Ci0JCQlyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbiBvcmRlciB0byBhbGxvdyB2YWxpZGF0b3JzIHRvIHJ1biwgbXVzdCBmaXJzdCBjaGVjayBpZiB0aGVyZSdzIHNwYWNlIGZvciBuZXcgbWFya2Vycy4gQnV0Ci0JICogdGhlIG9sZCBtYXJrZXJzIG11c3Qgbm90IHByZXZlbnQgdmFsaWRhdGlvbiBmcm9tIHJ1bm5pbmcgYWdhaW4gKGxpbWl0IGV4Y2VlZGVkKSwgc28gZGVsZXRlCi0JICogYWxsIG9mIHRoZSBvbGQgbWFya2VycyBmaXJzdCwgYW5kIHRoZW4gcnVuIHZhbGlkYXRpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHJlbW92ZU9sZE1lc3NhZ2VzKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJRmlsZURlbHRhW10gZGVsdGEpIHsKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBJZiB0aGUgdmFsaWRhdG9yIGhhcyBiZWVuIGVuYWJsZWQsIHJlbW92ZSB0aGUgImNhbmNlbCIgdGFzay4KLQkJLy8gSWYgdGhlIHZhbGlkYXRvciwgb24gdGhlIGxhc3QgcnVuLCB0aHJldyBhIFRocm93YWJsZSwgcmVtb3ZlIHRoZQotCQkvLyAiaW50ZXJuYWwgZXJyb3IiIHRhc2suIChGb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSByZW1vdmUgdGhlICJjYW5jZWwiCi0JCS8vIHRhc2suCi0JCUludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkucmVtb3ZlT3BlcmF0aW9uVGFza3MoZ2V0UHJvamVjdCgpLCB2bWQpOwotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayB0byBzZWUgaWYgYSBmdWxsIGJ1aWxkIG11c3QgYmUgcGVyZm9ybWVkLCBvciBpZiBhIGRlbHRhCi0JCQkvLyBidWlsZCBpcyB0byBiZSBwZXJmb3JtZWQsIGlmIHRoZXJlIGFyZSBmaWxlcyB0byB2ZXJpZnkgZm9yIHRoYXQKLQkJCS8vIHZhbGlkYXRvci4gKElmIGl0J3MgZGVsdGEsIGJ1dCB0aGVyZSBhcmUgbm8gZmlsZXMsIGNhbGxpbmcKLQkJCS8vIHZhbGlkYXRlIG9uIHRoYXQgdmFsaWRhdG9yIHN0YXJ0cyBhIGZ1bGwgYnVpbGQsIGluc3RlYWQgb2YganVzdAotCQkJLy8gcmV0dXJuaW5nLikKLQkJCWlmIChpc0Z1bGxWYWxpZGF0ZSgpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1NUQVJUX1JFTU9WSU5HX09MRF9NRVNTQUdFUywgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJCQltZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19GSU5JU0hfUkVNT1ZJTkdfT0xEX01FU1NBR0VTLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtZXNzYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJCQkvLyBiZWNhdXNlIHRoYXQncyBhbHJlYWR5IGNoZWNrZWQgaW4gaXNWYWxpZGF0aW9uTmVjZXNzYXJ5Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX1NUQVJUX1JFTU9WSU5HX09MRF9NRVNTQUdFUywgbmV3IFN0cmluZ1tde3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGg7IGkrKykgewotCQkJCQlXb3JrYmVuY2hGaWxlRGVsdGEgZmQgPSAoV29ya2JlbmNoRmlsZURlbHRhKSBkZWx0YVtpXTsKLQkJCQkJaWYgKGZkLmdldERlbHRhVHlwZSgpICE9IElGaWxlRGVsdGEuREVMRVRFRCkgewotCQkJCQkJLy8gSWYgdGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCwgZWNsaXBzZSBlcmFzZXMgYWxsCi0JCQkJCQkvLyBtYXJrZXJzIG9uIHRoZSBmaWxlLgotCQkJCQkJLy8gQWxzbywgd2hlbiBhIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QsCi0JCQkJCQkvLyBXb3JrYmVuY2hSZXBvcnRlcidzIGdldE1lc3NhZ2VSZXNvdXJjZSgpCi0JCQkJCQkvLyByZXR1cm5zIHRoZSBJUHJvamVjdCwgd2hpY2ggbWVhbnMgdGhhdCByZW1vdmluZyB0aGUKLQkJCQkJCS8vIG1lc3NhZ2VzIGZyb20gdGhpcwotCQkJCQkJLy8gZmlsZSByZW1vdmVzIGFsbCBvZiB0aGlzIHZhbGlkYXRvcidzIG1lc3NhZ2VzIG9uCi0JCQkJCQkvLyB0aGlzIElQcm9qZWN0IChhaXggZGVmZWN0IDIwNjE1NykKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlcG9ydGVyLmdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIGZkKTsKLQkJCQkJCWlmIChmZC5nZXRPYmplY3QoKS5lcXVhbHMoZmQuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCQkJCQlXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSwgdmFsaWRhdG9yKTsgLy8gcmVtb3ZlCi0JCQkJCQkJLy8gYWxsCi0JCQkJCQkJLy8gbWVzc2FnZXMKLQkJCQkJCQkvLyBmcm9tCi0JCQkJCQkJLy8gdGhpcwotCQkJCQkJCS8vIHJlc291cmNlCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvciwgZmQuZ2V0T2JqZWN0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0ZJTklTSF9SRU1PVklOR19PTERfTUVTU0FHRVMsIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJfQotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHZhbGlkYXRvciwgbG9nIHRoZQotCQkJLy8gZXJyb3IgYW5kIGNvbnRpbnVlCi0JCQkvLyB3aXRoIHRoZSBuZXh0IHZhbGlkYXRvci4KLQkJCS8vIElmIGEgcnVudGltZSBleGNlcHRpb24gaGFzIG9jY3VyZWQsIGUuZy4gTnVsbFBvaW50ZXIgb3IKLQkJCS8vIENsYXNzQ2FzdCwgZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKLQkJCS8vICIgbWVzc3NhZ2UuCi0JCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlIGNhbGxzCi0JCQkvLyBJQk0gU2VydmljZS4KLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLnZhbGlkYXRlKFdvcmtiZW5jaE1vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlTdHJpbmcgbXNzZyA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwgbmV3IFN0cmluZ1tde2dldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhtc3NnKTsKLQkJCQotCQkJLyoKLQkJCSBUaGUgY29kZSAgYmVsb3cgIGNhdXNlcyBidW5kbGUgbm90IGZvdW5kIGV4Y2VwdGlvbiBzaW5jZSwgdGhlICBidW5kbGUgaGVyZSBpcwotCQkJIHZhbGlkYXRlX2Jhc2UgYW5kIHdlICBhcmUgIHRyeWluZyB0byBsb2FkIHRoYXQgYnVuZGxlIGZyb20gdGhlIGNsYXNzbG9hZGVyIG9mIAotCQkJIHRoZSBWYWxpZGF0b3IuIAkJCSAqIAotCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TWVzc2FnZSgpOwotCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJbWVzc2FnZS5zZXRQYXJhbXMobXNnUGFybSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkqLwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciBhIGZ1bGwgdmVyaWZpY2F0aW9uIG9yIGEgZGVsdGEgdmVyaWZpY2F0aW9uIGlzIGluIHByb2dyZXNzLCBib3RoIHdpbGwgY2FsbCB0aGlzCi0JICogbWV0aG9kIHRvIHByb2Nlc3MgdGhlIHJlc291cmNlLiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gZmlsdGVyIHRoZQotCSAqIHJlc291cmNlIChpLmUuLCB0aGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSByZXNvdXJjZSBmYWlscyB0aGUgZmlsdGVyIHRlc3QpLgotCSAqIDxjb2RlPnByb2Nlc3M8L2NvZGU+IGFsc28gc2VuZHMgb3V0cHV0IHRvIHRoZSA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPiwgYW5kIGNhbGxzCi0JICogdGhlIGN1cnJlbnQgVmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4KLQkgKiAKLQkgKiBUbyBwcm9jZXNzIGEgcmVzb3VyY2UsIHRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzOiAxLiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgcmVnaXN0ZXJlZCBmb3IKLQkgKiB0aGlzIHZhbGlkYXRvciAoaS5lLiwgdGhlIHZhbGlkYXRvciBoYXMgZWl0aGVyIHNwZWNpZmllZCBpdCBpbiBhIGZpbHRlciwgb3IgaGFzIG5vdCBmaWx0ZXJlZAotCSAqIGl0IG91dCBleHBsaWNpdGx5KSAyLiBjYWxsIDxjb2RlPmlzVmFsaWRhdGlvblNvdXJjZTwvY29kZT4gb24gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHdpdGgKLQkgKiB0aGUgY3VycmVudCByZXNvdXJjZS4gVGhpcyBtZXRob2QgcGVyZm9ybXMgZnVydGhlciBmaWx0ZXJpbmcgYnkgdGhlIFZhbGlkYXRvciBpdHNlbGYsIGluCi0JICogYWRkaXRpb24gdG8gdGhlIHN0YXRpYyBmaWx0ZXJpbmcgZG9uZSBieSB0aGUgZnJhbWV3b3JrLCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gaW4KLQkgKiBwbHVnaW4ueG1sLiAzLiBJZiB0aGUgcmVzb3VyY2UgcGFzc2VzIGJvdGggZmlsdGVycywgY2FsbCA8Y29kZT52YWxpZGF0ZTwvY29kZT4gb24gdGhlCi0JICogdmFsaWRhdG9yLCB3aXRoIHRoZSByZXNvdXJjZS4gNC4gV2hlbiBjb21wbGV0ZSAoZWl0aGVyIGJ5IGZhaWxpbmcgdG8gcGFzcyBhIGZpbHRlciwgb3IgYnkgdGhlCi0JICogY29tcGxldGlvbiBvZiB0aGUgPGNvZGU+dmFsaWRhdGU8L2NvZGU+KSwgaW5jcmVtZW50IHRoZSBJUHJvZ3Jlc3NNb25pdG9yJ3Mgc3RhdHVzIGJ5IG9uZQotCSAqIChpLmUuLCBvbmUgcmVzb3VyY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgbGF1bmNoVmFsaWRhdG9yKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQlpZiAocmVwb3J0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZnVsbCBidWlsZCBtdXN0IGJlIHBlcmZvcm1lZCwgb3IgaWYgYSBkZWx0YQotCQkvLyBidWlsZCBpcyB0byBiZSBwZXJmb3JtZWQsIGlmIHRoZXJlIGFyZSBmaWxlcyB0byB2ZXJpZnkgZm9yIHRoYXQKLQkJLy8gdmFsaWRhdG9yLiAoSWYgaXQncyBkZWx0YSwgYnV0IHRoZXJlIGFyZSBubyBmaWxlcywgY2FsbGluZwotCQkvLyB2YWxpZGF0ZSBvbiB0aGF0IHZhbGlkYXRvciBzdGFydHMgYSBmdWxsIGJ1aWxkLCBpbnN0ZWFkIG9mIGp1c3QKLQkJLy8gcmV0dXJuaW5nLikKLQkJdHJ5IHsKLQkJCS8vIFZhbGlkYXRlIHRoZSByZXNvdXJjZTsgdGhpcyBzdGVwIHdpbGwgYWRkIGVycm9ycy93YXJuaW5ncyB0byB0aGUKLQkJCS8vIHRhc2sgbGlzdCwgYW5kIHJlbW92ZSBlcnJvcnMvd2FybmluZ3MgZnJvbSB0aGUgdGFzayBsaXN0LgotCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQkvLyBJbml0aWFsaXplIHRoZSAibG9hZFJ1bGVHcm91cCIgbWV0aG9kIHdpdGggdGhlIGdyb3VwIG9mCi0JCQkJLy8gcnVsZXMKLQkJCQkvLyB3aGljaCB0aGUgdmFsaWRhdG9yIHNob3VsZCB2YWxpZGF0ZS4KLQkJCQkoKFdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuc2V0UnVsZUdyb3VwKGdldFJ1bGVHcm91cCgpKTsKLQkJCX0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19TVEFSVElOR19WQUxJREFUSU9OLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQkJLy8gVGhpcyBpbnRlcm5hbCAibGF1bmNoZWQgdmFsaWRhdG9ycyIgdmFsdWUgaXMgdXNlZCBvbmx5IGluCi0JCQkJLy8gdGVzdHMuCi0JCQkJZ2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkuYWRkKHZtZCk7Ci0JCQl9Ci0JCQkvL2luaXRWYWxpZGF0ZUNvbnRleHQoZGVsdGEpOwotCQkJVmFsaWRhdG9yTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKS5zdGFydChoZWxwZXIsIHZhbGlkYXRvciwgcmVwb3J0ZXIpOwotCQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuSU5GTykpIHsKLQkJCQlUaW1lRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFRpbWVFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uLmxhdW5jaFZhbGlkYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0UHJvamVjdE5hbWUoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJZW50cnkuc2V0VG9vbE5hbWUodm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCQkJZW50cnkuc2V0RWxhcHNlZFRpbWUoZmluaXNoIC0gc3RhcnQpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJaWYgKGlzRnVsbFZhbGlkYXRlKCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIkVWRVJZVEhJTkciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGRlbHRhLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgiTk9USElORyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZ2V0RGVsdGFBc1N0cmluZyhkZWx0YSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVudHJ5LnNldERldGFpbHMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuSU5GTywgZW50cnkpOwotCQkJfQotCQkJbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT04sIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZXhjKSB7Ci0JCQl0aHJvdyBleGM7Ci0JCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBGaXJzdCwgc2VlIGlmIGEgdmFsaWRhdG9yIGp1c3QgY2F1Z2h0IGFsbCBUaHJvd2FibGVzIGFuZAotCQkJLy8gYWNjaWRlbnRhbGx5IHdyYXBwZWQgYSBNZXNzYWdlTGltaXRFeGNlcHRpb24gaW5zdGVhZCBvZgotCQkJLy8gcHJvcGFnYXRpbmcgaXQuCi0JCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNZXNzYWdlTGltaXRFeGNlcHRpb24pIHsKLQkJCQkJTWVzc2FnZUxpbWl0RXhjZXB0aW9uIG1zc2dFeGMgPSAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uKSBleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpOwotCQkJCQl0aHJvdyBtc3NnRXhjOwotCQkJCX0gZWxzZSBpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCXZleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IC8vIGZpcnN0LAotCQkJCQkvLyBzZXQKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIGNsYXNzCi0JCQkJCS8vIGxvYWRlciwKLQkJCQkJLy8gc28KLQkJCQkJLy8gdGhhdAotCQkJCQkvLyB0aGUKLQkJCQkJLy8gZXhjZXB0aW9uJ3MKLQkJCQkJLy8gZ2V0TWVzc2FnZSgpCi0JCQkJCS8vIG1ldGhvZAotCQkJCQkvLyBjYW4KLQkJCQkJLy8gcmV0cmlldmUKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIHJlc291cmNlCi0JCQkJCS8vIGJ1bmRsZQotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUKLQkJCS8vIGVycm9yIGFuZCBjb250aW51ZQotCQkJLy8gd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0JCQlleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IC8vIGZpcnN0LAotCQkJLy8gc2V0Ci0JCQkvLyB0aGUKLQkJCS8vIGNsYXNzCi0JCQkvLyBsb2FkZXIsCi0JCQkvLyBzbwotCQkJLy8gdGhhdAotCQkJLy8gdGhlCi0JCQkvLyBleGNlcHRpb24ncwotCQkJLy8gZ2V0TWVzc2FnZSgpCi0JCQkvLyBtZXRob2QKLQkJCS8vIGNhbgotCQkJLy8gcmV0cmlldmUKLQkJCS8vIHRoZQotCQkJLy8gcmVzb3VyY2UKLQkJCS8vIGJ1bmRsZQotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24udmFsaWRhdGUoV29ya2JlbmNoTW9uaXRvcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1lc3NhZ2UpOwotCQkJaWYgKGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGlzIHBhcnRpY3VsYXIgdmFsaWRhdG9yLCBsb2cgdGhlCi0JCQkvLyBlcnJvciBhbmQgY29udGludWUKLQkJCS8vIHdpdGggdGhlIG5leHQgdmFsaWRhdG9yLgotCQkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvcgotCQkJLy8gQ2xhc3NDYXN0LCBkaXNwbGF5IGl0IHdpdGggdGhlICJBIHJ1bnRpbWUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAotCQkJLy8gIiBtZXNzc2FnZS4KLQkJCS8vIFRoaXMgd2lsbCBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUgY2FsbHMKLQkJCS8vIElCTSBTZXJ2aWNlLgotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24udmFsaWRhdGUoV29ya2JlbmNoTW9uaXRvcikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJCVN0cmluZyBtc3NnID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTl9BQk5PUk1BTExZLCBuZXcgU3RyaW5nW117Z2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCl9KTsKLQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCi0JCQkvKgotCQkJIFRoZSBjb2RlICBiZWxvdyAgY2F1c2VzIGJ1bmRsZSBub3QgZm91bmQgZXhjZXB0aW9uIHNpbmNlLCB0aGUgIGJ1bmRsZSBoZXJlIGlzCi0JCQkgdmFsaWRhdGVfYmFzZSBhbmQgd2UgIGFyZSAgdHJ5aW5nIHRvIGxvYWQgdGhhdCBidW5kbGUgZnJvbSB0aGUgY2xhc3Nsb2FkZXIgb2YgCi0JCQkgdGhlIFZhbGlkYXRvci4gCi0JCQkgCi0JCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAotCQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0JCQltZXNzYWdlLnNldFBhcmFtcyhtc2dQYXJtKTsKLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodmFsaWRhdG9yLCBtZXNzYWdlKTsKLQkJCSovCi0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gSWYgYSBydW50aW1lIGV4Y2VwdGlvbiBoYXMgb2NjdXJlZCwgZS5nLiBOdWxsUG9pbnRlciBvcgotCQkJCS8vIENsYXNzQ2FzdCwgZGlzcGxheSBpdCB3aXRoIHRoZSAiQSBydW50aW1lIGV4Y2VwdGlvbiBoYXMKLQkJCQkvLyBvY2N1cnJlZCAiIG1lc3NzYWdlLgotCQkJCS8vIFRoaXMgd2lsbCBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgd2hlbiBoZS9zaGUKLQkJCQkvLyBjYWxscyBJQk0gU2VydmljZS4KLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uT3BlcmF0aW9uOjpsYXVuY2hWYWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQkKLQkJCQkvKgotCQkJIFRoZSBjb2RlICBiZWxvdyAgY2F1c2VzIGJ1bmRsZSBub3QgZm91bmQgZXhjZXB0aW9uIHNpbmNlLCB0aGUgIGJ1bmRsZSBoZXJlIGlzCi0JCQkgdmFsaWRhdGVfYmFzZSBhbmQgd2UgIGFyZSAgdHJ5aW5nIHRvIGxvYWQgdGhhdCBidW5kbGUgZnJvbSB0aGUgY2xhc3Nsb2FkZXIgb2YgCi0JCQkgdGhlIFZhbGlkYXRvci4gIAotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCQltZXNzYWdlLnNldFBhcmFtcyhtc2dQYXJtKTsKLQkJCQl0cnkgewotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJCi0JCQkJKi8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWhlbHBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJCX0gY2F0Y2ggKE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIElmIGEgcnVudGltZSBleGNlcHRpb24gaGFzIG9jY3VyZWQsIGUuZy4gTnVsbFBvaW50ZXIgb3IKLQkJCQkvLyBDbGFzc0Nhc3QsIGRpc3BsYXkgaXQgd2l0aCB0aGUgIkEgcnVudGltZSBleGNlcHRpb24gaGFzCi0JCQkJLy8gb2NjdXJyZWQgIiBtZXNzc2FnZS4KLQkJCQkvLyBUaGlzIHdpbGwgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHdoZW4gaGUvc2hlCi0JCQkJLy8gY2FsbHMgSUJNIFNlcnZpY2UuCi0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvbk9wZXJhdGlvbjo6bGF1bmNoVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyoKLQkJCSBUaGUgY29kZSAgYmVsb3cgYnVuZGxlIG5vdCBmb3VuZCBleGNlcHRpb24gc2luY2UsIHRoZSAgYnVuZGxlIGhlcmUgaXMKLQkJCSB2YWxpZGF0ZV9iYXNlIGFuZCB3ZSAgYXJlICB0cnlpbmcgdG8gbG9hZCB0aGF0IGJ1bmRsZSBmcm9tIHRoZSBjbGFzc2xvYWRlciBvZiAKLQkJCSB0aGUgVmFsaWRhdG9yLiAKLQkJCSAJCQkJIAotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0JCQkJTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdGlvblBsdWdpbi5nZXRNZXNzYWdlKCk7Ci0JCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLQkJCQltZXNzYWdlLnNldFBhcmFtcyhtc2dQYXJtKTsKLQkJCQl0cnkgewotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCQkJfSBjYXRjaCAoTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJKi8KLQkJCQlyZXR1cm47Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vIE5vdyB0aGF0IGNsZWFudXAgaGFzIGJlZW4gY2FsbGVkLCBzZXQgdGhlIHByb2plY3QgdG8gbnVsbC4KLQkJCQkvLyBUaGlzIHByb2plY3QncwotCQkJCS8vIHJlc291cmNlcyBoYXZlIGJlZW4gZnJlZWQgc28gdGhpcyBwcm9qZWN0IHNob3VsZCBhbHNvIGJlCi0JCQkJLy8gY2xlYXJlZCBvbiB0aGUgaGVscGVyLgotCQkJCS8vIElmIGl0IGlzbid0IHNldCB0byBudWxsLCB0aGVuIHRoZSBuZXh0IHRpbWUgdGhhdCB0aGUgaGVscGVyCi0JCQkJLy8gaXMgcmV0cmlldmVkIGZyb20KLQkJCQkvLyB0aGUgVmFsaWRhdG9yTWV0YURhdGEsIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGlzCi0JCQkJLy8gcHJvamVjdCwgaW4gdGhlCi0JCQkJLy8gaGVscGVyJ3MgaW5pdGlhbGl6ZSBtZXRob2QsIHdpbGwgbm90IGJlIHJlYWxsb2NhdGVkIGlmIHRoZQotCQkJCS8vIHByb2plY3QgaXMgdGhlIHNhbWUuCi0JCQkJaGVscGVyLnNldFByb2plY3QobnVsbCk7Ci0JCQl9Ci0JCQkvLyBUZWxsIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgd2UndmUgY29tcGxldGVkIG4gdW5pdHMgb2Ygd29yawotCQkJLy8gKGkuZS4sIG4gcmVzb3VyY2VzIHZhbGlkYXRlZCBieSBvbmUgdmFsaWRhdG9yKS4KLQkJCXJlcG9ydGVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgoKGRlbHRhID09IG51bGwpID8gMSA6IGRlbHRhLmxlbmd0aCkpOyAvLyBPbmUKLQkJCS8vIHVuaXQKLQkJCS8vIG9mCi0JCQkvLyB3b3JrCi0JCQkvLyA9IDEKLQkJCS8vIChpLmUuLAotCQkJLy8gMQotCQkJLy8gcmVzb3VyY2UpCi0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgUnVubmFibGUgd3JhcEluUnVubmFibGUoZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsIGZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBmaW5hbCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIGZpbmFsIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgZmluYWwgSUZpbGVEZWx0YVtdIGRlbHRhLCBmaW5hbCBJdGVyYXRvciBpdGVyYXRvcikgewotLy8JCS8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IFJ1bm5hYmxlIGVhY2ggdGltZSBiZWNhdXNlIHNldmVyYWwgUnVubmFibGUKLS8vCQkvLyBpbnN0YW5jZXMgbWF5IGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuCi0vLwkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUHJvamVjdFJ1bm5hYmxlKHJlcG9ydGVyLCB2YWxpZGF0b3IsIHZtZCwgaGVscGVyLCBkZWx0YSwgaXRlcmF0b3IpOwotLy8JCXJldHVybiBydW5uYWJsZTsKLS8vCX0KLQotCS8qCi0JICogLy8gRm9yIGNvbnZlbmllbmNlLCBrZWVwIHRoaXMgbWV0aG9kIGluIHRoZSBjbGFzcyBidXQgY29tbWVudGVkIG91dC4gLy8gV2hlbiBhc3luYyBuZWVkcyB0bwotCSAqIGJlIHRlc3RlZCwgdGhpcyBtZXRob2QgbWF5IGJlIG5lZWRlZCBhZ2Fpbi4gcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgcHJlZml4LAotCSAqIElXb3JrYmVuY2hDb250ZXh0IGhlbHBlcikgeyBJUHJvamVjdCBoUHJvamVjdCA9IGhlbHBlci5nZXRQcm9qZWN0KCk7IFN5c3RlbS5lcnIucHJpbnRsbihwcmVmaXggKwotCSAqICJTdGFydCBWYWxpZGF0aW9uT3BlcmF0aW9uICIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOjoiICsgaFByb2plY3QuZ2V0TmFtZSgpKTsKLQkgKiBpZiggVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkuZXF1YWxzKCJWYWxpZGF0aW9uVGhyZWFkIikgJiYKLQkgKiAoaFByb2plY3QuZ2V0TmFtZSgpLmluZGV4T2YoIm5vRm9yayIpID4gLTEpKSB7IFRocmVhZC5kdW1wU3RhY2soKTsgfSBlbHNlCi0JICogaWYoKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKS5lcXVhbHMoIlZhbGlkYXRpb25UaHJlYWQiKSkgJiYKLQkgKiAoaFByb2plY3QuZ2V0TmFtZSgpLmluZGV4T2YoImZvcmsiKSA+IC0xKSkgeyBUaHJlYWQuZHVtcFN0YWNrKCk7IH0gU3lzdGVtLmVyci5wcmludGxuKHByZWZpeCArCi0JICogIkVuZCBWYWxpZGF0aW9uT3BlcmF0aW9uIik7IH0KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUHJvamVjdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIFdvcmtiZW5jaFJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQkJcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kID0gbnVsbDsKLS8vCQlwcml2YXRlIElWYWxpZGF0aW9uQ29udGV4dCBfaGVscGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBJRmlsZURlbHRhW10gX19kZWx0YSA9IG51bGw7Ci0KLQkJcHVibGljIFByb2plY3RSdW5uYWJsZShXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBJRmlsZURlbHRhW10gZGVsdGEsIEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0JCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJCV92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCQlfdm1kID0gdm1kOwotLy8JCQlfaGVscGVyID0gaGVscGVyOwotCQkJX19kZWx0YSA9IGRlbHRhOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlpbnRlcm5hbFZhbGlkYXRlKF9yZXBvcnRlciwgX3ZhbGlkYXRvciwgX3ZtZCwgY29udGV4dCxfX2RlbHRhKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIFVzZXIgY2FuJ3QgY2FuY2VsIGEgam9iIGluIGEgYmFja2dyb3VuZCB0aHJlYWQsIHNvIGlnbm9yZQotCQkJCS8vIHRoaXMgZXhjZXB0aW9uLgotCQkJfQotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gX3JlcG9ydGVyLmdldFByb2plY3QoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGV4dC4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRpb25Db250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0Jdm9pZCBsYXVuY2hKb2JzKEhhc2hTZXQgdmFsaWRhdG9ycywgZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbnsKLQkJCi0JCWZpbmFsIExvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbnVsbDsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQlJV29ya2JlbmNoQ29udGV4dCB3b3JrYmVuY2hjb250ZXh0ID0gbnVsbDsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCi0JCQl2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQlkZWx0YSA9IGdldEZpbGVEZWx0YXMocmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIHZtZCk7Ci0JCQkJYm9vbGVhbiB3aWxsUnVuID0gKGlzRm9yY2UoKSB8fCBpc1ZhbGlkYXRpb25OZWNlc3Nhcnkodm1kLCBkZWx0YSkpOwotCQkJCWlmICghd2lsbFJ1bikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ubGF1bmNoSm9icygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCQkJCQotCQkJCS8qCi0JCQkgVGhlIGNvZGUgIGJlbG93ICBjYXVzZXMgYnVuZGxlIG5vdCBmb3VuZCBleGNlcHRpb24gc2luY2UsIHRoZSAgYnVuZGxlIGhlcmUgaXMKLQkJCSB2YWxpZGF0ZV9iYXNlIGFuZCB3ZSAgYXJlICB0cnlpbmcgdG8gbG9hZCB0aGF0IGJ1bmRsZSBmcm9tIHRoZSBjbGFzc2xvYWRlciBvZiAKLQkJCSB0aGUgVmFsaWRhdG9yLiAKLQkJCSAgCi0JCQkJU3RyaW5nW10gbXNnUGFybSA9IHtleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpLCAoZXhjLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBleGMuZ2V0TWVzc2FnZSgpKX07IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodmFsaWRhdG9yLCBtZXNzYWdlKTsKLQkJCQkqLwotCQkJCQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXZhbGlkYXRvciA9IHZtZC5jcmVhdGVWYWxpZGF0b3IoKTsKLQkJCQl3b3JrYmVuY2hjb250ZXh0ID0gdm1kLmNyZWF0ZUhlbHBlciggZ2V0UHJvamVjdCgpICk7Ci0JCQkJaW5pdFZhbGlkYXRlQ29udGV4dCggZGVsdGEsIHdvcmtiZW5jaGNvbnRleHQgKTsKLQkJCQl2bWQuYWRkSGVscGVyKChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvciwgd29ya2JlbmNoY29udGV4dCk7CQkJCQotCQkJCWNoZWNrQ2FuY2VsZWQocmVwb3J0ZXIpOwotCQkJCQotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ubGF1bmNoSm9icygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJY2hlY2tDYW5jZWxlZChyZXBvcnRlcik7Ci0JCQkJcmVtb3ZlT2xkTWVzc2FnZXMocmVwb3J0ZXIsIHZhbGlkYXRvciwgdm1kLCBkZWx0YSk7Ci0JCQkJCi0JCQkJaWYoIHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCQkJbGF1bmNoVmFsaWRhdG9ySm9iKCByZXBvcnRlciwgKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yLCB2bWQsIHdvcmtiZW5jaGNvbnRleHQsIGRlbHRhKTsKLQkJCQl9Ci0KLQkJCQkKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4YykgewotCQkJCXRocm93IGV4YzsKLQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRpb25PcGVyYXRpb24ubGF1bmNoSm9icygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksIG5ldyBTdHJpbmdbXXtnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKG1zc2cpOwotCi0JCQkJLyoKLQkJCQkgVGhlIGNvZGUgIGJlbG93ICBjYXVzZXMgYnVuZGxlIG5vdCBmb3VuZCBleGNlcHRpb24gc2luY2UsIHRoZSAgYnVuZGxlIGhlcmUgaXMKLQkJCQkgdmFsaWRhdGVfYmFzZSBhbmQgd2UgIGFyZSAgdHJ5aW5nIHRvIGxvYWQgdGhhdCBidW5kbGUgZnJvbSB0aGUgY2xhc3Nsb2FkZXIgb2YgCi0JCQkJIHRoZSBWYWxpZGF0b3IuIAotCQkJCSAqLwotCQkJCSAKLS8vCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7ZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgKGV4Yy5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiIDogZXhjLmdldE1lc3NhZ2UoKSl9OyAvLyROT04tTkxTLTEkCi0vLwkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLS8vCQkJCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLS8vCQkJCW1lc3NhZ2Uuc2V0SWQoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19SVU5USU1FKTsKLS8vCQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotLy8JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBJZiB1c2VyIGZpeGVzIHByb2JsZW0sIGFuZCBsaW1pdCBleGNlZWRlZCwgYWRkICJleGNlZWRlZCIKLQkJCQkvLyBtZXNzYWdlLCBvcgotCQkJCS8vIGlmIGxpbWl0IG5vdCBleGNlZWRlZCBhbnkgbW9yZSwgcmVtb3ZlICJleGNlZWRlZCIgbWVzc2FnZS4KLQkJCQlyZXBvcnRlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJCQkKLQkJCQkKLQkJCi0KLQl9Ci0JCi0JCi0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFZhbGlkYXRlQ29udGV4dChJRmlsZURlbHRhW10gZGVsdGEsIElXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgKSB7Ci0JCSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCSAoKFdvcmtiZW5jaENvbnRleHQpY29udGV4dCkuc2V0VmFsaWRhdGlvbkZpbGVVUklzKG5ldyBBcnJheUxpc3QoKSk7Ci0JCQkgZm9yKGludCBpID0gMDsgaSA8IGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJIElGaWxlRGVsdGEgZmlsZSA9IGRlbHRhW2ldOwotCQkJCSBpZihmaWxlLmdldERlbHRhVHlwZSgpICE9IElGaWxlRGVsdGEuREVMRVRFRCApIHsKLQkJCQkJICgoV29ya2JlbmNoQ29udGV4dCljb250ZXh0KS5nZXRWYWxpZGF0aW9uRmlsZVVSSXMoKS5hZGQoZmlsZS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkgfQotCQkJIH0gCi0JCX0KLQl9Ci0JCQkKLQkJCQotCXByaXZhdGUgZmluYWwgdm9pZCBsYXVuY2hWYWxpZGF0b3JKb2IoV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIsCi0JCQkJICAgSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwKLQkJCQkgICBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElGaWxlRGVsdGFbXSBkZWx0YSkgewotCQkKLQkJaWYgKHJlcG9ydGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljaGVja0NhbmNlbGVkKHJlcG9ydGVyKTsKLQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0KLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIFdvcmtiZW5jaENvbnRleHQpIHsKLQkJCSgoV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5zZXRSdWxlR3JvdXAoZ2V0UnVsZUdyb3VwKCkpOwotCQl9Ci0JCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJLy8gVGhpcyBpbnRlcm5hbCAibGF1bmNoZWQgdmFsaWRhdG9ycyIgdmFsdWUgaXMgdXNlZCBvbmx5IGluCi0JCQkvLyB0ZXN0cy4KLQkJCWdldExhdW5jaGVkVmFsaWRhdG9ycygpLmFkZCh2bWQpOwotCQl9Ci0JCQotCQlWYWxpZGF0b3JKb2IgdmFsaWRhdG9yam9iID0gbmV3IFZhbGlkYXRvckpvYiggdmFsaWRhdG9yLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSwKLQkJCQkJaGVscGVyLmdldFByb2plY3QoKSwgaGVscGVyICk7Ci0KLQotCQlJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUgPSB2YWxpZGF0b3IuZ2V0U2NoZWR1bGluZ1J1bGUoaGVscGVyKTsKLQkJdmFsaWRhdG9yam9iLnNldFJ1bGUoIHNjaGVkdWxpbmdSdWxlICk7CQkKLQkJUXVhbGlmaWVkTmFtZSB2YWxpZGF0b3JLZXkgPSBuZXcgUXVhbGlmaWVkTmFtZShudWxsLCAiVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJdmFsaWRhdG9yam9iLnNldFByb3BlcnR5KCB2YWxpZGF0b3JLZXksIHZhbGlkYXRvciApOwotCQl2YWxpZGF0b3Jqb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoCi0JCQkJCW5ldyBKb2JDaGFuZ2VBZGFwdGVyKCl7Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KXsKLQkJCQkJCQlKb2Igam9iID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQkJCQkJUXVhbGlmaWVkTmFtZSB2YWxpZGF0b3JLZXkgPSBuZXcgUXVhbGlmaWVkTmFtZShudWxsLCAiVmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciA9IChJVmFsaWRhdG9ySm9iKWpvYi5nZXRQcm9wZXJ0eSggdmFsaWRhdG9yS2V5ICk7Ci0JCQkJCQkJVmFsaWRhdG9yTWFuYWdlciBtZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQkJCQkJCQlmaW5hbCBBcnJheUxpc3QgbGlzdCA9IG1nci5nZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwkJCQkJCQkKLQkJCQkJCQkKLQkJCQkJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCQkJCQkgICAgCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQkJCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJCQkJCQkJCU1lc3NhZ2VJbmZvIGluZm8gPSAoTWVzc2FnZUluZm8paXQubmV4dCgpOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCi0JCQkJCQkJCQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2soIGluZm8uZ2V0TWVzc2FnZU93bmVySWQoKSwgaW5mby5nZXRSZXNvdXJjZSgpLAotCQkJCQkJCQkJCQkJaW5mby5nZXRMb2NhdGlvbigpLCBpbmZvLmdldE1zZygpLmdldElkKCksIGluZm8uZ2V0VGV4dCgpLAotCQkJCQkJCQkJCQkJaW5mby5nZXRNc2coKS5nZXRTZXZlcml0eSgpLAotCQkJCQkJCQkJCQkJaW5mby5nZXRNYXJrZXJJZCgpLAotCQkJCQkJCQkJCQkJaW5mby5nZXRUYXJnZXRPYmplY3ROYW1lKCksCi0JCQkJCQkJCQkJCQlpbmZvLmdldE1zZygpLmdldEdyb3VwTmFtZSgpLAotCQkJCQkJCQkJCQkJaW5mby5nZXRNc2coKS5nZXRPZmZzZXQoKSwKLQkJCQkJCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQkJCQotCQkJCQkJCQkJCQotCQkJCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCSAgICB9Ci0JCQkJCQkJfTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQkKLQkJCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCSAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCW1nci5jbGVhck1lc3NhZ2VzKCB2YWxpZGF0b3IgKTsKLQkJCQkJCQl2YWxpZGF0b3IgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCSk7Ci0JCXZhbGlkYXRvcmpvYi5zZXRQcmlvcml0eShKb2IuREVDT1JBVEUpOwotCi0JCVZhbGlkYXRpb25MYXVuY2hlckpvYiB2YWxpZGF0aW9uTGF1bmNoZXJKb2IgPSBuZXcgVmFsaWRhdGlvbkxhdW5jaGVySm9iKHZhbGlkYXRvcmpvYik7Ci0JCXZhbGlkYXRpb25MYXVuY2hlckpvYi5zY2hlZHVsZSgpOwotCQkKLQkJLy92YWxpZGF0b3Jqb2Iuc2NoZWR1bGUoKTsJCQotCQkKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25VdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyM2IyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB2YWxpZGF0b3JzIGFuZCBjb2RlIG91dHNpZGUKLSAqIG9mIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25VdGlsaXR5IHsKLQkvL1RPRE8gTWFrZSB0aGUgVmFsaWRhdGlvblV0aWxpdHkgY29uc3RydWN0b3IgcHJpdmF0ZSBpbiBNaWxlc3RvbmUgNC4KLQotCS8qKgotCSAqIEdpdmVuIGFuIElSZXNvdXJjZSBhbmQgb25lIG9mIHRoZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuU2V2ZXJ0eUVudW0gY29uc3RhbnRzLAotCSAqIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZXMgb2YgdGhlIHZhbGlkYXRvcnMgd2hpY2ggaGF2ZQotCSAqIHJlcG9ydGVkIG1lc3NhZ2VzLCBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHksIGFnYWluc3QgdGhlIHJlc291cmNlIGFuZCB0aGUgcmVzb3VyY2UncyBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGxpc3RWYWxpZGF0b3JDbGFzc2VzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5KSB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgc2V2ZXJpdHkpOwotCQlpZiAoKG1hcmtlcnMgPT0gbnVsbCkgfHwgKG1hcmtlcnMubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCVNldCB0ZW1wU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQl0cnkgewotCQkJCU9iamVjdCBvd25lciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIgdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdGVtcFNldC5hZGQob3duZXIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uVXRpbGl0eS5saXN0VmFsaWRhdG9yQ2xhc3NlcygiICsgcmVzb3VyY2UuZ2V0TmFtZSgpICsgIiwgIiArIHNldmVyaXR5KTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJaWYgKHRlbXBTZXQuc2l6ZSgpID4gMCkgewotCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1t0ZW1wU2V0LnNpemUoKV07Ci0JCQl0ZW1wU2V0LnRvQXJyYXkocmVzdWx0KTsKLQkJCXRlbXBTZXQuY2xlYXIoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBpbnN0YW5jZSBtZXRob2Qgd2lsbCBiZSBtYWRlIHN0YXRpYyBpbiBNaWxlc3RvbmUgNC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNFbmFibGVkKHByb2plY3QsIG5ldyBTdHJpbmdbXXt2YWxpZGF0b3JDbGFzc05hbWV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIHZhbGlkYXRvcnMsIGlkZW50aWZpZWQgYnkgdGhlaXIgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWVzLCBhcmUKLQkgKiBlbmFibGVkIG9uIHRoZSBwcm9qZWN0LiBJZiBhIHZhbGlkYXRvciBpc24ndCBlbmFibGVkLCBvciBpZiB0aGVyZSdzIGFuIGludGVybmFsIGVycm9yIHdoaWxlCi0JICogcmV0cmlldmluZyB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24sIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHZhbGlkYXRvckNsYXNzTmFtZXMpIHsKLQkJaWYgKCh2YWxpZGF0b3JDbGFzc05hbWVzID09IG51bGwpIHx8ICh2YWxpZGF0b3JDbGFzc05hbWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvckNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXByanAuaXNFbmFibGVkKHZhbGlkYXRvckNsYXNzTmFtZXNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uVXRpbGl0eTo6aXNFbmFibGVkKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIsIFN0cmluZ1tdKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvckpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE5OGIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0b3JKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvckpvYiBleHRlbmRzIEpvYiB7Ci0KLQotCXByaXZhdGUgSVByb2plY3QJCQlwcm9qZWN0OwotCXByaXZhdGUgSVdvcmtiZW5jaENvbnRleHQgCWhlbHBlcjsKLQlwcml2YXRlIElWYWxpZGF0b3JKb2IJCXZhbGlkYXRvcjsKLQkKLQlwdWJsaWMgVmFsaWRhdG9ySm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkgICAKLQlwdWJsaWMgVmFsaWRhdG9ySm9iKCBJVmFsaWRhdG9ySm9iIHZhbGlkYXRvciwgU3RyaW5nIGRpc3BsYXlOYW1lLCBTdHJpbmcgbmFtZSwgSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYUhlbHBlciAgKXsKLQkJc3VwZXIoZGlzcGxheU5hbWUpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLmhlbHBlciA9IGFIZWxwZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQkKLQkvL3JldmlzaXQgcmVwb3J0ZXIgaW4gdGhlIGNvZGUgIGJlbG93Ci0JLy9zdWJ0YXNrIGluZm9ybWF0aW9uIGlzIGRpc3BsYXllZCBpbiB0aGUgbW9uaXRvciBjcmVhdGVkIGJ5IHRoZSBKb2IKLQkvL2Vycm9yIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIGJ5IHRoZSBJUmVwb3J0ZXIKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soIlZhbGlkYXRpbmciLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCUlTdGF0dXMgc3RhdHVzID0gSVZhbGlkYXRvckpvYi5PS19TVEFUVVM7Ci0JCVdvcmtiZW5jaFJlcG9ydGVyCXJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKCBwcm9qZWN0LCBtb25pdG9yICk7Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCQotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQotCQl0cnkgewotCi0JCQlTdHJpbmcgbWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKAotCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfU1RBUlRJTkdfVkFMSURBVElPTiwKLQkJCQluZXcgU3RyaW5nW117aGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQotCQkKLQkJCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZUluSm9iKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkKLQkJCS8vdG8gcmVtb3ZlLCBpZiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSB2YWxpZGF0b3IsIHRoZSBqb2Igc3RheXMgYmFjayBpbiB0aGUgVUkuLi4KLQkJCS8vc2hvdWxkIHdlIGV2ZW4gcmV0dXJuIGVycm9yIHN0YXR1cyBpZiBlcnJvciBpcyBmb3VuZCBpbiB0aGUgdmFsaWRhdG9yCi0JCQkvL3N0YXR1cyA9IElWYWxpZGF0b3JKb2IuT0tfU1RBVFVTOwkKLQkJCQotCQkJCi0JCQkKLQkJCW1lc3NhZ2UgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQkJUmVzb3VyY2VDb25zdGFudHMuVkJGX1NUQVRVU19FTkRJTkdfVkFMSURBVElPTiwKLQkJCQkJbmV3IFN0cmluZ1tde2hlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKX0pOwotCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotIAotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IGV4YzsKLQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIEZpcnN0LCBzZWUgaWYgYSB2YWxpZGF0b3IganVzdCBjYXVnaHQgYWxsIFRocm93YWJsZXMgYW5kCi0JCQkvLyBhY2NpZGVudGFsbHkgd3JhcHBlZCBhIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbiBpbnN0ZWFkIG9mCi0JCQkvLyBwcm9wYWdhdGluZyBpdC4KLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJVmFsaWRhdGlvbkV4Y2VwdGlvbiB2ZXhjID0gKFZhbGlkYXRpb25FeGNlcHRpb24pIGV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCXZleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7IAotCQkJCX0KLQkJCX0KLQkJCS8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFydGljdWxhciB2YWxpZGF0b3IsIGxvZyB0aGUKLQkJCS8vIGVycm9yIGFuZCBjb250aW51ZQotCQkJLy8gd2l0aCB0aGUgbmV4dCB2YWxpZGF0b3IuCi0JCQlleGMuc2V0Q2xhc3NMb2FkZXIodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0b3JKb2IucnVuKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQlpZiAoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoCi0JCQkJCQlSZXNvdXJjZUNvbnN0YW50cy5WQkZfU1RBVFVTX0VORElOR19WQUxJREFUSU9OX0FCTk9STUFMTFksCi0JCQkJCQluZXcgU3RyaW5nW117aGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCWlmIChleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh2YWxpZGF0b3IsIGV4Yy5nZXRBc3NvY2lhdGVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRvckpvYi5ydW4oKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCUlTdGF0dXMgc3RhdCA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCSAgICAJCSAgICAgIFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgZXhjICk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIHN0YXQpOwotCQkJCQotCQkJfQotCQkJU3RyaW5nIG1zc2cgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZSgKLQkJCQkJCVJlc291cmNlQ29uc3RhbnRzLlZCRl9TVEFUVVNfRU5ESU5HX1ZBTElEQVRJT05fQUJOT1JNQUxMWSwKLQkJCQkJCW5ldyBTdHJpbmdbXXtoZWxwZXIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgfSk7Ci0JCQkKLQkJCW1vbml0b3Iuc3ViVGFzayhtc3NnKTsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl2YWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0b3JKb2IucnVuKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCQltZXNzYWdlLnNldFNldmVyaXR5KElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCQkJbWVzc2FnZS5zZXRJZChSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX1JVTlRJTUUpOwotCQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwkJCQkKLQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZS5nZXRUZXh0KCkpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWhlbHBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJCQkJdm1kLnJlbW92ZUhlbHBlciggdmFsaWRhdG9yICk7Ci0JCQkJfWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRvckpvYi5ydW4oKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0ge2V4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCksIChleGMuZ2V0TWVzc2FnZSgpID09IG51bGwgPyAiIiA6IGV4Yy5nZXRNZXNzYWdlKCkpfTsgLy8kTk9OLU5MUy0xJAotCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBWYWxpZGF0aW9uUGx1Z2luLmdldE1lc3NhZ2UoKTsKLQkJCQkJbWVzc2FnZS5zZXRTZXZlcml0eShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpOwotCQkJCQltZXNzYWdlLnNldElkKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfUlVOVElNRSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0UGFyYW1zKG1zZ1Bhcm0pOwotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHZhbGlkYXRvciwgbWVzc2FnZSk7Ci0JCi0JCQkJCXN0YXR1cyA9IFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLmdldFRleHQoKSk7CQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWhlbHBlci5zZXRQcm9qZWN0KG51bGwpOwotCQkJCQl2bWQucmVtb3ZlSGVscGVyKCB2YWxpZGF0b3IgKTsKLQkJCQkJaGVscGVyID0gbnVsbDsKLQkJCQkJcmVwb3J0ZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCS8vcmVwb3J0ZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKCgoZGVsdGEgPT0gbnVsbCkgPyAxIDogZGVsdGEubGVuZ3RoKSk7IC8vIE9uZQotCQkJLy9tb25pdG9yLndvcmtlZCgoKGRlbHRhID09IG51bGwpID8gMSA6IGRlbHRhLmxlbmd0aCkpOyAvLyBPbmUKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJcmV0dXJuIChwcm9qZWN0LmdldE5hbWUoKSArIFZhbGlkYXRvck1hbmFnZXIuVkFMSURBVE9SX0pPQl9GQU1JTFkpLmVxdWFscyhmYW1pbHkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0M2QzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIEEgY2VudHJhbGlzZWQgY2xhc3MgZm9yIGFjY2Vzc2luZyB2YWxpZGF0aW9uIG1ldGFkYXRhLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG91dHNpZGUgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdG9yTWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0pPQl9GQU1JTFkgPSAidmFsaWRhdG9ycyI7CSAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRvck1hbmFnZXIgaW5zdDsKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2VVdGlsIF9yZXNvdXJjZVV0aWw7IC8vIGEgY29tbW9uIHV0aWxpdHksIGRpZmZlcmVudCB3aGV0aGVyIG9yIG5vdAotCS8vIFdTQUQgaXMgcnVubmluZyBpbiBoZWFkbGVzcyBvciBVSSBtb2RlLAotCS8vIHdoaWNoIGNhbiByZXRyaWV2ZSB0aGUgbGluZSBudW1iZXIgb2Ygc29tZQotCS8vIE1PRiBvYmplY3RzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIFJFU09VUkNFVVRJTF9ERUZBVUxUQ0xBU1MgPSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkRlZmF1bHRSZXNvdXJjZVV0aWwuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgX3Jlc291cmNlVXRpbENsYXNzID0gUkVTT1VSQ0VVVElMX0RFRkFVTFRDTEFTUzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgRU1QVFlfU0VUID0gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOyAvLyBhbiBlbXB0eSBzZXQsIHByb3ZpZGVkIGZvcgotCS8vIGNvbnZlbmllbmNlLCBzbyB0aGF0IHdlIG9ubHkKLQkvLyBjb25zdHJ1Y3Qgb25lIGVtcHR5IHNldCBvbmNlLgotCXByaXZhdGUgU2V0IF9zdXNwZW5kZWRQcm9qZWN0czsKLQlwcml2YXRlIGJvb2xlYW4gX3N1c3BlbmRBbGxWYWxpZGF0aW9uID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgX21lc3NhZ2VMaW1pdE93bmVyOwotCXByaXZhdGUgU3RyaW5nW10gX2ludGVybmFsT3duZXJzOwotCXByaXZhdGUgTWFwIHZhbGlkYXRvck1zZ3MgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwKCkgKTsJCi0JcHJpdmF0ZSBTZXQgcHJvYmxlbVZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOwkKLQkKLQlwcml2YXRlIFZhbGlkYXRvck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9zdXNwZW5kZWRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCV9pbnRlcm5hbE93bmVycyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkJYWRkSW50ZXJuYWxPd25lcihnZXRNZXNzYWdlTGltaXRPd25lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNhYmxlIGFsbCB2YWxpZGF0b3JzIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LCBhbmQgZG9lcyBub3QgdG91Y2ggdGhlIGF1dG8tdmFsaWRhdGUgc2V0dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlQWxsVmFsaWRhdG9ycyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIERpc2FibGUgdGhlIGluZGl2aWR1YWwgdmFsaWRhdG9ycwotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhjdXJyZW50UHJvamVjdCwgRU1QVFlfU0VULCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVWYWxpZGF0b3IoU3RyaW5nIHZhbGlkYXRvcklkKSB7Ci0KLQkJdHJ5IHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKQotCQkJCQkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9ySWQpOwotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKQotCQkJCQkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJZ2YuZW5hYmxlU2luZ2xlVmFsaWRhdG9yKHZtZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRpc2FibGVWYWxpZGF0b3IoU3RyaW5nIHZhbGlkYXRvcklkKXsKLQotCQl0cnkgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpCi0JCQkJCS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdmID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpCi0JCQkJCS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlnZi5kaXNhYmxlU2luZ2xlVmFsaWRhdG9yKHZtZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIGVuYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbiwgYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pIHsKLQotCQkKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlwcmpwLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkKLQkJCQkJLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJCQotCQkJaWYobWFudWFsVmFsaWRhdGlvbil7Ci0JCQkJcHJqcC5lbmFibGVTaW5nbGVNYW51YWxWYWxpZGF0b3Iodm1kKTsKLQkJCX0gCi0JCQlpZiAoYnVpbGRWYWxpZGF0aW9uKXsKLQkJCQlwcmpwLmVuYWJsZVNpbmdsZUJ1aWxkVmFsaWRhdG9yKHZtZCk7Ci0JCQl9Ci0JCQlwcmpwLnN0b3JlKCk7Ci0JCQkKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9ySWQsIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gbWFudWFsVmFsaWRhdGlvbiwgYm9vbGVhbiBidWlsZFZhbGlkYXRpb24pewotCi0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcHJqcC5zZXREb2VzUHJvamVjdE92ZXJyaWRlKHRydWUpOwotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpCi0JCQkJCS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JJZCk7Ci0JCQkKLQkJCWlmKG1hbnVhbFZhbGlkYXRpb24pewotCQkJCXByanAuZGlzYWJsZVNpbmdsZU1hbnVhbFZhbGlkYXRvcih2bWQpOwotCQkJfSAKLQkJCWlmIChidWlsZFZhbGlkYXRpb24pewotCQkJCXByanAuZGlzYWJsZVNpbmdsZUJ1aWxkVmFsaWRhdG9yKHZtZCk7Ci0JCQl9Ci0JCQlwcmpwLnN0b3JlKCk7Ci0JCQkKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JCi0JLyoqCi0JICogR2l2ZW4gYW4gSVByb2plY3QsIGlmIHRoZSBJUHJvamVjdCBkb2VzIG5vdCBzdXBwb3J0IGJ1aWxkIHZhbGlkYXRpb24sIGFkZCB0aGUgdmFsaWRhdGlvbgotCSAqIGJ1aWxkZXIgdG8gdGhlIHByb2plY3QgZGVzY3JpcHRpb24gc28gdGhhdCB0aGUgcHJvamVjdCBjYW4gc3VwcG9ydCBidWxpZCB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gaXNCdWlsZGVyQWRkZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7IC8vIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgZGVzY3JpcHRpb24KLQkJCS8vIGlzIG51bGwsIGJlY2F1c2UgaXQncyBuZXZlciBudWxsCi0JCQlpZiAoY29tbWFuZHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGJ1aWxkZXJOYW1lID0gY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKTsKLQkJCQkJaWYgKGJ1aWxkZXJOYW1lID09IG51bGwpIHsKLQkJCQkJCS8vIGJ1aWxkZXIgbmFtZSB3aWxsIGJlIG51bGwgaWYgaXQgaGFzIG5vdCBiZWVuIHNldAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoYnVpbGRlck5hbWUuZXF1YWxzKFZhbGlkYXRpb25QbHVnaW4uVkFMSURBVElPTl9CVUlMREVSX0lEKSkgewotCQkJCQkJaXNCdWlsZGVyQWRkZWQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNCdWlsZGVyQWRkZWQpIHsKLQkJCQlJQ29tbWFuZCBuZXdDb21tYW5kID0gZGVzY3JpcHRpb24ubmV3Q29tbWFuZCgpOwotCQkJCW5ld0NvbW1hbmQuc2V0QnVpbGRlck5hbWUoVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQpOwotCi0JCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG51bGw7Ci0JCQkJaWYgKGNvbW1hbmRzICE9IG51bGwpIHsKLQkJCQkJbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoY29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAwLCBjb21tYW5kcy5sZW5ndGgpOwotCQkJCQluZXdDb21tYW5kc1tjb21tYW5kcy5sZW5ndGhdID0gbmV3Q29tbWFuZDsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFsxXTsKLQkJCQkJbmV3Q29tbWFuZHNbMF0gPSBuZXdDb21tYW5kOwotCQkJCX0KLQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCi0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBpZiB3ZSBjYW4ndCByZWFkIHRoZSBpbmZvcm1hdGlvbiwgdGhlIHByb2plY3QgaXNuJ3Qgb3Blbiwgc28gaXQgY2FuJ3QgcnVuCi0JCQkvLyBhdXRvLXZhbGlkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElQcm9qZWN0LCB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgY2FuIHJ1biBidWlsZCB2YWxpZGF0aW9uIChpLmUuLAotCSAqIGluY3JlbWVudGFsIHZhbGlkYXRpb24pLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBUaGUgdGVzdCwgdG8gZmluZCBvdXQgaWYgdGhlIHByb2plY3Qgc3VwcG9ydHMKLQkgKiBidWlsZCB2YWxpZGF0aW9uIG9yIG5vdCwgaXMgdG8gc2VlIGlmIHRoZSBWYWxpZGF0aW9uQnVpbGRlciBpcyBjb25maWd1cmVkIG9uIHRoYXQgdHlwZSBvZgotCSAqIHByb2plY3QuCi0JICogCi0JICogVGhpcyBpcyBhIGxvbmctcnVubmluZyBwcm9jZXNzIC0gaXMgdGhlcmUgYW55IHdheSB0aGF0IEkgY2FuIHNob3J0ZW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoaXMKLQkgKiB0YWtlcz8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc1Byb2plY3RTdXBwb3J0QnVpbGRWYWxpZGF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBjYW5SdW5BViA9IGZhbHNlOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FuUnVuQVY7Ci0JCX0KLQotCQl0cnkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBpZiBkZXNjcmlwdGlvbgotCQkJLy8gaXMgbnVsbCwgYmVjYXVzZSBpdCdzIG5ldmVyIG51bGwKLQkJCWlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNhblJ1bkFWOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGJ1aWxkZXJOYW1lID0gY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKTsKLQkJCQlpZiAoYnVpbGRlck5hbWUgPT0gbnVsbCkgewotCQkJCQkvLyBidWlsZGVyIG5hbWUgd2lsbCBiZSBudWxsIGlmIGl0IGhhcyBub3QgYmVlbiBzZXQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGJ1aWxkZXJOYW1lLmVxdWFscyhWYWxpZGF0aW9uUGx1Z2luLlZBTElEQVRJT05fQlVJTERFUl9JRCkpIHsKLQkJCQkJY2FuUnVuQVYgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBpZiB3ZSBjYW4ndCByZWFkIHRoZSBpbmZvcm1hdGlvbiwgdGhlIHByb2plY3QgaXNuJ3Qgb3Blbiwgc28gaXQgY2FuJ3QgcnVuCi0JCQkvLyBhdXRvLXZhbGlkYXRlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gY2FuUnVuQVY7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIGFsbCB2YWxpZGF0b3JzIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LCBhbmQgZG9lcyBub3QgdG91Y2ggdGhlIGF1dG8tdmFsaWRhdGUgc2V0dGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVBbGxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBUdXJuIGF1dG8tdmFsaWRhdGUgb2ZmCi0JCS8vCXNldEF1dG9WYWxpZGF0ZShjdXJyZW50UHJvamVjdCwgZmFsc2UpOwotCi0JCS8vIEVuYWJsZSB0aGUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzCi0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcHJqcC5zZXRFbmFibGVkVmFsaWRhdG9ycyhwcmpwLmdldFZhbGlkYXRvcnMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0b3JNYW5hZ2VyOjplbmFibGVBbGxWYWxpZGF0b3JzKCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqIAotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgaW5jcmVtZW50YWwgVmFsaWRhdG9yTWV0YURhdGEgY29uZmlndXJlZCBvbiBhIGNlcnRhaW4gdHlwZSBvZiBJUHJvamVjdAotCSAqIChlLmcuIEVKQiBQcm9qZWN0IHZzLiBXZWIgUHJvamVjdCkuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9qZWN0Q29uZmlndXJlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0b3JNYW5hZ2VyOjpnZXRQcm9qZWN0Q29uZmlndXJlZEluY3JlbWVudGFsVmFsaWRhdG9ycygiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0b3JNZXRhRGF0YSBjb25maWd1cmVkIG9uIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0IChlLmcuIEVKQgotCSAqIFByb2plY3QgdnMuIFdlYiBQcm9qZWN0KS4KLQkgKiAKLQkgKiBJZiB0aGUgY29sbGVjdGlvbiBoYXMgbm90IGJlZW4gY2FsY3VsYXRlZCBiZWZvcmUsIGNhbGN1bGF0ZSBpdCBub3csIGFuZCBjYWNoZSB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvamVjdENvbmZpZ3VyZWRWYWxpZGF0b3JNZXRhRGF0YShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRWYWxpZGF0b3JzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdG9yTWFuYWdlcjo6Z2V0UHJvamVjdENvbmZpZ3VyZWRWYWxpZGF0b3JNZXRhRGF0YSgiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0b3JNZXRhRGF0YSBlbmFibGVkIG9uIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0IChlLmcuIEVKQgotCSAqIFByb2plY3QgdnMuIFdlYiBQcm9qZWN0KS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlzSW5jcmVtZW50YWwsIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZQotCSAqIGluY3JlbWVudGFsLCBvciBub24taW5jcmVtZW50YWwsIHZhbGlkYXRvcnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkLiBJZiB0aGUgcGFyYW1ldGVyIGlzCi0JICogdHJ1ZSwgcmV0dXJuIGluY3JlbWVudGFsIHZhbGlkYXRvcnMuIElmIHRoZSBwYXJhbWV0ZXIgaXMgZmFsc2UsIHJldHVybiBub25pbmNyZW1lbnRhbAotCSAqIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIFNldCBnZXRQcm9qZWN0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcmpwID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQocHJqcC5nZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKHRydWUpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlcjo6Z2V0UHJvamVjdEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICogCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0b3JNZXRhRGF0YSBlbmFibGVkIG9uIGEgY2VydGFpbiB0eXBlIG9mIElQcm9qZWN0IChlLmcuIEVKQgotCSAqIFByb2plY3QgdnMuIFdlYiBQcm9qZWN0KS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlzSW5jcmVtZW50YWwsIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZQotCSAqIGluY3JlbWVudGFsLCBvciBub24taW5jcmVtZW50YWwsIHZhbGlkYXRvcnMgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkLiBJZiB0aGUgcGFyYW1ldGVyIGlzCi0JICogdHJ1ZSwgcmV0dXJuIGluY3JlbWVudGFsIHZhbGlkYXRvcnMuIElmIHRoZSBwYXJhbWV0ZXIgaXMgZmFsc2UsIHJldHVybiBub25pbmNyZW1lbnRhbAotCSAqIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvamVjdEVuYWJsZWROb25JbmNyZW1lbnRhbFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHByanAuZ2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyhmYWxzZSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJWYWxpZGF0b3JNYW5hZ2VyOjpnZXRQcm9qZWN0RW5hYmxlZE5vbkluY3JlbWVudGFsVmFsaWRhdG9ycyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBSZXR1cm5zIGEgVmVjdG9yIG9mIGFsbCBWYWxpZGF0b3JNZXRhRGF0YSB3aG8gYXJlIGJvdGggY29uZmlndXJlZCBvbiB0aGlzIHR5cGUgb2YgcHJvamVjdCwKLQkgKiBhbmQgd2hvIGFyZSBhbHNvIGVuYWJsZWQgYnkgdGhpcyBwcm9qZWN0LiBJZiB0aGUgbGlzdCBvZiBlbmFibGVkIHZhbGlkYXRvcnMgaGFzbid0IGJlZW4KLQkgKiBsb2FkZWQgaW50byB0aGUgY2FjaGUsIGxvYWQgaXQgbm93LiBPdGhlcndpc2UsIGp1c3QgcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0UHJvamVjdEVuYWJsZWRWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldEVuYWJsZWRWYWxpZGF0b3JzKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKSB7Ci0JCQlpbnN0ID0gbmV3IFZhbGlkYXRvck1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZVV0aWwgZ2V0UmVzb3VyY2VVdGlsKCkgewotCQlpZiAoX3Jlc291cmNlVXRpbCA9PSBudWxsKSB7Ci0JCQlpZiAoX3Jlc291cmNlVXRpbENsYXNzID09IG51bGwpIHsKLQkJCQkvLyBTaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBtdXN0IG5ldmVyIGJlIG51bGwsCi0JCQkJLy8gZGVmYXVsdCB0aGUgcmVzb3VyY2UgdXRpbCB0byB0aGUgaGVhZGxlc3MgcmVzb3VyY2UgdXRpbC4KLQkJCQlfcmVzb3VyY2VVdGlsQ2xhc3MgPSBSRVNPVVJDRVVUSUxfREVGQVVMVENMQVNTOwotCQkJfQotCi0JCQl0cnkgewotCQkJCV9yZXNvdXJjZVV0aWwgPSAoSVJlc291cmNlVXRpbCkgX3Jlc291cmNlVXRpbENsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCV9yZXNvdXJjZVV0aWwgPSBudWxsOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJX3Jlc291cmNlVXRpbCA9IG51bGw7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlfcmVzb3VyY2VVdGlsID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Jlc291cmNlVXRpbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJdCB3aWxsIGJlCi0JICogICAgICAgICAgICAgbW92ZWQgdG8gYSBjbGFzcyBpbiB0aGUgImludGVybmFsIiBwYWNrYWdlIGF0IHNvbWUgdGltZS4KLQkgKi8KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhpbnQgc2V2ZXJpdHksIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBzZXZlcml0eSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gSXQgd2lsbCBiZQotCSAqICAgICAgICAgICAgIG1vdmVkIHRvIGEgY2xhc3MgaW4gdGhlICJpbnRlcm5hbCIgcGFja2FnZSBhdCBzb21lIHRpbWUuCi0JICovCi0JcHVibGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc2V2ZXJpdHkpIHsKLQkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIHNldmVyaXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJdCB3aWxsIGJlCi0JICogICAgICAgICAgICAgbW92ZWQgdG8gYSBjbGFzcyBpbiB0aGUgImludGVybmFsIiBwYWNrYWdlIGF0IHNvbWUgdGltZS4KLQkgKi8KLQlwdWJsaWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzKSB7Ci0JCXJldHVybiBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIFNldCBnZXRJbmNyZW1lbnRhbFZhbGlkYXRvcnMoQ29sbGVjdGlvbiB2bWRzKSB7Ci0JCWlmICh2bWRzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQotCQlTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2bWRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQlyZXN1bHQuYWRkKHZtZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllZCBieSB2YWxpZGF0b3JJZCB3aWxsIHZhbGlkYXRlIHRoZSBnaXZlbiByZXNvdXJjZS4gSWYKLQkgKiBlaXRoZXIgcGFyYW1ldGVyIGlzIG51bGwsIGZhbHNlIGlzIHJldHVybmVkLiBJZiB0aGUgdmFsaWRhdG9yIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlCi0JICogdmFsaWRhdGlvbiBmcmFtZXdvcmsgKGkuZS4sIGVpdGhlciBubyB2YWxpZGF0b3IgaW4gdGhlIGFjdGl2YXRlZCBwbHVnaW5zIGlzIGlkZW50aWZpZWQgYnkKLQkgKiB0aGF0IHBsdWdpbiBpZCwgb3IgdGhlIGdpdmVuIElSZXNvdXJjZSdzIHByb2plY3QgZG9lcyBub3QgcnVuIHRoYXQgcGFydGljdWxhciB2YWxpZGF0b3IpLAotCSAqIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlVG8oU3RyaW5nIHZhbGlkYXRvcklkLCBJUmVzb3VyY2UgcmVzKSB7Ci0JCWlmICgodmFsaWRhdG9ySWQgPT0gbnVsbCkgfHwgKHJlcyA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcklkKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQkvLyB2YWxpZGF0b3Igbm90IHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnJhbWV3b3JrCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCByZXMuZ2V0UHJvamVjdCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHZtZC5pc0FwcGxpY2FibGVUbyhyZXMpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNBdXRvVmFsaWRhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gaXNBdXRvVmFsaWRhdGUocHJvamVjdCwgaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEtlZXBpbmcgdGhpcyBBUEkgYXJvdW5kIHNvIGFzIG5vdCB0byBicmVhayBleGlzdGluZyBjb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBpc0F1dG9WYWxpZGF0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1ZhbGlkYXRlQ2hlY2tlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc0F1dG9WYWxpZGF0ZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBLZWVwaW5nIHRoaXMgQVBJIGFyb3VuZCBzbyBhcyBub3QgdG8gYnJlYWsgZXhpc3RpbmcgY29kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgaXNBdXRvVmFsaWRhdGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZUNoZWNrZWQoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZE9uKSB7Ci0JCXJldHVybiBpc0F1dG9WYWxpZGF0ZShwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZE9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdmFsaWRhdGUgd2lsbCBydW4gd2hlbiB0aGVyZSBpcyBhIHJlc291cmNlIGNoYW5nZS4gVGhlIGZvbGxvd2luZwotCSAqIGF0dHJpYnV0ZXMgYXJlIGNoZWNrZWQ6IDEuIGRvZXMgdGhpcyBwcm9qZWN0IGhhdmUgYXV0by12YWxpZGF0ZSBvbiBvciBvZmY/IDIuIGlmIHRoaXMgcHJvamVjdAotCSAqIGRvZXMgbm90IGhhdmUgYW4gYXV0by12YWxpZGF0ZSB2YWx1ZSBzZXQsIGlzIHRoZSBnbG9iYWwgYXV0by12YWxpZGF0ZSBwcmVmZXJlbmNlIG9uPyAzLiBpZiAxCi0JICogb3IgMiBpcyB0cnVlLCBkb2VzIHRoZSBwcm9qZWN0IHN1cHBvcnQgYXV0by12YWxpZGF0ZT8gNC4gaWYgMS8yLCAmIDMsIGlzIGF1dG8tYnVpbGQgb24/IDUuIGlmCi0JICogMS8yLCAzLCBhbmQgNCwgaXMgdGhlcmUgYXQgbGVhc3Qgb25lIGluY3JlbWVudGFsIHZhbGlkYXRvciBlbmFibGVkIG9uIHRoZSBwcm9qZWN0PwotCSAqIAotCSAqIEBkZXByZWNhdGVkIGF1dG8gdmFsaWRhdGUgaXMgbm90IHVzZWQgYW55IG1vcmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZShJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24pIHsKLQkJLyp0cnkgewotCQkJLy8gMS4gZG9lcyB0aGUgcHJvamVjdCBoYXZlIGF1dG8tdmFsaWRhdGUgb24gb3Igb2ZmPwotCQkJYm9vbGVhbiBpc0F1dG9WYWxpZGF0ZSA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KS5pc0F1dG9WYWxpZGF0ZSgpOwotCQkJaWYgKCFpc0F1dG9WYWxpZGF0ZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gMy4gZG9lcyB0aGUgcHJvamVjdCBzdXBwb3J0IGF1dG8tdmFsaWRhdGU/Ci0JCQkvLyA0LiBpcyBhdXRvLWJ1aWxkIG9uPwotCQkJLy8gNS4gaXMgdGhlcmUgYXQgbGVhc3Qgb25lIGluY3JlbWVudGFsIHZhbGlkYXRvciBlbmFibGVkIG9uIHRoZSBwcm9qZWN0PwotCQkJCi0JCQkgKiBBdXRvLXZhbGlkYXRpb24sIG9uIHRoZSBwcm9wZXJ0aWVzIHBhZ2UsIGNhbiBiZSBlbmFibGVkIHVuZGVyIHRoZXNlIGNvbmRpdGlvbnM6IDEuCi0JCQkgKiB0aGUgcHJvamVjdCBzdXBwb3J0cyBhdXRvLXZhbGlkYXRpb24sIEFORCAyLiBmaGUgcGxhdGZvcm0ncyBnbG9iYWwgImF1dG9tYXRpY2FsbHkKLQkJCSAqIGJ1aWxkIiBpcyBzZWxlY3RlZCwgQU5EIDMuIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvamVjdCdzIHZhbGlkYXRvcnMgc3VwcG9ydHMKLQkJCSAqIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIFdpdGhvdXQgIzEsIHRoZSBWYWxpZGF0aW9uQnVpbGRlciBpcyBuZXZlciBjYWxsZWQgYmVjYXVzZQotCQkJICogaXQncyBub3QgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdC4gV2l0aG91dCAjMiwgdGhlIFZhbGlkYXRpb25CdWlsZGVyIHdpbGwgbm90IGJlCi0JCQkgKiBjYWxsZWQgYmVjYXVzZSBhdXRvLWJ1aWxkaW5nIGlzIHR1cm5lZCBvZmYuIFdpdGhvdXQgIzMsIHRoZSBWYWxpZGF0aW9uQnVpbGRlciB3aWxsIGJlCi0JCQkgKiBjYWxsZWQsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IGJlY2F1c2Ugbm8gdmFsaWRhdG9ycyBjYW4gcnVuLgotCQkJIAotCQkJcmV0dXJuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChwcm9qZWN0LCBpc0dsb2JhbEF1dG9CdWlsZE9uKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlci5jYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gSWYgdGhlIHVzZXIncyBzZXR0aW5nIGNhbid0IGJlIHJldHJpZXZlZCwgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uZ2V0QXV0b1ZhbGlkYXRlRGVmYXVsdCgpOwotCQl9Ki8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBjYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQocHJvamVjdCwgaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIFNldCBnZXRFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBwcmpwLmdldEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnModHJ1ZSk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlcjo6Z2V0RW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBHaXZlbiBhIGNoZWNrZWQgbGlzdCBvZiBlbmFibGVkIHZhbGlkYXRvcnMsIHJldHVybiBhIHNldCBvZiB0aGUgb25lcyB3aGljaCBhcmUgY29uZmlndXJlZCBvbgotCSAqIHRoZSBwcm9qZWN0IGFuZCwgaWYgZ2V0SW5jcmVtZW50YWwgaXMgdHJ1ZSwgd2hpY2ggYWxzbyBydW4gaW5jcmVtZW50YWxseS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldFByb2plY3RDb25maWd1cmVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0LCBPYmplY3RbXSBlbmFibGVkVmFsLCBib29sZWFuIGdldEluY3JlbWVudGFsKSB7Ci0JCWlmICgocHJvamVjdCA9PSBudWxsKSB8fCAoZW5hYmxlZFZhbCA9PSBudWxsKSB8fCAoZW5hYmxlZFZhbC5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQotCQlTZXQgdmFsID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmFibGVkVmFsLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGVuYWJsZWRWYWxbaV07Ci0JCQlpZiAoIXZtZC5pc0NvbmZpZ3VyZWRPblByb2plY3QocHJvamVjdCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKCFnZXRJbmNyZW1lbnRhbCB8fCB2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJdmFsLmFkZCh2bWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNJbmNyZW1lbnRhbFZhbGlkYXRvcnMoT2JqZWN0W10gZW5hYmxlZFZhbCkgewotCQlpZiAoKGVuYWJsZWRWYWwgPT0gbnVsbCkgfHwgKGVuYWJsZWRWYWwubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuYWJsZWRWYWwubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZW5hYmxlZFZhbFtpXTsKLQotCQkJaWYgKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LgotCSAqLwotCXByb3RlY3RlZCBTZXQgZ2V0RW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gbnVsbDsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlpZighcHJqcC51c2VHbG9iYWxQcmVmZXJlbmNlKCkpIAotCQkJICAgdm1kcyA9IHByanAuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCWVsc2UKLQkJCSAgIHZtZHMgPSBnZXRTdGF0ZU9mUHJvamVjdExldmVsVmFsaWRhdG9yc0Zyb21HbG9iYWwocHJqcCk7Ci0JCQlyZXR1cm4gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLndyYXBJblNldCh2bWRzKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlcjo6Z2V0RW5hYmxlZFZhbGlkYXRvcnMiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJfQotCX0KLQotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRTdGF0ZU9mUHJvamVjdExldmVsVmFsaWRhdG9yc0Zyb21HbG9iYWwoUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlMaXN0IGVuYWJsZWRHbG9iYWxWYWxpZGF0b3JzRm9yUHJvamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCUxpc3QgYWxsUHJvamVjdFZhbGlkYXRvciA9IGdldEFsbFZhbGlkYXRvclVuaXF1ZU5hbWVzKHByanAuZ2V0VmFsaWRhdG9ycygpKTsKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWQgPSBnZi5nZXRCdWlsZEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCB2bWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGFsbFByb2plY3RWYWxpZGF0b3IuY29udGFpbnModm1kW2ldLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSkpIHsKLQkJCQllbmFibGVkR2xvYmFsVmFsaWRhdG9yc0ZvclByb2plY3QuYWRkKHZtZFtpXSk7Ci0JCQl9Ci0JICAgfQotCQlyZXR1cm4gKFZhbGlkYXRvck1ldGFEYXRhW10pIGVuYWJsZWRHbG9iYWxWYWxpZGF0b3JzRm9yUHJvamVjdC50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtlbmFibGVkR2xvYmFsVmFsaWRhdG9yc0ZvclByb2plY3Quc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRBbGxWYWxpZGF0b3JVbmlxdWVOYW1lcyhWYWxpZGF0b3JNZXRhRGF0YVtdIG1ldGFEYXRhKSB7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBtZXRhRGF0YS5sZW5ndGg7IGkrKykgewotCQkJbmFtZXMuYWRkKG1ldGFEYXRhW2ldLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQkKLQotCXByb3RlY3RlZCBTZXQgZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMoKTsKLQkJCXJldHVybiBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHZtZHMpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJWYWxpZGF0b3JNYW5hZ2VyOjpnZXRFbmFibGVkVmFsaWRhdG9ycyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgU2V0IGdldEJ1aWxkRW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0QnVpbGRFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJcmV0dXJuIEludGVybmFsVmFsaWRhdG9yTWFuYWdlci53cmFwSW5TZXQodm1kcyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRvck1hbmFnZXI6OmdldEVuYWJsZWRWYWxpZGF0b3JzIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCX0KLQl9CQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciB1c2Ugb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJhc2VkIG9uIHdoaWNoCi0JICogdmFsaWRhdG9ycyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uCi0JICogZnJhbWV3b3JrIFVJIGNsYXNzZXMuIFJlbW92ZSB0aGUgbWVzc2FnZXMgYmVsb25naW5nIHRvIGRpc2FibGVkIHZhbGlkYXRvcnMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGFza0xpc3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IHByanAuZ2V0RGlzYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2bWRzW2ldOwotCQkJCS8vIEZvciB2YWxpZGF0b3JzIHdobyBhcmVuJ3QgZ29pbmcgdG8gcnVuLCBjbGVhciB0aGVpciBtZXNzYWdlcyBmcm9tIHRoZSB0YXNrIGxpc3QuCi0JCQkJLy8gRG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlIGVudHJpZXMgYmVjYXVzZSBlYWNoIFZhbGlkYXRvciBtdXN0IGJlIHVuaXF1ZS4KLQkJCQkvLyBUaGUgdW5pcXVlbmVzcyBvZiBlYWNoIFZhbGlkYXRvciBpcyBjaGVja2VkIGJ5IHRoZSBwbHVnaW4gcmVnaXN0cnkuCi0JCQkJV29ya2JlbmNoUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMocHJvamVjdCwgdm1kLmdldFZhbGlkYXRvck5hbWVzKCksIG51bGwpOwotCQkJfQotCQkJIC8vTWVzc2FnZSBMaW1pdCBpcyByZW1vdmVkIGZyb20gdGhlIGZyYW1ld29yayAtIFdUUDEuNU01Ci0JCQkvKmlmIChwcmpwLm51bWJlck9mRW5hYmxlZFZhbGlkYXRvcnMoKSA+IDApIHsKLQkJCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5jaGVja01lc3NhZ2VMaW1pdChwcm9qZWN0LCBmYWxzZSk7IC8vIERvIG5vdCByZW1vdmUKLQkJCQkvLyB0aGUgZXhjZWVkZWQKLQkJCQkvLyBtZXNzYWdlOyBvbmx5Ci0JCQkJLy8gVmFsaWRhdGlvbk9wZXJhdGlvbgotCQkJCS8vIHNob3VsZCBkbyB0aGF0Ci0JCQkJLy8gYmVjYXVzZSBpdCdzCi0JCQkJLy8gYWJvdXQgdG8gcnVuCi0JCQkJLy8gdmFsaWRhdGlvbi4gSWYKLQkJCQkvLyB0aGUgbGltaXQgaXMKLQkJCQkvLyBpbmNyZWFzZWQsCi0JCQkJLy8gbWVzc2FnZXMgbWF5Ci0JCQkJLy8gc3RpbGwgYmUKLQkJCQkvLyBtaXNzaW5nLCBzbwotCQkJCS8vIGRvbid0IHJlbW92ZSB0aGUKLQkJCQkvLyAibWVzc2FnZXMgbWF5IGJlCi0JCQkJLy8gbWlzc2luZyIKLQkJCQkvLyBtZXNzYWdlLgotCQkJfSBlbHNlIHsKLQkJCQkvLyBDYW4ndCBydW4gdmFsaWRhdGlvbiwgc28gcmVtb3ZlIHRoZSAiZXhjZWVkZWQiIG1lc3NhZ2UKLQkJCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlTGltaXRFeGNlZWRlZChwcm9qZWN0KTsKLQkJCX0qLwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJZGVudGlmaWVyKCJWYWxpZGF0b3JNYW5hZ2VyLnVwZGF0ZVRhc2tMaXN0KCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzR2xvYmFsQXV0b0J1aWxkT24pIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlib29sZWFuIGluY3JlbWVudGFsVmFsRW5hYmxlZCA9IChwcmpwLm51bWJlck9mRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycygpID4gMCk7Ci0JCQlyZXR1cm4gY2FuQXV0b1ZhbGlkYXRlQnV0dG9uQmVFbmFibGVkKHByb2plY3QsIGlzR2xvYmFsQXV0b0J1aWxkT24sIGluY3JlbWVudGFsVmFsRW5hYmxlZCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRvck1hbmFnZXI6OmNhbkF1dG9WYWxpZGF0ZUJ1dHRvbkJlRW5hYmxlZCIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BdXRvVmFsaWRhdGVCdXR0b25CZUVuYWJsZWQoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBpc0dsb2JhbEF1dG9CdWlsZE9uLCBib29sZWFuIGluY3JlbWVudGFsVmFsRW5hYmxlZCkgewotCQlib29sZWFuIGRvZXNQcm9qZWN0U3VwcG9ydEF1dG9WYWxpZGF0ZSA9IGRvZXNQcm9qZWN0U3VwcG9ydEJ1aWxkVmFsaWRhdGlvbihwcm9qZWN0KTsKLQkJcmV0dXJuIChkb2VzUHJvamVjdFN1cHBvcnRBdXRvVmFsaWRhdGUgJiYgaXNHbG9iYWxBdXRvQnVpbGRPbiAmJiBpbmNyZW1lbnRhbFZhbEVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllZCBieSB0aGUgU3RyaW5nIGlzIGNvbmZpZ3VyZWQgb24gdGhlIElQcm9qZWN0IGFuZAotCSAqIGVuYWJsZWQgb24gdGhlIElQcm9qZWN0LiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlOwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsaWRhdG9yTmFtZSkgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCXJldHVybiBwcmpwLmlzRW5hYmxlZCh2YWxpZGF0b3JOYW1lKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlci5pc0VuYWJsZWQoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiwgIiArIHZhbGlkYXRvck5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBGb3IgdXNlIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBvbmx5LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgVmFsaWRhdG9yTWV0YURhdGEgaXMKLQkgKiAgICAgICAgICAgICBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gcHJqcC5pc0VuYWJsZWQodm1kKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlcjo6aXNFbmFibGVkIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQotCQkJCWlmIChleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIEZvciB1c2UgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIG9ubHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlyZXR1cm4gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmlzQ29uZmlndXJlZE9uUHJvamVjdCh2bWQsIHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2xvYmFsIGF1dG8tYnVpbGQgc2V0dGluZyBpcyB0dXJuZWQgb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdXRvQnVpbGRFbmFibGVkKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IG51bWJlclByb2plY3RFbmFibGVkVmFsaWRhdG9ycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByanAgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQlyZXR1cm4gcHJqcC5udW1iZXJPZkVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlkZW50aWZpZXIoIlZhbGlkYXRvck1hbmFnZXI6Om51bWJlclByb2plY3RFbmFibGVkVmFsaWRhdG9ycyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU3VzcGVuZHMsIG9yIHVuZG9lcyB0aGUgc3VzcGVuc2lvbiBvZiwgdmFsaWRhdGlvbiBvbiB0aGUgY3VycmVudCBwcm9qZWN0LiBJZiAic3VzcGVuZCIgaXMKLQkgKiB0cnVlIHRoZW4gdmFsaWRhdGlvbiBpcyBzdXNwZW5kZWQgYW5kIGlmIGl0J3MgImZhbHNlIiB0aGVuIHZhbGlkYXRpb24gd2lsbCBydW4gb24gdGhlCi0JICogcHJvamVjdC4gVGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgbm90IHBlcnNpc3RlZC4KLQkgKiAKLQkgKiBCZSBWRVJZIENBUkVGVUwgd2hlbiB5b3UgdXNlIHRoaXMgbWV0aG9kISBUdXJuIHZhbGlkYXRpb24gYmFjayBvbiBpbiBhIGZpbmFsbHkgYmxvY2sgYmVjYXVzZQotCSAqIGlmIHRoZSBjb2RlIHdoaWNoIHN1c3BlbmRlZCB2YWxpZGF0aW9uIGNyYXNoZXMsIHRoZSB1c2VyIGhhcyBubyB3YXkgdG8gdW5zdXNwZW5kIHZhbGlkYXRpb24uCi0JICogVGhlIHVzZXIgd2lsbCBoYXZlIHRvIHNodXQgZG93biAmIHJlc3RhcnQgV1NBRCB0byBnZXQgdmFsaWRhdGlvbiB0byB3b3JrIGFnYWluLgotCSAqIAotCSAqIElmIGFuIG9wZXJhdGlvbiBpcyB1c2VkIHRvIG1ha2UgY2hhbmdlcyB0aGF0IHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCB0aGVuIHVzZSB0aGUgdGVjaG5pcXVlCi0JICogZG9jdW1lbnRlZCBpbiB0aGUgIlByZXZlbnRpbmcgVmFsaWRhdGlvbiIgdG9waWMgb2YgdGhlICJWYWxpZGF0aW9uIEd1aWRlIiAoaW4gdGhlCi0JICogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLnByb3AgcGx1Z2luKS4gSWYgeW91IGRvbid0LCB2YWxpZGF0aW9uIG1heSBub3QgYmUgc3VzcGVuZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHN1c3BlbmRWYWxpZGF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gc3VzcGVuZCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIElnbm9yZSB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvamVjdCBpcyBjbG9zZWQuIElmIGl0J3MgY2xvc2VkIHRoZW4gaXQgd2lsbCBub3QgYmUgYnVpbHQKLQkJLy8gYW5kIHRoZSAiUnVuIFZhbGlkYXRpb24iIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi0JCWlmIChzdXNwZW5kKSB7Ci0JCQlfc3VzcGVuZGVkUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQl9IGVsc2UgewotCQkJX3N1c3BlbmRlZFByb2plY3RzLnJlbW92ZShwcm9qZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmRzLCBvciB1bmRvZXMgdGhlIHN1c3BlbnNpb24gb2YsIHZhbGlkYXRpb24gb24gYWxsIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2guIElmCi0JICogInN1c3BlbmQiIGlzIHRydWUgdGhlbiB2YWxpZGF0aW9uIGlzIHN1c3BlbmRlZCBhbmQgaWYgaXQncyAiZmFsc2UiIHRoZW4gdmFsaWRhdGlvbiB3aWxsIHJ1bi4KLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyBub3QgcGVyc2lzdGVkLgotCSAqIAotCSAqIEJlIFZFUlkgQ0FSRUZVTCB3aGVuIHlvdSB1c2UgdGhpcyBtZXRob2QhIFR1cm4gdmFsaWRhdGlvbiBiYWNrIG9uIGluIGEgZmluYWxseSBibG9jayBiZWNhdXNlCi0JICogaWYgdGhlIGNvZGUgd2hpY2ggc3VzcGVuZGVkIHZhbGlkYXRpb24gY3Jhc2hlcywgdGhlIHVzZXIgaGFzIG5vIHdheSB0byB1bnN1c3BlbmQgdmFsaWRhdGlvbi4KLQkgKiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc2h1dCBkb3duICYgcmVzdGFydCBXU0FEIHRvIGdldCB2YWxpZGF0aW9uIHRvIHdvcmsgYWdhaW4uCi0JICogCi0JICogSWYgYW4gb3BlcmF0aW9uIGlzIHVzZWQgdG8gbWFrZSBjaGFuZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIHRoZW4gdXNlIHRoZSB0ZWNobmlxdWUKLQkgKiBkb2N1bWVudGVkIGluIHRoZSAiUHJldmVudGluZyBWYWxpZGF0aW9uIiB0b3BpYyBvZiB0aGUgIlZhbGlkYXRpb24gR3VpZGUiIChpbiB0aGUKLQkgKiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUucHJvcCBwbHVnaW4pLiBJZiB5b3UgZG9uJ3QsIHZhbGlkYXRpb24gbWF5IG5vdCBiZSBzdXNwZW5kZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZEFsbFZhbGlkYXRpb24oYm9vbGVhbiBzdXNwZW5kKSB7Ci0JCV9zdXNwZW5kQWxsVmFsaWRhdGlvbiA9IHN1c3BlbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgInN1c3BlbmQgYWxsIiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBfc3VzcGVuZEFsbFZhbGlkYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRpb24gd2lsbCBub3QgcnVuIG9uIHRoZSBwcm9qZWN0IGJlY2F1c2UgaXQncyBiZWVuIHN1c3BlbmRlZC4gVGhpcwotCSAqIG1ldGhvZCBjaGVja3Mgb25seSB0aGUgc3VzcGVuc2lvbiBzdGF0dXM7IGlmIHZhbGlkYXRpb24gY2Fubm90IHJ1biBmb3Igc29tZSBvdGhlciByZWFzb24gKGZvcgotCSAqIGV4YW1wbGUsIHRoZXJlIGFyZSBubyBlbmFibGVkIHZhbGlkYXRvcnMpLCB5ZXQgdGhlIElQcm9qZWN0IGlzIG5vdCBzdXNwZW5kZWQsIHRoaXMgbWV0aG9kCi0JICogd2lsbCByZXR1cm4gdHJ1ZSBldmVuIHRob3VnaCB2YWxpZGF0aW9uIHdpbGwgbm90IHJ1bi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChfc3VzcGVuZEFsbFZhbGlkYXRpb24pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIF9zdXNwZW5kZWRQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBjb2RlIHRoYXQgaXMgcHJlcGFyaW5nIHRvIHN1c3BlbmQgdmFsaWRhdGlvbiBvbiBhCi0JICogcHJvamVjdC4gUmF0aGVyIHRoYW4gY2FsbGluZyBpc1N1c3BzZW5kKElQcm9qZWN0KSwgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpZiBhbGwgdmFsaWRhdGlvbgotCSAqIGhhcyBiZWVuIHN1c3BlbmRlZCwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIHByb2plY3QgaXRzZWxmLiBTZWUgdGhlCi0JICogVmFsaWRhdGlvbk1pZ3JhdG9yOjptaWdyYXRlUHJvamVjdCBmb3IgYW4gZXhhbXBsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvamVjdFN1c3BlbmRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBfc3VzcGVuZGVkUHJvamVjdHMuY29udGFpbnMocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRm9yIHVzZSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgb25seS4KLQkgKiAKLQkgKiBHaXZlbiBhIGxpc3Qgb2YgdmFsaWRhdG9ycycgcGx1Z2luIGlkcywgbWFrZSB0aG9zZSB2YWxpZGF0b3JzIGVuYWJsZWQgZm9yIHRoaXMgcHJvamVjdC4gQWxsCi0JICogb3RoZXJzLCBkaXNhYmxlIGZvciB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZFZhbGlkYXRvcnMoSVByb2plY3QgcHJvamVjdCwgU2V0IHZtZHNTZXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJqcCA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG51bGw7Ci0JCQlpZiAodm1kc1NldCA9PSBudWxsKSB7Ci0JCQkJdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt2bWRzU2V0LnNpemUoKV07Ci0JCQkJdm1kc1NldC50b0FycmF5KHZtZHMpOwotCQkJfQotCi0JCQlwcmpwLnNldEVuYWJsZWRWYWxpZGF0b3JzKHZtZHMpOwotCi0JCQl1cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSWRlbnRpZmllcigiVmFsaWRhdG9yTWFuYWdlci5zZXRFbmFibGVkVmFsaWRhdG9ycygiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiLCBTZXQsIElQcm9ncmVzc01vbml0b3IpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0KLQkJCQlpZiAoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzb3VyY2VVdGlsQ2xhc3MoQ2xhc3MgY2xhenopIHsKLQkJX3Jlc291cmNlVXRpbENsYXNzID0gY2xheno7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIHVzZSBieSBiYXRjaCBFSkIgZGVwbG95IG9ubHkuIE9ubHkgaW4gYmF0Y2ggbW9kZSBpcyBhbiBpbmZpbml0aWUgbnVtYmVyIG9mCi0JICogbWVzc2FnZXMgYWxsb3dlZC4KLQkgKiAKLQkgKiBFbmFibGUgYSBwcm9qZWN0IHRvIGhhdmUgYW4gaW5maW5pdGUgbnVtYmVyIG9mIG1lc3NhZ2VzLgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9NZXNzYWdlTGltaXQoSVByb2plY3QgcHJvamVjdCkgey8qCi0JCXNldE1lc3NhZ2VMaW1pdChwcm9qZWN0LCBXb3JrYmVuY2hSZXBvcnRlci5OT19NRVNTQUdFX0xJTUlUKTsKLQkqL30KLQotCS8qKgotCSAqIFRoaXMgbWVzc2FnZSBpcyBmb3IgdXNlIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLiBJZiB0aGUgIm1heCBtZXNzYWdlcyB3ZXJlIHJlcG9ydGVkIgotCSAqIElNYXJrZXIgZXhpc3RzLCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIElNYXJrZXJbXSBnZXRMaW1pdE1lc3NhZ2UoSVByb2plY3QgcHJvamVjdCkgewotCQlJTWFya2VyW10gZXhjZWVkZWRNZXNzYWdlID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBXb3JrYmVuY2hSZXBvcnRlci5nZXRVbmlxdWVJZChnZXRNZXNzYWdlTGltaXRPd25lcigpKSk7Ci0JCWlmICgoZXhjZWVkZWRNZXNzYWdlICE9IG51bGwpICYmIChleGNlZWRlZE1lc3NhZ2UubGVuZ3RoICE9IDApKSB7Ci0JCQlyZXR1cm4gZXhjZWVkZWRNZXNzYWdlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBJTWFya2VyIGlzIGEgImxpbWl0IHdhcyBleGNlZWRlZCIgbWVzc2FnZSwgZmFsc2Ugb3RoZXJ3aXNlLgotLy8JICovCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNMaW1pdE1lc3NhZ2UoSU1hcmtlciBtYXJrZXIpIHsKLS8vCQlpZiAobWFya2VyID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIFRhc2tMaXN0VXRpbGl0eS5pc093bmVyKG1hcmtlciwgV29ya2JlbmNoUmVwb3J0ZXIuZ2V0VW5pcXVlSWQoZ2V0TWVzc2FnZUxpbWl0T3duZXIoKSkpOwotLy8JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybiBhbGwgb2YgdGhlIElNYXJrZXJzIG9uIHRoZSBJUHJvamVjdCBleGNsdWRpbmcgdGhlICJsaW1pdCB3YXMgZXhjZWVkZWQiIG1lc3NhZ2UuIElmCi0vLwkgKiB0aGVyZSBhcmUgbm8gbWFya2VycywgcmV0dXJuIG51bGwuCi0vLwkgKi8KLS8vCXByaXZhdGUgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrc1dpdGhvdXRMaW1pdE1lc3NhZ2UoSVByb2plY3QgcHJvamVjdCkgewotLy8JCUlNYXJrZXJbXSBhbGxUYXNrcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLS8vCQlpZiAoKGFsbFRhc2tzID09IG51bGwpIHx8IChhbGxUYXNrcy5sZW5ndGggPT0gMCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8KLS8vCQkvLyBEb24ndCBjaGVjayBpZiB0aGUgbGltaXQgbWVzc2FnZSBleGlzdHMgYmVjYXVzZQotLy8JCS8vIGFueSBpbnRlcmFjdGlvbiB3aXRoIG1hcmtlcnMgaXMgY29zdGx5LiBTaW5jZSB0aGUKLS8vCQkvLyBpbnRlcmFjdGlvbiBoYXMgdG8gYmUgZG9uZSBhdCBsZWFzdCBvbmNlLCBtYWtlIHRoYXQKLS8vCQkvLyBzaW5nbGUgb2NjYXNpb24gaW4gdGhlIGZvciBsb29wIGJlbG93LgotLy8JCUlNYXJrZXJbXSB2YWxpZGF0b3JNZXNzYWdlcyA9IG5ldyBJTWFya2VyW2FsbFRhc2tzLmxlbmd0aF07Ci0vLwkJaW50IGNvdW50ID0gMDsgLy8gaG93IG1hbnkgbWFya2VycyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHJlc3VsdCBhcnJheT8KLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCUlNYXJrZXIgbWFya2VyID0gYWxsVGFza3NbaV07Ci0vLwkJCWlmIChpc0xpbWl0TWVzc2FnZShtYXJrZXIpKSB7Ci0vLwkJCQljb250aW51ZTsKLS8vCQkJfQotLy8JCQl2YWxpZGF0b3JNZXNzYWdlc1tjb3VudCsrXSA9IG1hcmtlcjsKLS8vCQl9Ci0vLwotLy8JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlcltjb3VudF07Ci0vLwkJU3lzdGVtLmFycmF5Y29weSh2YWxpZGF0b3JNZXNzYWdlcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIFJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcwotCSAqIHJlbW92ZWQsIGZhbHNlIGlmIHRoZSBtZXNzYWdlIGRpZG4ndCBleGlzdC4KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBzaG91bGQgYmUgbm90IGJlIHVzZWQgYW55bW9yZSBhcyBNZXNzYWdlIExpbWl0IGlzIHJlbW92ZWQgZnJvbQotCSAqIHRoZSBmcmFtZXdvcmsgLSBXVFAxLjVNNQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZU1lc3NhZ2VMaW1pdEV4Y2VlZGVkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1hcmtlcltdIGV4Y2VlZGVkTWVzc2FnZSA9IGdldExpbWl0TWVzc2FnZShwcm9qZWN0KTsKLQkJaWYgKGV4Y2VlZGVkTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKGV4Y2VlZGVkTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIlZhbGlkYXRvck1hbmFnZXIucmVtb3ZlTWVzc2FnZUxpbWl0RXhjZWVkZWQoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGxhc3QgdmFsaWRhdGlvbiBvcGVyYXRpb24gdGVybWluYXRlZCBkdWUgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCi0JICogaGF2aW5nIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YXNWYWxpZGF0aW9uVGVybWluYXRlZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNYXJrZXJbXSBleGNlZWRlZE1lc3NhZ2UgPSBnZXRMaW1pdE1lc3NhZ2UocHJvamVjdCk7Ci0JCXJldHVybiAoZXhjZWVkZWRNZXNzYWdlICE9IG51bGwpOyAvLyBWYWxpZGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGlmIHRoZSBtZXNzYWdlIGV4aXN0cy4KLQl9Ci0KLQlwcml2YXRlIENsYXNzIGdldE1lc3NhZ2VMaW1pdE93bmVyKCkgewotCQlpZiAoX21lc3NhZ2VMaW1pdE93bmVyID09IG51bGwpIHsKLQkJCV9tZXNzYWdlTGltaXRPd25lciA9IGdldENsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIF9tZXNzYWdlTGltaXRPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBvd25lciBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2hpY2ggb3ducyB2YWxpZGF0aW9uIGZyYW1ld29yayBzdGF0dXMKLQkgKiBtZXNzYWdlcy4KLQkgKiAKLQkgKiBPTkxZIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzaG91bGQgdXNlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJuYWxPd25lcihTdHJpbmcgb3duZXIpIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2ludGVybmFsT3duZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgaW50ZXJuYWxPd25lciA9IF9pbnRlcm5hbE93bmVyc1tpXTsKLQkJCWlmIChvd25lci5lcXVhbHMoaW50ZXJuYWxPd25lcikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBjbGFzcyB0byB0aGUgbGlzdCBvZiBvd25lcnMgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4gT05MWSBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsKLQkgKiBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIChpdCBpcyB1c2VkIGZvciBtZXNzYWdlcyBvd25lZCBieSBmcmFtZXdvcmsgY2xhc3NlcyBvciBjbGFzc2VzIHVzZWQgYnkKLQkgKiB0aGUgVFZUIHBsdWdpbi4pCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW50ZXJuYWxPd25lcihDbGFzcyBjbGF6eikgewotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdGVtcEludGVybmFsT3duZXJzID0gbmV3IFN0cmluZ1tfaW50ZXJuYWxPd25lcnMubGVuZ3RoICsgMV07Ci0JCWlmIChfaW50ZXJuYWxPd25lcnMubGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShfaW50ZXJuYWxPd25lcnMsIDAsIHRlbXBJbnRlcm5hbE93bmVycywgMCwgX2ludGVybmFsT3duZXJzLmxlbmd0aCk7Ci0JCX0KLQkJdGVtcEludGVybmFsT3duZXJzW19pbnRlcm5hbE93bmVycy5sZW5ndGhdID0gV29ya2JlbmNoUmVwb3J0ZXIuZ2V0VW5pcXVlSWQoY2xhenopOwotCi0JCV9pbnRlcm5hbE93bmVycyA9IHRlbXBJbnRlcm5hbE93bmVyczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2FjaGVNZXNzYWdlKElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yLCBNZXNzYWdlSW5mbyBpbmZvKXsKLQkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSB2YWxpZGF0b3JNc2dzLmdldCh2YWxpZGF0b3IpOwotCQlpZiggbGlzdCA9PSBudWxsICl7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdmFsaWRhdG9yTXNncy5wdXQodmFsaWRhdG9yLCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChpbmZvKTsKLQl9Ci0JCi0JcHVibGljIEFycmF5TGlzdCBnZXRNZXNzYWdlcyhJVmFsaWRhdG9ySm9iIHZhbGlkYXRvcil7Ci0JCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgdmFsaWRhdG9yTXNncy5nZXQodmFsaWRhdG9yKTsKLQkJaWYoIGxpc3QgPT0gbnVsbCApCi0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhck1lc3NhZ2VzKElWYWxpZGF0b3JKb2IgdmFsaWRhdG9yKXsKLQkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSB2YWxpZGF0b3JNc2dzLmdldCh2YWxpZGF0b3IpOwotCQlpZiggbGlzdCAhPSBudWxsICl7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCX0KLQkJdmFsaWRhdG9yTXNncy5yZW1vdmUoIHZhbGlkYXRvciApOwotCX0KLQotCQotCXB1YmxpYyBTZXQgZ2V0UHJvYmxlbVZhbGlkYXRvcnMoKSB7Ci0JCXJldHVybiBwcm9ibGVtVmFsaWRhdG9yczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MGE3ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRvclN1YnNldE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkZpbHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlZ2lzdHJ5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLQotLyoqCi0gKiBSdW4gc29tZSB2YWxpZGF0b3JzIG9uIGEgZ2l2ZW4gSVByb2plY3QuIEFueSB2YWxpZGF0b3JzIHdoaWNoIGNhbm5vdCBiZSBsb2FkZWQgb3Igd2hpY2ggYXJlIG5vdAotICogcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoaXMgdHlwZSBvZiBwcm9qZWN0IHdpbGwgYmUgaWdub3JlZC4KLSAqIAotICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZXh0ZW5kcyBWYWxpZGF0aW9uT3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFRkFVTFRFWFRFTlNJT04gPSBudWxsOyAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgdGhhdCB0aGVyZQotCi0JLy8gaXMgbm8gZGVmYXVsdCBmYWxsYmFjawotCS8vIGV4dGVuc2lvbgotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJ1bnMgYSBmdWxsIHZhbGlkYXRpb24gb24gdGhlIG5hbWVkIHZhbGlkYXRvcnMgZWl0aGVyIGlmIHZhbGlkYXRpb24KLQkgKiBuZWVkcyB0byAoQHNlZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QpKSBvciBpZiA8Y29kZT5mb3JjZTwvY29kZT4gaXMgdHJ1ZS4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gYXN5bmMpIHsKLQkJdGhpcyhwcm9qZWN0LCBmb3JjZSwgUmVnaXN0cnlDb25zdGFudHMuQVRUX1JVTEVfR1JPVVBfREVGQVVMVCwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvcGVyYXRpb24gdGhhdCBydW5zIGEgZnVsbCB2YWxpZGF0aW9uIG9uIHRoZSBuYW1lZCB2YWxpZGF0b3JzIHVzaW5nIHRoZQotCSAqIDxjb2RlPnJ1bGVHcm91cDwvY29kZT4gcGFzcy4gVXNlIHRoaXMgY29uc3RydWN0b3Igb25seSBpZiB5b3Ugd2FudCB0byBydW4gYSB2YWxpZGF0b3IgdGhhdAotCSAqIHN1cHBvcnRzIHRoZSB0d28gcGFzc2VzOiBGQVNUIGFuZCBGVUxMLgotCSAqIAotCSAqIElmIGZvcmNlIGlzIHRydWUsIHZhbGlkYXRpb24gaXMgcnVuIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvLgotCSAqIAotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICogCi0JICogSWYgYXN5bmMgaXMgdHJ1ZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBydW4gYWxsIHRocmVhZC1zYWZlIHZhbGlkYXRvcnMgaW4gdGhlIGJhY2tncm91bmQKLQkgKiB2YWxpZGF0aW9uIHRocmVhZCwgYW5kIGFsbCBvdGhlciB2YWxpZGF0b3JzIGluIHRoZSBtYWluIHRocmVhZC4gSWYgYXN5bmMgaXMgZmFsc2UsIGFsbAotCSAqIHZhbGlkYXRvcnMgd2lsbCBydW4gaW4gaW4gdGhlIG1haW4gdGhyZWFkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCwgSVdvcmtiZW5jaENvbnRleHQgYVdvcmtlbmNoQ29udGV4dCwgYm9vbGVhbiBmb3JjZSwgaW50IHJ1bGVHcm91cCwgYm9vbGVhbiBhc3luYykgewotCQlzdXBlcihwcm9qZWN0LCBhV29ya2VuY2hDb250ZXh0LCBudWxsLCBudWxsLCBydWxlR3JvdXAsIGZvcmNlLCBhc3luYyk7Ci0JfQotCQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJ1bnMgYSBmdWxsIHZhbGlkYXRpb24gb24gdGhlIG5hbWVkIHZhbGlkYXRvcnMgdXNpbmcgdGhlCi0JICogPGNvZGU+cnVsZUdyb3VwPC9jb2RlPiBwYXNzLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBvbmx5IGlmIHlvdSB3YW50IHRvIHJ1biBhIHZhbGlkYXRvciB0aGF0Ci0JICogc3VwcG9ydHMgdGhlIHR3byBwYXNzZXM6IEZBU1QgYW5kIEZVTEwuCi0JICogCi0JICogSWYgZm9yY2UgaXMgdHJ1ZSwgdmFsaWRhdGlvbiBpcyBydW4gd2hldGhlciBvciBub3QgaXQgbmVlZHMgdG8uCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGZvcmNlLCBpbnQgcnVsZUdyb3VwLCBPYmplY3RbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGFzeW5jKSB7Ci0JCXN1cGVyKHByb2plY3QsIG51bGwsIG51bGwsIHJ1bGVHcm91cCwgZm9yY2UsIGFzeW5jKTsKLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWFudWFsRW5hYmxlZFZhbGlkYXRvcnMocHJvamVjdCkpOwotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIHRoYXQgcnVucyBhIGZ1bGwgdmFsaWRhdGlvbiBvbiB0aGUgbmFtZWQgdmFsaWRhdG9ycyB1c2luZyB0aGUKLQkgKiA8Y29kZT5ydWxlR3JvdXA8L2NvZGU+IHBhc3MuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIG9ubHkgaWYgeW91IHdhbnQgdG8gcnVuIGEgdmFsaWRhdG9yIHRoYXQKLQkgKiBzdXBwb3J0cyB0aGUgdHdvIHBhc3NlczogRkFTVCBhbmQgRlVMTC4KLQkgKiAKLQkgKiBJZiBmb3JjZSBpcyB0cnVlLCB2YWxpZGF0aW9uIGlzIHJ1biB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0by4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UsIGludCBydWxlR3JvdXAsIGJvb2xlYW4gYXN5bmMpIHsKLQkJc3VwZXIocHJvamVjdCwgbnVsbCwgbnVsbCwgcnVsZUdyb3VwLCBmb3JjZSwgYXN5bmMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBmaWxlRXh0ZW5zaW9uIHBhcmFtZXRlciBtdXN0IGJlICIuWCIsIHdoZXJlIFggaXMgdGhlIGV4dGVuc2lvbi4gRG8gbm90IHR5cGUgIiouWCIgb3IgIlgiCi0JICogKGkuZS4sIHdpdGhvdXQgdGhlIGRvdCkuIFRoZSBwYXJhbWV0ZXIgY291bGQgYWxzbyBiZSB0aGUgZmlsZSBuYW1lLCBlLmcuICJmb28uWCIuCi0JICogCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBpbnZva2VyIHdpc2hlcyB0byBmb3JjZSB2YWxpZGF0aW9uIG9uIGNlcnRhaW4KLQkgKiByZXNvdXJjZXMsIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gc2F2ZSB0aGVpciBjaGFuZ2VzLgotCSAqIAotCSAqIEFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCBmb3IgdGhlCi0JICogZmlsZUV4dGVuc2lvbiBvbiB0aGUgZ2l2ZW4gSVByb2plY3QuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmlsZUV4dGVuc2lvbiwgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBhc3luYykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdCwgZmlsZUV4dGVuc2lvbiwgREVGQVVMVF9ERUZBVUxURVhURU5TSU9OLCBjaGFuZ2VkUmVzb3VyY2VzLCBhc3luYyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGVFeHRlbnNpb24gcGFyYW1ldGVyIG11c3QgYmUgIi5YIiwgd2hlcmUgWCBpcyB0aGUgZXh0ZW5zaW9uLiBEbyBub3QgdHlwZSAiKi5YIiBvciAiWCIKLQkgKiAoaS5lLiwgd2l0aG91dCB0aGUgZG90KS4gVGhlIHBhcmFtZXRlciBjb3VsZCBhbHNvIGJlIHRoZSBmaWxlIG5hbWUsIGUuZy4gImZvby5YIi4KLQkgKiAKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGludm9rZXIgd2lzaGVzIHRvIGZvcmNlIHZhbGlkYXRpb24gb24gY2VydGFpbgotCSAqIHJlc291cmNlcywgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBzYXZlIHRoZWlyIGNoYW5nZXMuCi0JICogCi0JICogSWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgY29uZmlndXJlZCBvbiBmaWxlcyBuYW1lZCAiLlgiLCB0aGVuIHVzZSB0aGUgdmFsaWRhdG9ycyBjb25maWd1cmVkCi0JICogb24gdmFsaWRhdG9ycyBuYW1lZCAiLlkiLCB3aGVyZSBkZWZhdWx0RXh0ZW5zaW9uIGlkZW50aWZpZXMgdGhlIGZhbGxiYWNrIGV4dGVuc2lvbiB0byB1c2UuCi0JICogZGVmYXVsdEV4dGVuc2lvbiBmb2xsb3dzIHRoZSBzYW1lIHN5bnRheCBhcyBmaWxlRXh0ZW5zaW9uLgotCSAqIAotCSAqIEFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCBmb3IgdGhlCi0JICogZmlsZUV4dGVuc2lvbiBvciBkZWZhdWx0RXh0ZW5zaW9uIG9uIHRoZSBnaXZlbiBJUHJvamVjdC4KLQkgKiAKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqIAotCSAqIElmIGFzeW5jIGlzIHRydWUsIHRoZSB2YWxpZGF0aW9uIHdpbGwgcnVuIGFsbCB0aHJlYWQtc2FmZSB2YWxpZGF0b3JzIGluIHRoZSBiYWNrZ3JvdW5kCi0JICogdmFsaWRhdGlvbiB0aHJlYWQsIGFuZCBhbGwgb3RoZXIgdmFsaWRhdG9ycyBpbiB0aGUgbWFpbiB0aHJlYWQuIElmIGFzeW5jIGlzIGZhbHNlLCBhbGwKLQkgKiB2YWxpZGF0b3JzIHdpbGwgcnVuIGluIGluIHRoZSBtYWluIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaWxlRXh0ZW5zaW9uLCBTdHJpbmcgZGVmYXVsdEV4dGVuc2lvbiwgT2JqZWN0W10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBhc3luYykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3QsIHNob3VsZEZvcmNlKGNoYW5nZWRSZXNvdXJjZXMpLCBhc3luYyk7Ci0KLQkJYm9vbGVhbiBmaWx0ZXJJbiA9IGZhbHNlOyAvLyBmb3JjZSB0aGUgcmVzb3VyY2VzIHRvIGJlIGZpbHRlcmVkIGluIGV2ZW4gaWYgdGhlIHZhbGlkYXRvcgotCQkvLyBkb2Vzbid0IG5vcm1hbGx5IHRha2UgdGhlbT8KLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JzRm9yRXh0ZW5zaW9uKHByb2plY3QsIGZpbGVFeHRlbnNpb24pOyAvLyByZXR1cm4KLQkJLy8gYQotCQkvLyBsaXN0Ci0JCS8vIG9mCi0JCS8vIHZhbGlkYXRvcnMKLQkJLy8gd2hpY2gKLQkJLy8gYXJlCi0JCS8vIGNvbmZpZ3VyZWQKLQkJLy8gdG8KLQkJLy8gcnVuCi0JCS8vIG9uCi0JCS8vIGZpbGVzCi0JCS8vIHdpdGgKLQkJLy8gdGhhdAotCQkvLyBleHRlbnNpb24uCi0JCS8vIEEKLQkJLy8gdmFsaWRhdG9yCi0JCS8vIHdpbGwKLQkJLy8gYmUKLQkJLy8gaW4KLQkJLy8gdGhlCi0JCS8vIGxpc3QKLQkJLy8gd2hldGhlcgotCQkvLyBpdAotCQkvLyBoYXMKLQkJLy8gYmVlbgotCQkvLyBlbmFibGVkCi0JCS8vIG9yCi0JCS8vIGRpc2FibGVkCi0JCS8vIGJ5Ci0JCS8vIHRoZQotCQkvLyB1c2VyLgotCQlpZiAoKGRlZmF1bHRFeHRlbnNpb24gIT0gbnVsbCkgJiYgKCh2bWRzID09IG51bGwpIHx8ICh2bWRzLmxlbmd0aCA9PSAwKSkpIHsKLQkJCWZpbHRlckluID0gdHJ1ZTsKLQkJCXZtZHMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvcnNGb3JFeHRlbnNpb24ocHJvamVjdCwgZGVmYXVsdEV4dGVuc2lvbik7Ci0JCX0KLQotCQlpZiAoKHZtZHMgPT0gbnVsbCkgfHwgKHZtZHMubGVuZ3RoID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHZtZHMpKTsKLQotCQlzZXRGaWxlRGVsdGFzKEZpbHRlclV0aWwuZ2V0RmlsZURlbHRhcyhnZXRFbmFibGVkVmFsaWRhdG9ycygpLCBjaGFuZ2VkUmVzb3VyY2VzLCBmaWx0ZXJJbikpOyAvLyBjb25zdHJ1Y3QKLQkJLy8gYW4KLQkJLy8gYXJyYXkKLQkJLy8gb2YKLQkJLy8gSUZpbGVEZWx0YVtdCi0JCS8vIHRvCi0JCS8vIHdyYXAKLQkJLy8gdGhlCi0JCS8vIE9iamVjdFtdOwotCQkvLyBvbmUKLQkJLy8gSUZpbGVEZWx0YQotCQkvLyBmb3IKLQkJLy8gZWFjaAotCQkvLyBPYmplY3QKLQkJLy8gaW4KLQkJLy8gdGhlCi0JCS8vIGFycmF5Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBmb3IgdGhlIHZhbGlkYXRpb24gYXN5bmMgdGVzdGluZywgYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZQotCSAqIGNhbGxlZCBvdXRzaWRlIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKiAKLQkgKiBSdW4gdmFsaWRhdGlvbiBvbiB0aGUgY2hhbmdlZCByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsaWRhdG9ycy4gQWxsIHJlc291cmNlcyBtdXN0IGJlIGZyb20KLQkgKiB0aGUgc2FtZSBwcm9qZWN0OyBpZiB0aGV5J3JlIG5vdCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBbGwgdmFsaWRhdG9ycwotCSAqIG11c3QgYmUgYWJsZSB0byBydW4gb24gdGhlIHJlc291cmNlcycgcHJvamVjdDsgaWYgbm90LCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZQotCSAqIHRocm93bi4gSWYgdGhlIHZtZHMgYXJlIGVpdGhlciBlbXB0eSBvciBudWxsLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGVwdGlvbiB3aWxsIGJlIHRocm93bi4gSWYKLQkgKiB0aGUgcHJvamVjdCBpcyBjbG9zZWQgb3IgZG9lc24ndCBleGlzdCB0aGVuIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiAKLQkgKiBUaGUgaWZpbGVEZWx0YVR5cGUgaXMgb25lIG9mIHRoZSBJRmlsZURlbHRhIGNvbnN0YW50czogQURERUQsIENIQU5HRUQsIG9yIERFTEVURUQuCi0JICogCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKiAKLQkgKiBJZiBhc3luYyBpcyB0cnVlLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHJ1biBhbGwgdGhyZWFkLXNhZmUgdmFsaWRhdG9ycyBpbiB0aGUgYmFja2dyb3VuZAotCSAqIHZhbGlkYXRpb24gdGhyZWFkLCBhbmQgYWxsIG90aGVyIHZhbGlkYXRvcnMgaW4gdGhlIG1haW4gdGhyZWFkLiBJZiBhc3luYyBpcyBmYWxzZSwgYWxsCi0JICogdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBpbiB0aGUgbWFpbiB0aHJlYWQuCi0JICovCi0JcHVibGljIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMsIElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGludCBpZmlsZURlbHRhVHlwZSwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBhc3luYykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCS8vIEhhdmUgdG8gaGF2ZSB0aGUgSVByb2plY3QgYXMgYSBwYXJhbWV0ZXIgYmVjYXVzZSBWYWxpZGF0aW9uT3BlcmF0aW9uIG5lZWRzIHRoZSBJUHJvamVjdCwKLQkJLy8gYW5kIHRoZSBzdXBlciguLikKLQkJLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgaW4gdGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuCi0JCXN1cGVyKHByb2plY3QsIGZvcmNlLCBhc3luYyk7Ci0KLQkJaWYgKCh2bWRzID09IG51bGwpIHx8ICh2bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0JBRFZNRCkpOwotCQl9Ci0KLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFJlc291cmNlQ29uc3RhbnRzLlZCRl9FWENfT1BFTlBSSiwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQl9Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0VYSVNUUFJKLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCX0KLQotCQlpZiAoKGNoYW5nZWRSZXNvdXJjZXMgIT0gbnVsbCkgJiYgKGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkpIHsKLQkJCVNldCB0ZW1wU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IHAgPSBjaGFuZ2VkUmVzb3VyY2VzW2ldLmdldFByb2plY3QoKTsKLQkJCQlpZiAoIXAuaXNPcGVuKCkpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX09QRU5QUkosIG5ldyBTdHJpbmdbXXtwLmdldE5hbWUoKX0pKTsKLQkJCQl9Ci0JCQkJaWYgKCFwLmV4aXN0cygpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19FWElTVFBSSiwgbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSkpOwotCQkJCX0KLQkJCQl0ZW1wU2V0LmFkZChwcm9qZWN0KTsKLQkJCX0KLQotCQkJaWYgKCF0ZW1wU2V0LmNvbnRhaW5zKHByb2plY3QpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX0JBRFBSSiwgbmV3IFN0cmluZ1tde3Byb2plY3QuZ2V0TmFtZSgpfSkpOwotCQkJfQotCQkJaWYgKHRlbXBTZXQuc2l6ZSgpICE9IDEpIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcFNldC5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1ZmZlci5hcHBlbmQocC5nZXROYW1lKCkpOwotCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihSZXNvdXJjZUhhbmRsZXIuZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShSZXNvdXJjZUNvbnN0YW50cy5WQkZfRVhDX01VTFRJUFJKLCBuZXcgU3RyaW5nW117YnVmZmVyLnRvU3RyaW5nKCl9KSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZtZHNbaV07Ci0JCQlpZiAoIVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5pc0NvbmZpZ3VyZWRPblByb2plY3Qodm1kLCBwcm9qZWN0KSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19CQURWQUwsIG5ldyBTdHJpbmdbXXt2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSwgcHJvamVjdC5nZXROYW1lKCl9KSk7Ci0JCQl9Ci0JCX0KLQotCQlzZXRFbmFibGVkVmFsaWRhdG9ycyhJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIud3JhcEluU2V0KHZtZHMpKTsKLQkJc2V0RmlsZURlbHRhcyhGaWx0ZXJVdGlsLmdldEZpbGVEZWx0YXMoZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSwgY2hhbmdlZFJlc291cmNlcywgaWZpbGVEZWx0YVR5cGUpKTsgLy8gY29uc3RydWN0Ci0JCS8vIGFuCi0JCS8vIGFycmF5Ci0JCS8vIG9mCi0JCS8vIElGaWxlRGVsdGFbXQotCQkvLyB0bwotCQkvLyB3cmFwCi0JCS8vIHRoZQotCQkvLyBJUmVzb3VyY2VbXTsKLQkJLy8gb25lCi0JCS8vIElGaWxlRGVsdGEKLQkJLy8gZm9yCi0JCS8vIGVhY2gKLQkJLy8gSVJlc291cmNlCi0JCS8vIGluCi0JCS8vIHRoZQotCQkvLyBhcnJheQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIGFycmF5IG9mIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lcyBvZiB2YWxpZGF0b3JzLCBjcmVhdGUgdGhlIGxpc3Qgb2YgdmFsaWRhdG9ycyB0bwotCSAqIGJlIHJ1bi4gVGhlIGFycmF5IGlzIG5vdCBjaGVja2VkIGZvciBkdXBsaWNhdGVzIG9yIGZvciBpbnZhbGlkIHZhbGlkYXRvcnMgKGkuZS4sIGEgdmFsaWRhdG9yCi0JICogb2YgdGhhdCBjbGFzcyB0eXBlIGlzIG5vdCBsb2FkZWQsIG9yIHRoZSB2YWxpZGF0b3IgaXMgbG9hZGVkIGJ1dCBjYW5ub3QgcnVuIGFnYWluc3QgdGhpcyB0eXBlCi0JICogb2YgSVByb2plY3QuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcnMoU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlTZXQgZW5hYmxlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JOYW1lc1tpXSk7Ci0JCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkvLyBObyB2YWxpZGF0b3IsIHdpdGggdGhhdCBwbHVnaW4gaWQsIGNhbiBiZSBydW4gb24gdGhhdCBwcm9qZWN0LgotCQkJCS8vIEVpdGhlciB0aGUgdmFsaWRhdG9yIGlzbid0IGluc3RhbGxlZCwgb3IgdGhlIElQcm9qZWN0IHBhc3NlZCBpbgotCQkJCS8vIGRvZXNuJ3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IG5hdHVyZS4KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHZhbGlkYXRvck5hbWVzW2ldKTsKLQkJCX0KLQkJCWVuYWJsZWQuYWRkKHZtZCk7Ci0JCX0KLQkJc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2Ugc2V0Rm9yY2UoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSdW4oYm9vbGVhbiBmb3JjZSkgewotCQlzZXRGb3JjZShmb3JjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaENvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2ExNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUmVnaXN0cnlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciByZWdpc3RyYXRpb24gb2Ygc3ltYm9saWMgbW9kZWwgbmFtZXMsIGFuZCBhbHNvIHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gZm9yCi0gKiByZWdpc3RlcmluZyB0aGUgbG9hZCBtb2RlbCBtZXRob2Qgd2hpY2ggbG9hZHMgYSBzcGVjaWZpYyB0eXBlIG9mIE1PRiBtb2RlbCwgYXMgaWRlbnRpZmllZCBieSB0aGUKLSAqIHN5bWJvbGljIG1vZGVsIG5hbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hDb250ZXh0IGltcGxlbWVudHMgSVdvcmtiZW5jaENvbnRleHQgewotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3Q7Ci0JcHJpdmF0ZSBIYXNodGFibGUgX21vZGVsUmVnaXN0cnk7Ci0JcHJpdmF0ZSBpbnQgX3J1bGVHcm91cCA9IFJlZ2lzdHJ5Q29uc3RhbnRzLkFUVF9SVUxFX0dST1VQX0RFRkFVTFQ7Ci0JcHVibGljIExpc3QgdmFsaWRhdGlvbkZpbGVVUklzOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUFJPSkVDVF9GSUxFUyA9ICJnZXRBbGxGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRklMRSA9ICJnZXRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSID0gImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7ICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgV29ya2JlbmNoQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQkJX21vZGVsUmVnaXN0cnkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcmVnaXN0ZXJNb2RlbChJUnVsZUdyb3VwLlBBU1NfTEVWRUwsICJsb2FkUnVsZUdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vdGhlIGZvbGxvd2luZyB3aWxsIHJlZ2lzdGVyIHRoZSBoZWxwZXIncyBzeW1ib2xpYyBtZXRob2RzCi0JICAgIENsYXNzIFtdIGFyZ3MgPSBuZXcgQ2xhc3NbMV0gOwotCSAgICBhcmdzWzBdID0gU3RyaW5nLmNsYXNzIDsgIC8vIGEgc3RyaW5nIGFyZ3VtZW50IGRlbm90aW5nIGEgc3BlY2lmaWMgSlNQLgotCQlyZWdpc3Rlck1vZGVsKEdFVF9GSUxFLCAiZ2V0RmlsZSIsIGFyZ3MpOy8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgImdldEZpbGVzIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIHZhbGlkYXRpb24gaXMgY29tcGxldGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHNvIHRoYXQgdGhlIElXb3JrYmVuY2hDb250ZXh0IGNhbgotCSAqIGNsZWFuIHVwIGFueSByZXNvdXJjZXMgaXQgYWxsb2NhdGVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBJZiB0aGUgY2xlYW51cCBpcyBhIGxvbmctcnVubmluZyBvcGVyYXRpb24sIHN1YnRhc2sgbWVzc2FnZXMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIElSZXBvcnRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIERlZmF1bHQ6IG5vdGhpbmcgdG8gY2xlYW4gdXAKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBjbG9zaW5nLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlIHRob3NlCi0JICogcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYQotCSAqIG5vLW9wLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NpbmcoKSB7Ci0JCWNsb3NpbmcoZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBjbG9zaW5nLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzIG1ldGhvZCBpcwotCSAqIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlIHRob3NlCi0JICogcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgYQotCSAqIG5vLW9wLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIE92ZXJyaWRlIGNsb3NpbmcoKSBpbnN0ZWFkLCBhbmQgdXNlIGdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBJUHJvamVjdCBpcyBiZWluZyBkZWxldGVkLCBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gV2hlbiB0aGlzCi0JICogbWV0aG9kIGlzIGNhbGxlZCwgaWYgdGhlIGhlbHBlciBoYXMgY2FjaGVkIGFueSByZXNvdXJjZXMgZnJvbSB0aGUgSVByb2plY3QsIGl0IHNob3VsZCByZWxlYXNlCi0JICogdGhvc2UgcmVzb3VyY2VzLiBJZiB5b3UgZG8gbm90IGFsbG9jYXRlIHJlc291cmNlcyBpbiB5b3VyIGhlbHBlciwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUKLQkgKiBhIG5vLW9wLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0aW5nKCkgewotCQlkZWxldGluZyhnZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlIElQcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQsIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCBuZWVkcyB0byBiZSBkb25lLiBXaGVuIHRoaXMKLQkgKiBtZXRob2QgaXMgY2FsbGVkLCBpZiB0aGUgaGVscGVyIGhhcyBjYWNoZWQgYW55IHJlc291cmNlcyBmcm9tIHRoZSBJUHJvamVjdCwgaXQgc2hvdWxkIHJlbGVhc2UKLQkgKiB0aG9zZSByZXNvdXJjZXMuIElmIHlvdSBkbyBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIGluIHlvdXIgaGVscGVyLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZQotCSAqIGEgbm8tb3AuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgZGVsZXRpbmcoKSBpbnN0ZWFkLCBhbmQgdXNlIGdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0aW5nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVBhdGggb2YgYSByZXNvdXJjZSwgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4gSWYgdGhlIElSZXNvdXJjZSBpcyBub3QgYSBtZW1iZXIKLQkgKiBvZiB0aGUgY29udGFpbmVyLCByZXR1cm4gbnVsbC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIG9mIHRoaXMgY2xhc3M7Ci0JICogc3BlY2lmaWNhbGx5LCBpbiB0aGVpciBnZXRQb3J0YWJsZU5hbWUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChTdHJpbmcgZnVsbFBhdGgsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCWlmICgoZnVsbFBhdGggPT0gbnVsbCkgfHwgKGNvbnRhaW5lciA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCQlJUGF0aCByZWxQYXRoID0gZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKG5ldyBQYXRoKGZ1bGxQYXRoKSwgY29udGFpbmVyKTsKLQkJaWYgKHJlbFBhdGggIT0gbnVsbCkKLQkJCXJldHVybiByZWxQYXRoLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIG9mIGEgcmVzb3VyY2UsIHJlbGF0aXZlIHRvIHRoZSBjb250YWluZXIuIElmIHRoZSBJUmVzb3VyY2UgaXMgbm90IGEgbWVtYmVyCi0JICogb2YgdGhlIGNvbnRhaW5lciwgcmV0dXJuIG51bGwuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VmdWwgZm9yIGltcGxlbWVudG9ycyBvZiB0aGlzIGNsYXNzOwotCSAqIHNwZWNpZmljYWxseSwgaW4gdGhlaXIgZ2V0UG9ydGFibGVOYW1lIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChJUmVzb3VyY2UgcmVzb3VyY2UsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCWlmICgocmVzb3VyY2UgPT0gbnVsbCkgfHwgKGNvbnRhaW5lciA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IG51bGw7Ci0JCUlQYXRoIHJlbFBhdGggPSBnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgY29udGFpbmVyKTsKLQkJaWYgKHJlbFBhdGggIT0gbnVsbCkgewotCQkJLy8gaWYgcmVsUGF0aCBpcyBudWxsLCB0aGUgcmVzb3VyY2UgaXMgbm90IGEgZGlyZWN0IG1lbWJlciBvZiB0aGUgY29udGFpbmVyCi0JCQl0cnkgewotCQkJCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsgLy8gZmluZE1lbWJlciB3b24ndCB3b3JrCi0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlmb3VuZFJlc291cmNlID0gY29udGFpbmVyLmdldEZpbGUocmVsUGF0aCk7Ci0JCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQlmb3VuZFJlc291cmNlID0gY29udGFpbmVyLmdldEZvbGRlcihyZWxQYXRoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvdW5kUmVzb3VyY2UgPSBjb250YWluZXIuZmluZE1lbWJlcihyZWxQYXRoLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlCi0JCQkJCS8vIHBoYW50b20gcmVzb3VyY2VzCi0JCQkJCWlmICgoZm91bmRSZXNvdXJjZSAhPSBudWxsKSAmJiAhZm91bmRSZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQkJZm91bmRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJZm91bmRSZXNvdXJjZSA9IG51bGw7Ci0KLQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0OjpnZXRDb250YWluZXJSZWxhdGl2ZVBhdGgoSVJlc291cmNlLCBJQ29udGFpbmVyKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZvdW5kUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBmaWxlIGhhcyBiZWVuIGZvdW5kCi0JCWludCBtYXRjaGluZ0ZpcnN0U2VnbWVudHMgPSBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmdGaXJzdFNlZ21lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBJUGF0aCwgaWYgdGhlIElQYXRoIGlzIGFic29sdXRlLCBhbmQgaXMgYSBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyLCByZXR1cm4gYW4gSVBhdGgKLQkgKiB3aGljaCBpcyByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiBJZiB0aGUgSVBhdGggaXMgbm90IHBhcnQgb2YgdGhlIElDb250YWluZXIsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGFpbmVyUmVsYXRpdmVQYXRoKElQYXRoIHBhdGgsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCWlmICgocGF0aCA9PSBudWxsKSB8fCAoY29udGFpbmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8gSXMgdGhlIHBhdGggcGFydCBvZiB0aGUgSUNvbnRhaW5lcj8KLQkJCWludCBtYXRjaGluZ0ZpcnN0U2VnbWVudHMgPSBwYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhjb250YWluZXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlpZiAoKG1hdGNoaW5nRmlyc3RTZWdtZW50cyA+IDApICYmIChtYXRjaGluZ0ZpcnN0U2VnbWVudHMgPT0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCkpKSB7Ci0JCQkJLy8gcGFydCBvZiB0aGUgSUNvbnRhaW5lcgotCQkJCXJldHVybiBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmdGaXJzdFNlZ21lbnRzKTsKLQkJCX0KLQkJCS8vIG5vdCBwYXJ0IG9mIHRoZSBJQ29udGFpbmVyCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBwYXRoIGlzIHJlbGF0aXZlCi0JCS8vIElzIHRoZSBwYXRoIHBhcnQgb2YgdGhlIElDb250YWluZXI/Ci0JCS8vVE9ETyBkb24ndCBoYXZlIHRpbWUgdG8gaW1wbGVtZW50IHRoaXMgbm93LCBidXQgc2hvdWxkIGluIGZ1dHVyZS4gLSBSdXRoCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlJ3MgdGFyZ2V0IG9iamVjdCwgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCwgc28gdGhhdCB0aGUKLQkgKiB1c2VyIGNhbiBsb2NhdGUgaXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya2JlbmNoRmlsZURlbHRhKSB7Ci0JCQlXb3JrYmVuY2hGaWxlRGVsdGEgd2ZkID0gKFdvcmtiZW5jaEZpbGVEZWx0YSkgb2JqZWN0OwotCQkJaWYgKHdmZC5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyByZXNvdXJjZSB3aWxsIGJlIG51bGwgaWYgV29ya2JlbmNoRmlsZURlbHRhIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGFuIE9iamVjdAotCQkJCS8vIGluc3RlYWQgb2YgYW4gSVJlc291cmNlCi0JCQkJcmV0dXJuIHdmZC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBPYmplY3QsIGlmIHRoZSBvYmplY3QgaGFzIGEgY29ycmVzcG9uZGluZyBJRmlsZSBpbiB0aGUgd29ya2JlbmNoLCByZXR1cm4gdGhlIElGaWxlLgotCSAqIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlci4gSW4gZWNsaXBzZSwgaW4gb3JkZXIgdG8gYWRkIG9yIHJlbW92ZSBhIHRhc2sKLQkgKiBsaXN0IGVudHJ5LCB0aGUgSVJlc291cmNlLCB0byB3aGljaCB0aGUgZW50cnkgYXBwbGllcywgbXVzdCBiZSBpZGVudGlmaWVkLiBUaGUgSVJlcG9ydGVyCi0JICogaW50ZXJmYWNlIHBhc3NlcyBpbiBhbiBPYmplY3QgaW4gdGhlc2UgbWV0aG9kczoKLQkgKiAKLQkgKiBhZGRWYWxpZGF0aW9uTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkgLy8gT2JqZWN0IGlzIGEgcGFydCBvZiBJTWVzc2FnZQotCSAqIAotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCksCi0JICogCi0JICogVGh1cywgdGhlIFdvcmtiZW5jaFJlcG9ydGVyIG5lZWRzIHRvIGtub3cgaG93LCBnaXZlbiB0aGUgT2JqZWN0LCB3aGljaCBJRmlsZSB0aGF0IHRoZSBPYmplY3QKLQkgKiByZXByZXNlbnRzIGluIHRoZSB3b3JrYmVuY2gsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gYWRkIHRoZSB0YXNrIGxpc3QgZW50cnkuCi0JICogCi0JICogSWYgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLCB0aGVuIHRoZSBXb3JrYmVuY2hSZXBvcnRlciB3aWxsIGFkZCB0aGUgbWVzc2FnZSB0byB0aGUgSVByb2plY3QKLQkgKiBpbnN0ZWFkIG9mIGFuIElGaWxlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrYmVuY2hGaWxlRGVsdGEpIHsKLQkJCS8vIHJlc291cmNlIG1heSBiZSBudWxsIGlmIFdvcmtiZW5jaEZpbGVEZWx0YSB3YXMgY29uc3RydWN0ZWQgZnJvbSBhbiBPYmplY3QgaW5zdGVhZCBvZgotCQkJLy8gYW4gSVJlc291cmNlCi0JCQlyZXMgPSAoKFdvcmtiZW5jaEZpbGVEZWx0YSkgb2JqKS5nZXRSZXNvdXJjZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzID0gKElSZXNvdXJjZSkgb2JqOwotCQl9Ci0KLQkJaWYgKChyZXMgPT0gbnVsbCkgfHwgKCFyZXMuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gZ2V0RmlsZShvYmopOwotCQl9Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgSVByb2plY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVKQk5hdHVyZVJ1bnRpbWUsIHJldHVybiB0aGUgSUphdmFQcm9qZWN0IHdoaWNoCi0JICogcmVwcmVzZW50cyBpdC4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLS8vCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotLy8JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gSU1lc3NhZ2UncyB0YXJnZXQgb2JqZWN0LCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyLCBvZiB0aGUgSUZpbGUsIHdoaWNoIHRoZSB0YXJnZXQKLQkgKiBvYmplY3QgcmVwcmVzZW50cy4gSWYgdGhlIG9iamVjdCBpcyBudWxsLCBvciBpZiBhY2Nlc3MgdG8gbGluZSBudW1iZXJzIGlzIG5vdCBwb3NzaWJsZSwKLQkgKiByZXR1cm4gIjAiLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKLQkJSVJlc291cmNlVXRpbCB1dGlsID0gVmFsaWRhdG9yTWFuYWdlci5nZXRSZXNvdXJjZVV0aWwoKTsKLQkJaWYgKHV0aWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIHV0aWwuZ2V0TGluZU5vKG9iamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaENvbnRleHQuZ2V0TGluZU5vKE9iamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybiBJTWVzc2FnZS5MSU5FTk9fVU5TRVQ7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhbiBJTWVzc2FnZSdzIHRhcmdldCBvYmplY3QsIHJldHVybiB0aGUgbGluZSBudW1iZXIsIG9mIHRoZSBJRmlsZSwgd2hpY2ggdGhlIHRhcmdldAotCSAqIG9iamVjdCByZXByZXNlbnRzLCBpZiBwb3NzaWJsZS4gSWYgdGhlIG9iamVjdCBpcyBudWxsLCBvciBpZiBhY2Nlc3MgdG8gbGluZSBudW1iZXJzIGlzIG5vdAotCSAqIHBvc3NpYmxlLCByZXR1cm4gYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgSVJlc291cmNlIGlzIGFuIElGaWxlLCBJRm9sZGVyLCBvciBJUHJvamVjdC4KLQkgKiBMaW5lIG51bWJlcnMgYXJlIHZhbGlkIG9ubHkgZm9yIElGaWxlIHR5cGVzOyBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGFuIElGaWxlLCB0aGVuIGEgdGV4dAotCSAqIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGJlIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oT2JqZWN0IG9iamVjdCkgewotCQlJUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2Uob2JqZWN0KTsKLQkJaWYgKChyZXMgPT0gbnVsbCkgfHwgIShyZXMgaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQkvLyByZXR1cm4gYSB0ZXh0IGRlc2NyaXB0aW9uCi0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24ob2JqZWN0KTsKLQkJLy8gZGVmYXVsdCB0byBhIGxpbmUgbnVtYmVyLCBpZiBpdCdzIGF2YWlsYWJsZS4gRWxzZSwgdXNlIGEgdGV4dCBkZXNjcmlwdGlvbi4KLQkJaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTm8ob2JqZWN0KTsKLQkJaWYgKGxpbmVOdW1iZXIgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24ob2JqZWN0KTsKLQkJfQotCQkvLyByZXR1cm4gdGhlIGxpbmUgbnVtYmVyCi0JCXJldHVybiBTdHJpbmcudmFsdWVPZihsaW5lTnVtYmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIG5hbWUgb2YgYSBsb2FkIG1ldGhvZCwgYW5kIHRoZSB0eXBlcyBvZiBwYXJhbWV0ZXJzIGl0IHRha2VzICh0aGlzIG1ldGhvZCBpcyBhbHdheXMKLQkgKiBjYWxsZWQgd2l0aCBudWxsIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyKSwgcmV0dXJuIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2gKLQkgKiByZXByZXNlbnRzIHRoZSBsb2FkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFybVR5cGVzKSB7Ci0JCU1ldGhvZCBtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW0gPSBnZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJtVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0OjpnZXRNZXRob2QoU3RyaW5nLCBDbGFzc1tdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gbTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hDb250ZXh0LmdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUHJvamVjdCB3aGljaCBpcyBhYm91dCB0byBiZSB2YWxpZGF0ZWQuIEVhY2ggSVdvcmtiZW5jaENvbnRleHQga25vd3MgaG93IHRvCi0JICogdHJhdmVyc2UgYSBjZXJ0YWluIHR5cGUgb2YgSVByb2plY3QsIGZvciBleGFtcGxlLCBhbiBFSkIgcHJvamVjdCBvciBhIHdlYiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCSAgLyoqCi0JICAgKiBHZXQgdGhlIElGaWxlIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICAgKiAKLQkgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZS4KLQkgICAqIEByZXR1cm4gQW4gSUZpbGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHNwZWNpZmllZCBvciBudWxsIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkLgotCSAgICovCi0JICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpCi0JICB7Ci0JICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZSBuYW1lID0gIiArIGZpbGVuYW1lKTsKLQkgICAgSVJlc291cmNlIHJlcyA9IGdldFByb2plY3QoKS5maW5kTWVtYmVyKGZpbGVuYW1lLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgCi0JICAgIHsKLQkgICAgICByZXR1cm4gKElGaWxlKSByZXM7Ci0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotCSAgICogdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0JICAgKiAKLQkgICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLQkgICAqIEByZXR1cm4gVGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgcmVsZXZhbnQgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3Mgc3BlY2lmaWVkLgotCSAgICovCi0JICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRGaWxlcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotCSAgewotCSAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCSAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICBnZXRGaWxlcyhmaWxlcywgcHJvamVjdCwgdmFsaWRhdG9yQ2xhc3NOYW1lKTsKLQkgICAgcmV0dXJuIGZpbGVzOwotCSAgfQotCi0JICAvKioKLQkgICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLQkgICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotCSAgICogCi0JICAgKiBAcGFyYW0gZmlsZXMgVGhlIGZpbGVzIHJlbGV2YW50IGZvciB0aGUgY2xhc3MgbmFtZS4KLQkgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgZmlsZXMgaW4uCi0JICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIGdldEZpbGVzKENvbGxlY3Rpb24gZmlsZXMsIElDb250YWluZXIgcmVzb3VyY2UsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgSVJlc291cmNlIFtdIHJlc291cmNlQXJyYXkgPSByZXNvdXJjZS5tZW1iZXJzKGZhbHNlKTsKLQkgICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VBcnJheS5sZW5ndGg7IGkrKykKLQkgICAgICB7ICAgICAgIAotCSAgICAgICAgaWYgKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQXBwbGljYWJsZVRvKHZhbGlkYXRvckNsYXNzTmFtZSwgcmVzb3VyY2VBcnJheVtpXSkpIAotCSAgICAgICAgewotCSAgICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXSBpbnN0YW5jZW9mIElGaWxlKSAKLQkJCQkgIGZpbGVzLmFkZChyZXNvdXJjZUFycmF5W2ldKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCSAgICAgICAgIGdldEZpbGVzKGZpbGVzLChJQ29udGFpbmVyKXJlc291cmNlQXJyYXlbaV0sIHZhbGlkYXRvckNsYXNzTmFtZSkgOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JICB9Ci0JICAKLQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewotLy8JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIE5PX0NPTlRBSU5FUlM7Ci0vLwkJfQotLy8KLS8vCQlJSmF2YVByb2plY3QganAgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLS8vCQlpZiAoanAgPT0gbnVsbCkgewotLy8JCQlyZXR1cm4gTk9fQ09OVEFJTkVSUzsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhqcCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvbGRlcnMgKG9yIHByb2plY3QpIHdoaWNoIGNvbnRhaW4gdGhlIC5qYXZhIHNvdXJjZSBmaWxlcy4KLQkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lcltdIGdldFByb2plY3RTb3VyY2VDb250YWluZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotLy8JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotLy8KLS8vCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCWNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cnVlIG1lYW5zIGlnbm9yZSB1bnJlc29sdmVkCi0vLwkJCS8vIChtaXNzaW5nKSB2YXJpYWJsZXMsIGluc3RlYWQgb2YKLS8vCQkJLy8gdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0vLwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotLy8JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLS8vCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0vLwkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLS8vCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hDb250ZXh0OjpnZXRQcm9qZWN0U291cmNlQ29udGFpbmVycyhJSmF2YVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotLy8JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBOT19DT05UQUlORVJTOwotLy8JCX0KLS8vCi0vLwkJLy8gVHJhdmVyc2UgdGhlIGNsYXNzcGF0aCwgYW5kIGNhbGN1bGF0ZSBhIGxpc3Qgb2YganVzdCB0aGUKLS8vCQkvLyBJRm9sZGVycyBhbmQgSVByb2plY3RzIChpLmUuLCBJQ29udGFpbmVycykgd2hpY2ggY29udGFpbiBzb3VyY2UKLS8vCQlJQ29udGFpbmVyW10gaWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lcltjbGFzc3BhdGgubGVuZ3RoXTsKLS8vCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLS8vCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotLy8JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLS8vCQkJCUlQYXRoIGVudHJ5UGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLS8vCQkJCUlQYXRoIHJlbEVudHJ5UGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChlbnRyeVBhdGgsIHByb2plY3QpOwotLy8JCQkJaWYgKHJlbEVudHJ5UGF0aCA9PSBudWxsKSB7Ci0vLwkJCQkJLy8gY2xhc3NwYXRoIGVudHJ5IHJlZmVycyB0byBzb21ldGhpbmcgd2hpY2ggZG9lc24ndCBleGlzdAotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCUlSZXNvdXJjZSBvdXRwdXRSZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZWxFbnRyeVBhdGgpOwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlID09IG51bGwpIHsKLS8vCQkJCQkvLyBjbGFzc3BhdGggZW50cnkgcmVmZXJzIHRvIHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGV4aXN0Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJaWYgKG91dHB1dFJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotLy8JCQkJCWljb250YWluZXJzW3ZhbGlkQ291bnQrK10gPSAoSUNvbnRhaW5lcikgb3V0cHV0UmVzb3VyY2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vICBmb2xsb3dpbmcgbGluZSBjYXVzZXMgYSBDbGFzc0Nhc3RFeGNlcHRpb24sIHNvIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBJQ29udGFpbmVycwotLy8JCS8vIGV4cGxpY2l0bHkKLS8vCQkvLwlyZXR1cm4gKElDb250YWluZXJbXSlpY29udGFpbmVycy50b0FycmF5KCk7Ci0vLwkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50XTsKLS8vCQlTeXN0ZW0uYXJyYXljb3B5KGljb250YWluZXJzLCAwLCBjb250YWluZXJzLCAwLCB2YWxpZENvdW50KTsKLS8vCQlyZXR1cm4gY29udGFpbmVyczsKLS8vCX0KLQotCXB1YmxpYyBpbnQgZ2V0UnVsZUdyb3VwKCkgewotCQlyZXR1cm4gX3J1bGVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGVuIGJ5IEFXb3JrYmVuY2hIZWxwZXJzLCBpZiB0aGV5IHdpc2ggdG8gcGVyZm9ybSBzb21lCi0JICogaW5pdGlhbGl6YXRpb24gb25jZSB0aGUgSVByb2plY3QgaXMgc2V0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCi0JICogCi0JICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHRvIGFub3RoZXIgSVdvcmtiZW5jaENvbnRleHQsIHRoZW4gdGhhdAotCSAqIElXb3JrYmVuY2hDb250ZXh0J3Mgc2V0UHJvamVjdCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHJlc291cmNlIGlzIGluIGFuIElKYXZhUHJvamVjdCwgYW5kIGlmIGl0IGlzIGluIG9uZSBvZiB0aGUgc291cmNlCi0JICogZm9sZGVycyBpbiB0aGUgSUphdmFQcm9qZWN0LiBJZiB0aGUgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIgaGFwcGVucyB0byBiZSB0aGUgcHJvamVjdCdzCi0JICogb3V0cHV0IGZvbGRlciB0b28sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuIElmIHJlcyBpcyBudWxsLCBvciBpcyBub3QgZm91bmQgaW4gb25lIG9mCi0JICogdGhlIHNvdXJjZSBjb250YWluZXJzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBmYWxzZS4KLQkgKi8KLS8vCXB1YmxpYyBib29sZWFuIGlzSW5KYXZhU291cmNlUGF0aChJUmVzb3VyY2UgcmVzKSB7Ci0vLwkJaWYgKHJlcyA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCUlDb250YWluZXJbXSBjb250YWluZXJzID0gZ2V0UHJvamVjdFNvdXJjZUNvbnRhaW5lcnMocmVzLmdldFByb2plY3QoKSk7Ci0vLwkJZm9yIChpbnQgYyA9IDA7IGMgPCBjb250YWluZXJzLmxlbmd0aDsgYysrKSB7Ci0vLwkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGdldENvbnRhaW5lclJlbGF0aXZlUGF0aChyZXMsIGNvbnRhaW5lcnNbY10pOwotLy8JCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwpIHsKLS8vCQkJCS8vIGZpbGUgaGFzIGJlZW4gZm91bmQKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCBhbmQgY2FuIGJlIGxvYWRlZCBieSBXb3JrYmVuY2hDb250ZXh0J3MKLQkgKiAibG9hZE1vZGVsIiBtZXRob2QuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWUgdGhlIGNvbW1lbnQgYWJvdmUgV29ya2JlbmNoQ29udGV4dCdzCi0JICogInJlZ2lzdGVyTW9kZWwiIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlpZiAoc3ltYm9saWNOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gX21vZGVsUmVnaXN0cnkuY29udGFpbnNLZXkoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIHN5bWJvbGljIG5hbWUsIGxvYWQgdGhlIE1PRiBtb2RlbCB3aGljaCBpcyBpZGVudGlmaWVkIGJ5IHRoYXQgbmFtZS4KLQkgKiAKLQkgKiBGb3Igc3VwcG9ydCBvZiBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoIGFzIGZpbGUgbmFtZXMsIHJlYWQgdGhlIGNvbW1lbnQgYWJvdmUgdGhlCi0JICogcmVnaXN0ZXJNb2RlbCBtZXRob2QuCi0JICogCi0JICogQHNlZSByZWdpc3Rlck1vZGVsCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gbG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzeW1ib2xpYyBuYW1lLCBsb2FkIHRoZSBNT0YgbW9kZWwgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGF0IG5hbWUuCi0JICogCi0JICogRm9yIHN1cHBvcnQgb2YgZHluYW1pYyBzeW1ib2xpYyBuYW1lcywgc3VjaCBhcyBmaWxlIG5hbWVzLCByZWFkIHRoZSBjb21tZW50IGFib3ZlIHRoZQotCSAqIHJlZ2lzdGVyTW9kZWwgbWV0aG9kLgotCSAqIAotCSAqIEBzZWUgcmVnaXN0ZXJNb2RlbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbG9hZGVyID0gKE1ldGhvZCkgX21vZGVsUmVnaXN0cnkuZ2V0KHN5bWJvbGljTmFtZSk7Ci0JCQlpZiAobG9hZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGxvYWRlci5pbnZva2UodGhpcywgcGFybXMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoQ29udGV4dDo6bG9hZE1vZGVsKFN0cmluZywgT2JqZWN0W10pIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaENvbnRleHQ6OmxvYWRNb2RlbChTdHJpbmcsIE9iamVjdFtdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCi0JCQkJaWYgKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaENvbnRleHQ6OmxvYWRNb2RlbChTdHJpbmcsIE9iamVjdFtdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaENvbnRleHQ6OmxvYWRNb2RlbChTdHJpbmcsIE9iamVjdFtdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRSdWxlR3JvdXAoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihnZXRSdWxlR3JvdXAoKSk7IC8vIGhhdmUgdG8gd3JhcCB0aGUgaW50IGluIGFuIEludGVnZXIgYmVjYXVzZSBjYW4ndCBjYXN0Ci0JCS8vIGFuIGludCB0byBhbiBPYmplY3QKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYnkKLQkgKiBWYWxpZGF0aW9uT3BlcmF0aW9uLCBiZWZvcmUgdGhlIElWYWxpZGF0b3IncyB2YWxpZGF0ZSBtZXRob2QgaXMgY2FsbGVkLCB0byBzZXQgdGhlIGdyb3VwIG9mCi0JICogcnVsZXMgd2hpY2ggdGhlIElWYWxpZGF0b3Igc2hvdWxkIGNoZWNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bGVHcm91cChpbnQgcmcpIHsKLQkJX3J1bGVHcm91cCA9IHJnOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgbG9hZCBtZXRob2QgZm9yIGEgc3ltYm9saWMgbmFtZS4gQSBsb2FkIG1ldGhvZCBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHdoaWNoIHRha2VzCi0JICogbm8gcGFyYW1ldGVycyBhbmQgcmV0dXJucyBhIFJlZk9iamVjdC4KLQkgKiAKLQkgKiBFdmVyeSBzdWJjbGFzcyBvZiBXb3JrYmVuY2hDb250ZXh0LCBmb3IgZXZlcnkgc3RhdGljIHR5cGUgb2Ygc3ltYm9saWMgbmFtZSB3aGljaCBpdCBzdXBwb3J0cywKLQkgKiBzaG91bGQgY2FsbCByZWdpc3Rlck1vZGVsLiBGb3IgSVdvcmtiZW5jaEhlbHBlcnMgd2hpY2ggc3VwcG9ydCBkeW5hbWljIHN5bWJvbGljIG5hbWVzLCBzdWNoCi0JICogYXMgZmlsZSBuYW1lcywgZWFjaCBJV29ya2JlbmNoQ29udGV4dCBzaG91bGQgb3ZlcnJpZGUgdGhlICJsb2FkTW9kZWwiIG1ldGhvZC4gVGhlaXIKLQkgKiAibG9hZE1vZGVsIiBzaG91bGQgZmlyc3QgY2FsbCB0aGlzIGNsYXNzJyAiaXNSZWdpc3RlcmVkIiBtZXRob2QgdG8gc2VlIGlmIHRoZXkncmUgZGVhbGluZwotCSAqIHdpdGggYSBzdGF0aWMgc3ltYm9saWMgbmFtZSwgb3IgYSBkeW5hbWljIG9uZS4gSWYgdGhlIHN5bWJvbGljIG5hbWUgaXMgcmVnaXN0ZXJlZCwgdGhlCi0JICogY2hpbGQncyAibG9hZE1vZGVsIiBtZXRob2Qgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgV29ya2JlbmNoQ29udGV4dCdzICJsb2FkTW9kZWwiCi0JICogbWV0aG9kLiBPdGhlcndpc2UsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlc3VsdCBiYXNlZCBvbiBpdHMgb3duIHByb2Nlc3NpbmcuCi0JICogCi0JICogV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBsb2FkIG1ldGhvZCBpZGVudGlmaWVkIGJ5IGxvYWRNZXRob2ROYW1lIGlzIGxvY2F0ZWQgJiBzdG9yZWQKLQkgKiBmb3IgZnV0dXJlIHJldHJpZXZhbCBieSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBXaGVuIHRoZSBJVmFsaWRhdG9yIGNhbGxzICJsb2FkTW9kZWwiIHdpdGggYQotCSAqIHN5bWJvbGljIG5hbWUsIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Qgd2hpY2ggd2FzIGxvYWRlZCBieSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBhbmQKLQkgKiB0aGUgcmVzdWx0IChSZWZPYmplY3QpIHJldHVybmVkIGJ5IHRoYXQgbWV0aG9kIGlzIHJldHVybmVkIGJ5ICJsb2FkTW9kZWwiLgotCSAqIAotCSAqIHN5bWJvbGljTmFtZSBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcuIGxvYWRNZXRob2ROYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlCi0JICogZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZ2lzdGVyTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIGxvYWRNZXRob2ROYW1lKSB7Ci0JCXJlZ2lzdGVyTW9kZWwoc3ltYm9saWNOYW1lLCBsb2FkTWV0aG9kTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBsb2FkIG1ldGhvZCBmb3IgYSBzeW1ib2xpYyBuYW1lLiBBIGxvYWQgbWV0aG9kIGlzIGRlZmluZWQgYXMgYSBtZXRob2Qgd2hpY2ggdGFrZXMKLQkgKiBubyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgUmVmT2JqZWN0LgotCSAqIAotCSAqIEV2ZXJ5IHN1YmNsYXNzIG9mIFdvcmtiZW5jaENvbnRleHQsIGZvciBldmVyeSBzdGF0aWMgdHlwZSBvZiBzeW1ib2xpYyBuYW1lIHdoaWNoIGl0IHN1cHBvcnRzLAotCSAqIHNob3VsZCBjYWxsIHJlZ2lzdGVyTW9kZWwuIEZvciBJV29ya2JlbmNoSGVscGVycyB3aGljaCBzdXBwb3J0IGR5bmFtaWMgc3ltYm9saWMgbmFtZXMsIHN1Y2gKLQkgKiBhcyBmaWxlIG5hbWVzLCBlYWNoIElXb3JrYmVuY2hDb250ZXh0IHNob3VsZCBvdmVycmlkZSB0aGUgImxvYWRNb2RlbCIgbWV0aG9kLiBUaGVpcgotCSAqICJsb2FkTW9kZWwiIHNob3VsZCBmaXJzdCBjYWxsIHRoaXMgY2xhc3MnICJpc1JlZ2lzdGVyZWQiIG1ldGhvZCB0byBzZWUgaWYgdGhleSdyZSBkZWFsaW5nCi0JICogd2l0aCBhIHN0YXRpYyBzeW1ib2xpYyBuYW1lLCBvciBhIGR5bmFtaWMgb25lLiBJZiB0aGUgc3ltYm9saWMgbmFtZSBpcyByZWdpc3RlcmVkLCB0aGUKLQkgKiBjaGlsZCdzICJsb2FkTW9kZWwiIG1ldGhvZCBzaG91bGQganVzdCByZXR1cm4gdGhlIHJlc3VsdCBvZiBXb3JrYmVuY2hDb250ZXh0J3MgImxvYWRNb2RlbCIKLQkgKiBtZXRob2QuIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVzdWx0IGJhc2VkIG9uIGl0cyBvd24gcHJvY2Vzc2luZy4KLQkgKiAKLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGxvYWQgbWV0aG9kIGlkZW50aWZpZWQgYnkgbG9hZE1ldGhvZE5hbWUgaXMgbG9jYXRlZCAmIHN0b3JlZAotCSAqIGZvciBmdXR1cmUgcmV0cmlldmFsIGJ5IHRoZSAibG9hZE1vZGVsIiBtZXRob2QuIFdoZW4gdGhlIElWYWxpZGF0b3IgY2FsbHMgImxvYWRNb2RlbCIgd2l0aCBhCi0JICogc3ltYm9saWMgbmFtZSwgdGhlIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCB3aGljaCB3YXMgbG9hZGVkIGJ5IHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIGFuZAotCSAqIHRoZSByZXN1bHQgKFJlZk9iamVjdCkgcmV0dXJuZWQgYnkgdGhhdCBtZXRob2QgaXMgcmV0dXJuZWQgYnkgImxvYWRNb2RlbCIuCi0JICogCi0JICogc3ltYm9saWNOYW1lIG11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZy4gbG9hZE1ldGhvZE5hbWUgbXVzdCBub3QgYmUgbnVsbCBvciB0aGUKLQkgKiBlbXB0eSBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVnaXN0ZXJNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgbG9hZE1ldGhvZE5hbWUsIENsYXNzW10gcGFybXMpIHsKLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZChsb2FkTWV0aG9kTmFtZSwgcGFybXMpOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJMb2FkIG1ldGhvZCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobG9hZE1ldGhvZE5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyAocGFybXMgIT0gbnVsbCkgJiYgKGkgPCBwYXJtcy5sZW5ndGgpOyBpKyspIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChwYXJtc1tpXSk7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoIikgbXVzdCBleGlzdC4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjYW5ub3Qgc3VwcG9ydCBtb2RlbCAiICsgc3ltYm9saWNOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLnJlYWRFeHRlbnNpb24oSUV4dGVuc2lvbikiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRleHQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlfbW9kZWxSZWdpc3RyeS5wdXQoc3ltYm9saWNOYW1lLCBtZXRob2QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciBmdWxsIG9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24gaXMgcnVubmluZywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGZvciBldmVyeQotCSAqIElSZXNvdXJjZSB3aGljaCBpcyBmaWx0ZXJlZCBpbiBieSB0aGUgSVZhbGlkYXRvciwgc28gdGhhdCB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGNhbiByZWNlaXZlCi0JICogbm90aWZpY2F0aW9uIHRoYXQgb25lIG9mIHRoZSByZXNvdXJjZXMsIHdoaWNoIHZhbGlkYXRpb24gd2lsbCBydW4gb24sIGlzIGJlaW5nIGZpbHRlcmVkIGluLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIGRlZmF1bHQ6IGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFZhbGlkYXRpb24gRnJhbWV3b3JrLCB0byBpbml0aWFsaXplIHRoZSBJV29ya2JlbmNoQ29udGV4dCBzbyB0aGF0Ci0JICogaXQgY2FuIGdhdGhlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QuCi0JICogCi0JICogSWYgYW4gSVdvcmtiZW5jaENvbnRleHQgZGVsZWdhdGVzIHNvbWUgbW9kZWwgbG9hZGluZyB0byBhbm90aGVyIElXb3JrYmVuY2hDb250ZXh0LCB0aGlzIG1ldGhvZAotCSAqIHNob3VsZCBiZSBvdmVycmlkZW4gc28gdGhhdCB0aGUgZGVsZWdhdGVlIElXb3JrYmVuY2hDb250ZXh0IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0KLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJLy8gUHJvamVjdCB3aWxsIGJlIHNldCBiYWNrIHRvIG51bGwgb25jZSB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdCBpcyBjb21wbGV0ZS4KLQkJCWluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgSVdvcmtiZW5jaENvbnRleHQgdGhhdCB0aGUgVmFsaWRhdGlvbiBGcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4gVGhlcmUgd2lsbCBiZQotCSAqIGNhbGxzIHRvIGNsb3NpbmcoSVByb2plY3QpIGFuZCBwb3NzaWJseSBkZWxldGluZyhJUHJvamVjdCkgZm9sbG93aW5nIHRoaXMgY2FsbCwgYnV0IHRoZQotCSAqIHJlc291cmNlcyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQgYnkgdGhlIHRpbWUgdGhhdCB0aG9zZSBtZXRob2RzIGFyZSBjYWxsZWQsIHNvIEVWRVJZVEhJTkcKLQkgKiBzaG91bGQgYmUgY2xlYW5lZCB1cCBpbiB0aGlzIG1ldGhvZC4gVGhlIHBhcmFtZXRlciBwYXNzZWQgaW4gaXMgdGhlIHByb2plY3Qgd2hpY2ggaXMgYWJvdXQgdG8KLQkgKiBzaHV0IGRvd24uIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IElQcm9qZWN0IGluIHRoZSB3b3JrYmVuY2guIFRoZSBJUHJvamVjdAotCSAqIG1heSwgb3IgbWF5IG5vdCwgYmUgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQkvLyBEZWZhdWx0IGlzIHRvIGFzc3VtZSB0aGF0IG5vIHJlc291cmNlcyB3ZXJlIGFsbG9jYXRlZDsgdGhlcmVmb3JlLAotCQkvLyBubyBjbGVhbnVwIG5lZWRzIHRvIGJlIGRvbmUuCi0JCXNodXRkb3duKGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBJV29ya2JlbmNoQ29udGV4dCB0aGF0IHRoZSBWYWxpZGF0aW9uIEZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLiBUaGVyZSB3aWxsIGJlCi0JICogY2FsbHMgdG8gY2xvc2luZyhJUHJvamVjdCkgYW5kIHBvc3NpYmx5IGRlbGV0aW5nKElQcm9qZWN0KSBmb2xsb3dpbmcgdGhpcyBjYWxsLCBidXQgdGhlCi0JICogcmVzb3VyY2VzIG1heSBhbHJlYWR5IGJlIGNsb3NlZCBieSB0aGUgdGltZSB0aGF0IHRob3NlIG1ldGhvZHMgYXJlIGNhbGxlZCwgc28gRVZFUllUSElORwotCSAqIHNob3VsZCBiZSBjbGVhbmVkIHVwIGluIHRoaXMgbWV0aG9kLiBUaGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyB0aGUgcHJvamVjdCB3aGljaCBpcyBhYm91dCB0bwotCSAqIHNodXQgZG93bi4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgZXZlcnkgSVByb2plY3QgaW4gdGhlIHdvcmtiZW5jaC4gVGhlIElQcm9qZWN0Ci0JICogbWF5LCBvciBtYXkgbm90LCBiZSBjbG9zZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgT3ZlcnJpZGUgc2h1dGRvd24oKSBpbnN0ZWFkLCBhbmQgdXNlIGdldFByb2plY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gRGVmYXVsdCBpcyB0byBhc3N1bWUgdGhhdCBubyByZXNvdXJjZXMgd2VyZSBhbGxvY2F0ZWQ7IHRoZXJlZm9yZSwKLQkJLy8gbm8gY2xlYW51cCBuZWVkcyB0byBiZSBkb25lLgotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCVN0cmluZ1tdIHVyaXMgPSBuZXcgU3RyaW5nW3ZhbGlkYXRpb25GaWxlVVJJcy5zaXplKCldOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvbkZpbGVVUklzLnNpemUoKTsgaSsrKSAKLQkJCXVyaXNbaV0gPSAoU3RyaW5nKSB2YWxpZGF0aW9uRmlsZVVSSXMuZ2V0KGkpOwotCQlyZXR1cm4gdXJpczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkYXRpb25GaWxlVVJJcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRWYWxpZGF0aW9uRmlsZVVSSXMoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW9uRmlsZVVSSXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkYXRpb25GaWxlVVJJcyBUaGUgdmFsaWRhdGlvbkZpbGVVUklzIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uRmlsZVVSSXMoTGlzdCB2YWxpZGF0aW9uRmlsZVVSSXMpIHsKLQkJdGhpcy52YWxpZGF0aW9uRmlsZVVSSXMgPSB2YWxpZGF0aW9uRmlsZVVSSXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaEZpbGVEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTUzZTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hGaWxlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotCi0KLS8qKgotICogRWNsaXBzZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBGaWxlRGVsdGEgd2hpY2ggYWxzbyBjYWNoZXMgdGhlIElSZXNvdXJjZSB3aGljaCBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZSBGaWxlRGVsdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hGaWxlRGVsdGEgZXh0ZW5kcyBGaWxlRGVsdGEgewotCXByaXZhdGUgSVJlc291cmNlIF9yZXNvdXJjZTsKLQlwcml2YXRlIE9iamVjdCBfY2hhbmdlZFJlc291cmNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJGSUxFIE5BTUU6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQSA9ICIgIERFTFRBOiAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFID0gIiAgUkVTT1VSQ0U6ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIiAgT0JKRUNUOiAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgV29ya2JlbmNoRmlsZURlbHRhKFN0cmluZyBhRmlsZU5hbWUsIGludCBhRmlsZURlbHRhLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIoYUZpbGVOYW1lLCBhRmlsZURlbHRhKTsKLQkJc2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlzZXRPYmplY3QocmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBXb3JrYmVuY2hGaWxlRGVsdGEoT2JqZWN0IGNoYW5nZWRSZXNvdXJjZSkgewotCQlzdXBlcihudWxsLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQlzZXRPYmplY3QoY2hhbmdlZFJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gX3Jlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY2hhbmdlZCByZXNvdXJjZSBpcyBub3QgYW4gSVJlc291cmNlIChlLmcuLCBhIFJlZk9iamVjdCksIHRoZW4gdGhlIGdldEZpbGVOYW1lIG1ldGhvZAotCSAqIHdpbGwgcmV0dXJuIG51bGwsIGdldFJlc291cmNlIHdpbGwgcmV0dXJuIG51bGwsIGFuZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgb2JqZWN0LiBJZgotCSAqIHRoZSBjaGFuZ2VkUmVzb3VyY2UgaXMgYW4gSVJlc291cmNlLCB0aGVuIGJvdGggdGhpcyBtZXRob2QgYW5kIHRoZSBnZXRSZXNvdXJjZSBtZXRob2Qgd2lsbAotCSAqIHJldHVybiB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBfY2hhbmdlZFJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG8pIHsKLQkJX2NoYW5nZWRSZXNvdXJjZSA9IG87Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoRklMRV9OQU1FKTsKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRGaWxlTmFtZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoREVMVEEpOwotCQlidWZmZXIuYXBwZW5kKGdldERlbHRhVHlwZSgpKTsKLQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0UmVzb3VyY2UoKSkpOwotCQlidWZmZXIuYXBwZW5kKE9CSkVDVCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZ2V0T2JqZWN0KCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Xb3JrYmVuY2hSZXBvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDlhNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1dvcmtiZW5jaFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBJVmFsaWRhdG9yIGluc3RhbmNlcyB3aWxsIGludGVyYWN0IHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgYnV0IHNob3VsZCBuZXZlciBjYXN0IHRoYXQKLSAqIElSZXBvcnRlciBpbnN0YW5jZSB0byBXb3JrYmVuY2hSZXBvcnRlci4gVGhlIFdvcmtiZW5jaFJlcG9ydGVyIGNsYXNzIHdpbGwgYmUgbW92ZWQgaW4gTWlsZXN0b25lCi0gKiA0LgotICogCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdXNlciBhbmQgdGhlIElWYWxpZGF0b3IgaW4gdGhlIGVjbGlwc2Ugd29ya2JlbmNoCi0gKiBlbnZpcm9ubWVudC4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IgSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBNYW55Ci0gKiByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgotICogCi0gKiBPbmx5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBtYXkgaW5zdGFudGlhdGUgb3IgYWx0ZXIgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFdvcmtiZW5jaFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19NRVNTQUdFX0xJTUlUID0gLTE7Ci0KLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBfbW9uaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgbWVzc2FnZU93bmVyLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIG1lc3NhZ2VPd25lciwgbnVsbCwgbWVzc2FnZSk7IC8vIG51bGwgQ2xhc3NMb2FkZXIgPSB1c2UgdGhlIGRlZmF1bHQKLQkJLy8gKGNsYXp6LmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZShJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIG1lc3NhZ2VPd25lciwgQ2xhc3NMb2FkZXIgY2wsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJYWRkTWVzc2FnZShyZXNvdXJjZSwgbWVzc2FnZU93bmVyLCBjbCwgbWVzc2FnZSwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgQ2xhc3MgY2xhenosIElNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJYWRkTWVzc2FnZShyZXNvdXJjZSwgY2xhenosIG51bGwsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsgLy8gbnVsbCA9IHVzZSB0aGUKLQkJLy8gZGVmYXVsdAotCQkvLyBDbGFzc0xvYWRlcgotCQkvLyAoY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgSU1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbixTdHJpbmcgbWFya2VySWQpIHsKLQkJYWRkTWVzc2FnZShyZXNvdXJjZSwgY2xhenosIG51bGwsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uLG1hcmtlcklkKTsgLy8gbnVsbCA9IHVzZSB0aGUKLQkJLy8gZGVmYXVsdAotCQkvLyBDbGFzc0xvYWRlcgotCQkvLyAoY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkKLQl9Ci0JCi0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZShJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIGNsYXp6LCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNsID09IG51bGwpIHsKLQkJCWNsID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJfQotCi0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGdldFVuaXF1ZUlkKGNsYXp6KSwgY2wsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyBjbGF6eiwgQ2xhc3NMb2FkZXIgY2wsIElNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtYXJrZXJJZCkgewotCQlpZiAoKGNsYXp6ID09IG51bGwpIHx8IChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGNsID09IG51bGwpIHsKLQkJCWNsID0gY2xhenouZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJfQotCi0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIGdldFVuaXF1ZUlkKGNsYXp6KSwgY2wsIG1lc3NhZ2UsIHRhcmdldE9iamVjdE5hbWUsIGxvY2F0aW9uLCBtYXJrZXJJZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZU93bmVySWQsIENsYXNzTG9hZGVyIGNsLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZE1lc3NhZ2UocmVzb3VyY2UsIG1lc3NhZ2VPd25lcklkLCBjbCwgbWVzc2FnZSwgbnVsbCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2UoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZU93bmVySWQsIENsYXNzTG9hZGVyIGNsLCBJTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWludCBzZXZlcml0eSA9IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLQkJdHJ5IHsKLQkJCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKG1lc3NhZ2VPd25lcklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRUZXh0KGNsKSwgc2V2ZXJpdHksdGFyZ2V0T2JqZWN0TmFtZSwgbWVzc2FnZS5nZXRHcm91cE5hbWUoKSwgbWVzc2FnZS5nZXRPZmZzZXQoKSwgbWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBDb3VsZG4ndCBhZGQgdGhlIHRhc2sgdG8gdGhlIHRhc2sgbGlzdCBmb3Igc29tZSByZWFzb24uLi4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLmFkZE1lc3NhZ2UoQ2xhc3MsLCBJUmVzb3VyY2UsIElNZXNzYWdlLCBTdHJpbmcsIFN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2VPd25lcklkLCBDbGFzc0xvYWRlciBjbCwgSU1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1hcmtlcklkKSB7Ci0JCWludCBzZXZlcml0eSA9IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLQkJdHJ5IHsKLQkJCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKG1lc3NhZ2VPd25lcklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRUZXh0KGNsKSwgc2V2ZXJpdHksbWFya2VySWQsdGFyZ2V0T2JqZWN0TmFtZSwgbWVzc2FnZS5nZXRHcm91cE5hbWUoKSwgbWVzc2FnZS5nZXRPZmZzZXQoKSwgbWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBDb3VsZG4ndCBhZGQgdGhlIHRhc2sgdG8gdGhlIHRhc2sgbGlzdCBmb3Igc29tZSByZWFzb24uLi4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLmFkZE1lc3NhZ2UoQ2xhc3MsLCBJUmVzb3VyY2UsIElNZXNzYWdlLCBTdHJpbmcsIFN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElSZXNvdXJjZSByZXNvdXJjZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3IpOwotCQlpZiAodm1kID09IG51bGwpIHsKLQkJCS8vIGxvZwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJdHJ5IHsKLQkJCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgdmFsaWRhdG9yTmFtZXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJLy8gQ291bGRuJ3QgcmVtb3ZlIHRoZSB0YXNrIGZyb20gdGhlIHRhc2sgbGlzdCBmb3Igc29tZSByZWFzb24uLi4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKFN0cmluZ1tdLCBJUmVzb3VyY2UsIFN0cmluZykiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gU2hvdWxkIG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgdmFsaWRhdGlvbgotCSAqICAgICAgICAgICAgIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVJlc291cmNlIHJlc291cmNlLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJLy8gbG9nCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcyA9IHZtZC5nZXRWYWxpZGF0b3JOYW1lcygpOwotCQl0cnkgewotCQkJLy9TdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSA9IGdldFRhcmdldE9iamVjdE5hbWUodm1kLmdldEhlbHBlcihyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBvYmplY3QpOwotCQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKCBnZXRIZWxwZXIoIHJlc291cmNlLmdldFByb2plY3QoKSwgdmFsaWRhdG9yKSwgb2JqZWN0KTsJCQkKLQkJCXJlbW92ZUFsbE1lc3NhZ2VzKHJlc291cmNlLCB2YWxpZGF0b3JOYW1lcywgdGFyZ2V0T2JqZWN0TmFtZSk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJZmluYWwgTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoUmVwb3J0ZXI6OnJlbW92ZUFsbE1lc3NhZ2VzKElSZXNvdXJjZSwgSVZhbGlkYXRvciwgT2JqZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzLCB0YXJnZXRPYmplY3ROYW1lKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIENvdWxkbid0IHJlbW92ZSB0aGUgdGFzayBmcm9tIHRoZSB0YXNrIGxpc3QgZm9yIHNvbWUgcmVhc29uLi4uCi0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhTdHJpbmdbXSwgSVJlc291cmNlLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIG1lc3NhZ2VPd25lciwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtnZXRVbmlxdWVJZChtZXNzYWdlT3duZXIpfSwgbnVsbCwgZ3JvdXBOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtZXNzYWdlT3duZXJJZCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGUgYWRkTWVzc2FnZShDbGFzcywgSU1lc3NhZ2UpIGlzIGRlZmF1bHRlZCB0byB0aGUgSVByb2plY3QsCi0JCS8vIHJlbW92ZSB0aGUgbWVzc2FnZSBzdWJzZXRzIGZyb20gdGhlIElQcm9qZWN0Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXttZXNzYWdlT3duZXJJZH0sIG51bGwsIGdyb3VwTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcklkLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQl0cnkgewotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZVRhc2tTdWJzZXQocmVzb3VyY2UsIG93bmVySWQsIHRhcmdldE9iamVjdE5hbWUsIGdyb3VwTmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBDb3VsZG4ndCByZW1vdmUgdGhlIHRhc2sgdG8gdGhlIHRhc2sgbGlzdCBmb3Igc29tZSByZWFzb24uLi4KLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZU1lc3NhZ2VTdWJzZXQoU3RyaW5nW10sIElSZXNvdXJjZSwgU3RyaW5nLCBTdHJpbmcpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIENsYXNzIGluc3RhbmNlLCByZXR1cm4gdGhlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGluc3RhbmNlLiAoVXNlZCBhcyB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhlIG1lc3NhZ2Ugb3duZXIuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKENsYXNzIGNsYXp6KSB7Ci0JCWlmIChjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEl0IGlzIHNhZmUgdG8gbG9hZCB0aGlzIFN0cmluZyBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UgYmVjYXVzZQotCQkvLyB0aGUgQ2xhc3MgbmFtZSB3aWxsIG5vdCBjaGFuZ2UgZHVyaW5nIFdTQUQncyBzZXNzaW9uLgotCQlyZXR1cm4gY2xhenouZ2V0TmFtZSgpLmludGVybigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUlkKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFVuaXF1ZUlkKHZhbGlkYXRvci5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRNc2dMb2dnZXIoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCX0KLQotCQlyZXR1cm4gdm1kLmdldE1zZ0xvZ2dlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25UZXh0KGhlbHBlciwgbnVsbCk7Ci0JCX0KLQkJaW50IGxpbmVObyA9IG1lc3NhZ2UuZ2V0TGluZU51bWJlcigpOwotCQlpZiAobGluZU5vID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uVGV4dChoZWxwZXIsIG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZihsaW5lTm8pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uVGV4dChJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxvY2F0aW9uID0gaGVscGVyLmdldExvY2F0aW9uKHRhcmdldE9iamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLmdldExvY2F0aW9uVGV4dChPYmplY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChsb2NhdGlvbiA9PSBudWxsKSB8fCAobG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2F0aW9uID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcm90ZWN0ZWQgZm9yIHRoZSBTYWJlclJlcG9ydGVyLiBNYWtlIHRoaXMgbWV0aG9kIHByaXZhdGUgYWdhaW4KLQkvLyBvbmNlIHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMgSU1hcmtlci5QUklPUklUWS4KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG51bGwpOwotCQl9Ci0JCXJldHVybiBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoSVdvcmtiZW5jaENvbnRleHQgaGVscGVyLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRhcmdldE9iamVjdE5hbWUgPSBoZWxwZXIuZ2V0VGFyZ2V0T2JqZWN0TmFtZSh0YXJnZXRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlci5nZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0TmFtZTsKLQl9Ci0KLQkvLyBUT0RPIFRoaXMgbWV0aG9kIHdhcyBtYWRlICJwcm90ZWN0ZWQiIGZvciB0aGUgU2FiZXJSZXBvcnRlci4gRG8gbm90IGNhbGwgdGhpcyBtZXRob2QhIFRoaXMKLQkvLyBtZXRob2Qgd2lsbCBiZSBtYWRlIHByaXZhdGUgb25jZSBzdXBwb3J0IGZvciBtYXJrZXIgUFJJT1JJVFkgYXR0cmlidXRlcyBpcyBpbiB0aGUgZnJhbWV3b3JrLgotCXByb3RlY3RlZCBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0Vk1EKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvcik7Ci0JCWlmICh2bWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBhbHJlYWR5IGxvZ2dlZCBpbiB0aGUgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyCi0JCX0KLQkJcmV0dXJuIHZtZDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZC4gVGhlIElWYWxpZGF0aW9uQ29udGV4dCB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFJlcG9ydGVyKElXb3JrYmVuY2hDb250ZXh0IGhlbHBlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQW4gSVJlcG9ydGVyIGluc3RhbmNlIG11c3QgZXhpc3QgZm9yIGVhY2ggUnVubmFibGUgaW4gb3JkZXIgZm9yIHRoZSB2YWxpZGF0b3IgdG8gcmVwb3J0Ci0JICogc3RhdHVzIG1lc3NhZ2VzLiBJUHJvamVjdCBhbmQgSVByb2dyZXNzTW9uaXRvciBtdXN0IG5vdCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBXb3JrYmVuY2hSZXBvcnRlcihJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIoKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfbW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLy8gVE9ETyBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcm90ZWN0ZWQgZm9yIHRoZSBTYWJlclJlcG9ydGVyLiBNYWtlIGl0IHByaXZhdGUgYWdhaW4gb25jZSB0aGUKLQkvLyBmcmFtZXdvcmsgc3VwcG9ydCBJTWFya2VyLlBSSU9SSVRZLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQ29udGV4dCBnZXRIZWxwZXIoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWTUQodmFsaWRhdG9yKTsKLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gdm1kLmdldEhlbHBlciggZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3IgKTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJV29ya2JlbmNoQ29udGV4dCBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWTUQodmFsaWRhdG9yKTsKLQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gdm1kLmdldEhlbHBlciggcHJvamVjdCwgdmFsaWRhdG9yICk7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gX21vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXREZWZhdWx0UmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBwcmogPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcmogIT0gbnVsbCkgewotCQkJcmV0dXJuIHByajsKLQkJfQotCQkvLyByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gYW4gSU1lc3NhZ2UgaXMgY3JlYXRlZCwgdGhlIHVzZXIgaGFzIHRoZSBvcHRpb24gb2YgY3JlYXRpbmcgaXQgd2l0aCBhIHRhcmdldCBvYmplY3QuCi0JICogVGhhdCB0YXJnZXQgb2JqZWN0IGlzIHVzZWQgdG8gaWRlbnRpZnkgd2hpY2ggb2JqZWN0IGhhcyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZQotCSAqIElNZXNzYWdlLiBUaGlzIG1ldGhvZCwgZ2l2ZW4gdGhlIHRhcmdldCBvYmplY3QsIHJldHVybnMgdGhlIElSZXNvdXJjZSB3aGljaCByZXByZXNlbnRzIHRoYXQKLQkgKiBvYmplY3QgaW4gdGhlIHdvcmtiZW5jaC4KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldE1lc3NhZ2VSZXNvdXJjZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBvYmplY3Q7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtiZW5jaEZpbGVEZWx0YSkgewotCQkJCS8vIHJlc291cmNlIG1heSBiZSBudWxsIGlmIHRoZSBXb3JrYmVuY2hGaWxlRGVsdGEgd2FzIGNvbnN0cnVjdGVkIGZyb20gYW4gT2JqZWN0Ci0JCQkJLy8gaW5zdGVhZCBvZiBhbiBJUmVzb3VyY2UKLQkJCQlyZXNvdXJjZSA9ICgoV29ya2JlbmNoRmlsZURlbHRhKSBvYmplY3QpLmdldFJlc291cmNlKCk7Ci0JCQl9Ci0KLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaENvbnRleHQgaGVscGVyID0gZ2V0SGVscGVyKHZhbGlkYXRvcik7Ci0JCQkJCXJlc291cmNlID0gaGVscGVyLmdldFJlc291cmNlKG9iamVjdCk7Ci0JCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkJCQkvLyBpbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IsIGFuZCBpZiB0aGUgdmFsaWRhdG9yIGlzIGludm9rZWQsIGl0J3MgbGlrZWx5Ci0JCQkJCQkvLyB0aGF0IHRoZSBoZWxwZXIgaGFzIGJlZW4gbG9hZGVkIHRvby4KLQkJCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGdldFZNRCh2YWxpZGF0b3IpOwotCi0JCQkJCQkvLyBSZW1vdmUgdGhlIHZtZCBmcm9tIHRoZSByZWFkZXIncyBsaXN0Ci0JCQkJCQlWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZGlzYWJsZVZhbGlkYXRvcih2bWQpOwotCi0JCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoUmVwb3J0ZXI6OmdldE1lc3NhZ2VSZXNvdXJjZShJVmFsaWRhdG9yLCBPYmplY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMyKSB7Ci0JCQkJCQkvLyBFdmVuIHRoZSBJVmFsaWRhdG9yIGlzIGludmFsaWQuIFVuZm9ydHVuYXRlbHksIGNhbid0IGRpc2FibGUgdGhlCi0JCQkJCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkJCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyOjpnZXRNZXNzYWdlUmVzb3VyY2UoSVZhbGlkYXRvciwgT2JqZWN0KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4YzIpOwotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJLy8gRXZlbiB0aGUgSVZhbGlkYXRvciBpcyBpbnZhbGlkLiBVbmZvcnR1bmF0ZWx5LCBjYW4ndCBkaXNhYmxlIHRoZQotCQkJCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlcjo6Z2V0TWVzc2FnZVJlc291cmNlKElWYWxpZGF0b3IsIE9iamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyLmdldE1lc3NhZ2VSZXNvdXJjZShJVmFsaWRhdG9yLCBPYmplY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gZ2V0RGVmYXVsdFJlc291cmNlKCk7Ci0JCX0KLQotCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQlyZXNvdXJjZSA9IGdldERlZmF1bHRSZXNvdXJjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNob3cgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGluZGljYXRpbmcgd2hpY2ggc3VidGFzayBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPm1lc3NhZ2U8L2NvZGU+IG1heSBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuIDxicj4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1lc3NhZ2UuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGdldFByb2dyZXNzTW9uaXRvcigpICE9IG51bGwpIHsKLQkJCWdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2sobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjZ2V0TWVzc2FnZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQlpZiAoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLmNvcmUuSVJlcG9ydGVyI2FkZE1lc3NhZ2UoSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0TWVzc2FnZVJlc291cmNlKHZhbGlkYXRvciwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSk7Ci0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGdldFZNRCh2YWxpZGF0b3IpOwotCQl0cnkgewotCQkJaGVscGVyID0gZ2V0SGVscGVyKHZhbGlkYXRvcik7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQl0cnkgewotCQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJCS8vIHRoYXQgdGhlIGhlbHBlciBoYXMgYmVlbiBsb2FkZWQgdG9vCi0JCQkJCi0JCQkJCi0JCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0KLQkJCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyOjphZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMyKSB7Ci0JCQkJbG9nRGlzYWJsZWRWYWxpZGF0b3IoZXhjMik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQlsb2dEaXNhYmxlZFZhbGlkYXRvcihleGMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlci5hZGRNZXNzYWdlKElWYWxpZGF0b3IsIE1lc3NhZ2UpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFKTsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoUmVzb3VyY2VDb25zdGFudHMuVkJGX0VYQ19JTlZBTElEX1JFU09VUkNFKSwgbmV3IFN0cmluZ1tde21lc3NhZ2UuZ2V0VGV4dCgpLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSl9KTsKLQkJCQllbnRyeS5zZXRUZXh0KHJlc3VsdCk7CQkJCQotCQkJCS8vZW50cnkuc2V0VG9rZW5zKG5ldyBTdHJpbmdbXXttZXNzYWdlLmdldFRleHQoKSwgZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG1lc3NhZ2UpfSk7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLkZJTkUsIGVudHJ5KTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCQljYWNoZU1lc3NhZ2UoIChJVmFsaWRhdG9ySm9iKXZhbGlkYXRvciwgcmVzb3VyY2UsIHZhbGlkYXRvci5nZXRDbGFzcygpLCBtZXNzYWdlLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSksIGdldExvY2F0aW9uKGhlbHBlciwgbWVzc2FnZSksIGdldE1hcmtlcklkKHZtZCwgbWVzc2FnZSkgKTsKLQkJfWVsc2UKLQkJCWFkZE1lc3NhZ2UocmVzb3VyY2UsIHZhbGlkYXRvci5nZXRDbGFzcygpLCBtZXNzYWdlLCBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgbWVzc2FnZSksIGdldExvY2F0aW9uKGhlbHBlciwgbWVzc2FnZSksZ2V0TWFya2VySWQodm1kLG1lc3NhZ2UpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXJrZXJJZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKHZtZC5nZXRNYXJrZXJJZHMoKSAhPSBudWxsKSB7Ci0JCQlpZiAodm1kLmdldE1hcmtlcklkcygpLmxlbmd0aCA9PSAxKQotCQkJCXJldHVybiB2bWQuZ2V0TWFya2VySWRzKClbMF07Ci0JCQllbHNlIGlmICh2bWQuZ2V0TWFya2VySWRzKCkubGVuZ3RoID4gMSkgewotCQkJCVN0cmluZyBtZXNzYWdlTWFya2VySWQgPSBtZXNzYWdlLmdldE1hcmtlcklkKCk7Ci0JCQkJaWYgKG1lc3NhZ2VNYXJrZXJJZCAhPSBudWxsICYmIG1lc3NhZ2VNYXJrZXJJZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nIGZpcnN0TWFya2VySWQgPSB2bWQuZ2V0TWFya2VySWRzKClbMF07Ci0JCQkJCVN0cmluZyBwbHVnaW5RdWFsaWZpZXIgPSBmaXJzdE1hcmtlcklkLnN1YnN0cmluZygwLCBmaXJzdE1hcmtlcklkLmxhc3RJbmRleE9mKCIuIikpOwotCQkJCQlTdHJpbmcgcXVhbGlmaWVkTWVzc2FnZU1hcmtlcklkID0gbnVsbDsKLQkJCQkJaWYgKG1lc3NhZ2VNYXJrZXJJZC5pbmRleE9mKHBsdWdpblF1YWxpZmllcikgPT0gLTEpCi0JCQkJCQlxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQgPSBwbHVnaW5RdWFsaWZpZXIgKyAiLiIgKyBtZXNzYWdlTWFya2VySWQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXF1YWxpZmllZE1lc3NhZ2VNYXJrZXJJZCA9IG1lc3NhZ2VNYXJrZXJJZDsKLQkJCQkJaWYgKEFycmF5cy5hc0xpc3Qodm1kLmdldE1hcmtlcklkcygpKS5jb250YWlucyhxdWFsaWZpZWRNZXNzYWdlTWFya2VySWQpKQotCQkJCQkJcmV0dXJuIHF1YWxpZmllZE1lc3NhZ2VNYXJrZXJJZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0Rpc2FibGVkVmFsaWRhdG9yKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMpIHsKLQkJLy8gRXZlbiB0aGUgSVZhbGlkYXRvciBpcyBpbnZhbGlkLiBVbmZvcnR1bmF0ZWx5LCBjYW4ndCBkaXNhYmxlIHRoZQotCQkvLyB2YWxpZGF0b3IgYmVjYXVzZSBpdCBjYW4ndCBiZSBmb3VuZCBieSB0aGUgcmVnaXN0cnkgcmVhZGVyLgotCQkvLyBMb2cgdGhlIHJlYXNvbiBmb3IgdGhlIGRpc2FibGVkIHZhbGlkYXRvcgotCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlcjo6YWRkTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5jb3JlLklSZXBvcnRlciNkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1lc3NhZ2UuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZGlzcGxheVN1YnRhc2sobWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsgLy8gZ2V0SGVscGVyIGNvdWxkIGJlIG51bGwgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIGJlZm9yZSBzb21ldGhpbmcKLQkJCS8vIHdhcyBmdWxseSBpbml0aWFsaXplZAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIG9iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIgPSBudWxsOwotCQl0cnkgewotCQkJLy9oZWxwZXIgPSB2bWQuZ2V0SGVscGVyKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQloZWxwZXIgPSBnZXRIZWxwZXIodmFsaWRhdG9yKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIFVubGlrZWx5IHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzCi0JCQkvLyBpbnZva2VkIGJ5IHRoZSB2YWxpZGF0b3IsIGFuZCBpZiB0aGUgdmFsaWRhdG9yIGlzIGludm9rZWQsIGl0J3MgbGlrZWx5Ci0JCQkvLyB0aGF0IHRoZSBoZWxwZXIgaGFzIGJlZW4gbG9hZGVkIHRvby4KLQotCQkJLy8gUmVtb3ZlIHRoZSB2bWQgZnJvbSB0aGUgcmVhZGVyJ3MgbGlzdAotCQkJVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmRpc2FibGVWYWxpZGF0b3Iodm1kKTsKLQotCQkJLy8gTG9nIHRoZSByZWFzb24gZm9yIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3IKLQkJCUxvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIldvcmtiZW5jaFJlcG9ydGVyOjpyZW1vdmVBbGxNZXNzYWdlcyhJUmVzb3VyY2UsIElWYWxpZGF0b3IsIE9iamVjdCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMgPSB2bWQuZ2V0VmFsaWRhdG9yTmFtZXMoKTsKLQkJU3RyaW5nIHRhcmdldE9iamVjdE5hbWUgPSBnZXRUYXJnZXRPYmplY3ROYW1lKGhlbHBlciwgb2JqZWN0KTsKLQkJcmVtb3ZlQWxsTWVzc2FnZXMocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzLCB0YXJnZXRPYmplY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5JUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1lc3NhZ2VSZXNvdXJjZSh2YWxpZGF0b3IsIG9iaik7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEodmFsaWRhdG9yKTsKLQkJaWYgKHZtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvL2hlbHBlciA9IHZtZC5nZXRIZWxwZXIocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCWhlbHBlciA9IGdldEhlbHBlciggcmVzb3VyY2UuZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3IgKTsKLQkJfSAKLQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBVbmxpa2VseSB0aGF0IGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcwotCQkJLy8gaW52b2tlZCBieSB0aGUgdmFsaWRhdG9yLCBhbmQgaWYgdGhlIHZhbGlkYXRvciBpcyBpbnZva2VkLCBpdCdzIGxpa2VseQotCQkJLy8gdGhhdCB0aGUgaGVscGVyIGhhcyBiZWVuIGxvYWRlZCB0b28uCi0KLQkJCS8vIFJlbW92ZSB0aGUgdm1kIGZyb20gdGhlIHJlYWRlcidzIGxpc3QKLQkJCVZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5kaXNhYmxlVmFsaWRhdG9yKHZtZCk7Ci0KLQkJCS8vIExvZyB0aGUgcmVhc29uIGZvciB0aGUgZGlzYWJsZWQgdmFsaWRhdG9yCi0JCQlMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJXb3JrYmVuY2hSZXBvcnRlcjo6cmVtb3ZlQWxsTWVzc2FnZXMoSVJlc291cmNlLCBJVmFsaWRhdG9yLCBPYmplY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1tdIHZhbGlkYXRvck5hbWVzID0gdm1kLmdldFZhbGlkYXRvck5hbWVzKCk7Ci0JCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lID0gZ2V0VGFyZ2V0T2JqZWN0TmFtZShoZWxwZXIsIG9iaik7Ci0JCXJlbW92ZU1lc3NhZ2VTdWJzZXQocmVzb3VyY2UsIHZhbGlkYXRvck5hbWVzLCB0YXJnZXRPYmplY3ROYW1lLCBncm91cE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhY2hlTWVzc2FnZSggSVZhbGlkYXRvckpvYiB2YWxpZGF0b3IsCi0JCQkJSVJlc291cmNlIHJlc291cmNlLAotCQkJCUNsYXNzIGNsYXp6LCBJTWVzc2FnZSBtZXNzYWdlLAotCQkJCVN0cmluZyB0YXJnZXRPYmplY3ROYW1lLAotCQkJCVN0cmluZyBsb2NhdGlvbiwKLQkJCQlTdHJpbmcgbWFya2VySWQgKXsKLQkJCi0JCWlmICgoY2xhenogPT0gbnVsbCkgfHwgKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotCQlpZiAoY2wgPT0gbnVsbCkgewotCQkJY2wgPSBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOwotCQl9Ci0JCVN0cmluZyB0ZXh0ID0gbWVzc2FnZS5nZXRUZXh0KGNsKTsKLQkJTWVzc2FnZUluZm8gbXNnSW5mbyA9IG5ldyBNZXNzYWdlSW5mbyhnZXRVbmlxdWVJZChjbGF6eiksIHJlc291cmNlLCBsb2NhdGlvbiwKLQkJCQkJdGV4dCwgdGFyZ2V0T2JqZWN0TmFtZSwgbWFya2VySWQsIG1lc3NhZ2UgKTsKLQotCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQltZ3IuY2FjaGVNZXNzYWdlKCB2YWxpZGF0b3IsIG1zZ0luZm8gKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3BsdWdpbi9WYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2NkODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25IZWxwZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVByb2plY3RWYWxpZGF0aW9uSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCi0JLyoqIHZhbGlkYXRpb25IZWxwZXIgLSBleHRlbnNpb24gcG9pbnQgbmFtZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0hFTFBFUiA9ICJ2YWxpZGF0aW9uSGVscGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJCAKLQkKLQkvKiogaGVscGVyQ2xhc3MgLSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGV4dGVuc2lvbi4gKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IRUxQRVJfQ0xBU1MgPSAiaGVscGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIElOU1RBTkNFID0gbnVsbDsKLQlwcml2YXRlIExpc3QgdmFsaWRhdGlvbkhlbHBlcnMgPSBudWxsOwotCQotCXB1YmxpYyBWYWxpZGF0aW9uSGVscGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lELCBWQUxJREFUSU9OX0hFTFBFUik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgVmFsaWRhdGlvbkhlbHBlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRWYWxpZGF0aW9uSGVscGVycygpIHsKLQkJaWYgKHZhbGlkYXRpb25IZWxwZXJzID09IG51bGwpCi0JCQl2YWxpZGF0aW9uSGVscGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHZhbGlkYXRpb25IZWxwZXJzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFZBTElEQVRJT05fSEVMUEVSKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVByb2plY3RWYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQloZWxwZXIgPSAoSVByb2plY3RWYWxpZGF0aW9uSGVscGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0hFTFBFUl9DTEFTUyk7Ci0JCQlnZXRWYWxpZGF0aW9uSGVscGVycygpLmFkZChoZWxwZXIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0VmFsaWRhdGlvbkhlbHBlciBnZXRWYWxpZGF0aW9uSGVscGVyKCkgewotCQlpZiAoZ2V0VmFsaWRhdGlvbkhlbHBlcnMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJUHJvamVjdFZhbGlkYXRpb25IZWxwZXIpIGdldFZhbGlkYXRpb25IZWxwZXJzKCkuZ2V0KDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvblBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wbHVnaW4vVmFsaWRhdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQwYjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGx1Z2luL1ZhbGlkYXRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRXZlbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRpbWVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRSA9ICJ2YWxpZGF0ZV9iYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uUGx1Z2luIF9wbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgVGltZUVudHJ5IF90RW50cnk7Ci0JcHJpdmF0ZSBzdGF0aWMgTG9nRW50cnkgX2VudHJ5OwotCXByaXZhdGUgc3RhdGljIE1lc3NhZ2UgX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9CVUlMREVSX0lEID0gUExVR0lOX0lEICsgIi52YWxpZGF0aW9uYnVpbGRlciI7IC8vJE5PTi1OTFMtMSQvLyBwbHVnaW4gaWQgb2YgdGhlIHZhbGlkYXRpb24gYnVpbGRlcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9FWFRfUFRfSUQgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJC8vIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIAotCi0JLyoqCi0JICogVmFsaWRhdGlvblBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvblBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKF9wbHVnaW4gPT0gbnVsbCkgewotCQkJX3BsdWdpbiA9IHRoaXM7Ci0JCQkvL0NvbW1lbnRpbmcgb2ZmIHRoZSBmb2xsb3dpbmcgbGluZXMgdGhlIFBsdWdpbiBpcyBub3QgYWN0aXZhdGVkIGFuZCB0aGUKLQkJCS8vZ2V0TXNnTG9nZ2VyIHRyaWVzIHRvIGFjY2VzcyB0aGUgUGx1Z2luIGFuZCB0aGUgcGx1Z2luIGlzIGluIGEgYWN0aXZlIHBlbmRpbmcgc3RhdGUuCi0JCQkvL2dldE1zZ0xvZ2dlcigpOwotCQkJLy9sb2dnZXIubG9nKExldmVsLkNPTkZJRywgbnVsbCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBWQUxJREFUSU9OX1BST1BfRklMRV9OQU1FOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTG9nRW50cnkgZ2V0TG9nRW50cnkoKSB7Ci0JCWlmIChfZW50cnkgPT0gbnVsbCkgewotCQkJX2VudHJ5ID0gbmV3IExvZ0VudHJ5KFZBTElEQVRJT05fUFJPUF9GSUxFX05BTUUpOwotCQl9IGVsc2UgewotCQkJX2VudHJ5LnJlc2V0KCk7Ci0JCX0KLQkJLy8gQWx3YXlzIHNldCB0aGUgbG9nIGVudHJ5J3MgTG9jYWxlIGJlZm9yZSB5b3UgdXNlIGl0Ci0JCS8vIGJlY2F1c2UgdGhlIHVzZXIgY2FuIHJlc2V0IGl0IG9uIHRoZSBmbHkuCi0JCV9lbnRyeS5zZXRMb2NhbGVPZk9yaWdpbihMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gX2VudHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGltZUVudHJ5IGdldFRpbWVFbnRyeSgpIHsKLQkJaWYgKF90RW50cnkgPT0gbnVsbCkgewotCQkJX3RFbnRyeSA9IG5ldyBUaW1lRW50cnkoKTsKLQkJfQotCQlfdEVudHJ5LnJlc2V0KCk7Ci0JCXJldHVybiBfdEVudHJ5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotCQlpZiAoX21lc3NhZ2UgPT0gbnVsbCkgewotCQkJX21lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOwotCQkJX21lc3NhZ2Uuc2V0QnVuZGxlTmFtZShnZXRCdW5kbGVOYW1lKCkpOwotCQl9Ci0JCS8vIGNsZWFyIHRoZSBtZXNzYWdlIGZvciByZXVzZQotCQlfbWVzc2FnZS5zZXRJZChudWxsKTsKLQkJX21lc3NhZ2Uuc2V0UGFyYW1zKG51bGwpOwotCQlfbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QobnVsbCk7Ci0JCV9tZXNzYWdlLnNldEdyb3VwTmFtZShudWxsKTsKLQkJX21lc3NhZ2Uuc2V0U2V2ZXJpdHkoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyBhIGhhc2h0YWJsZSBvZiBhIGxvZ2dlcidzIHByZWZlcmVuY2VzIGluaXRpYWxseSBmcm9tIHRoZQotCSAqIGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbC5sb2dnaW5nRGVmYXVsdHMgZXh0ZW5zaW9uIHBvaW50IGlmIHNwZWNpZmllZCBpbiB0aGUKLQkgKiBjb20uaWJtLmV0b29scy5sb2dnaW5nLnV0aWwgcGx1Z2luLnhtbCBmaWxlLiBJZiBzcGVjaWZpZWQsIHRoZQotCSAqIGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbC5sb2dnaW5nT3B0aW9ucyBleHRlbnNpb24gcG9pbnQgcHJlZmVyZW5jZXMgaW4gdGhlIHBhcmFtZXRlcgotCSAqIHBsdWdpbidzIHBsdWdpbi54bWwgZmlsZSBhcmUgcmV0dXJuZWQuCi0JICogCi0JICogVGhlIGxvZ2dlcidzIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHJldHVybiBoYXNodGFibGUgdXNpbmcgdGhlIHN0YXRpYyBpbnN0YW5jZQotCSAqIHZhcmlhYmxlcyBpbiBMb2dnZXJTdGF0ZUhhc2hLZXlzIGFzIGtleXMuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgdGhlIFBsdWdpbiBwb2xsZWQgZm9yIHRoZWlyIGxvZ2dlcidzIHByZWZlcmVuY2VzIGluIHRoZSBwbHVnaW4ueG1sIGZpbGUKLQkgKiBAcmV0dXJuIGhhc2h0YWJsZSBvZiBhIGxvZ2dlcidzIHByZWZlcmVuY2VzCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgSGFzaHRhYmxlIGdldE1zZ0xvZ2dlckNvbmZpZyhQbHVnaW4gcGx1Z2luKSB7IHJldHVybiAobmV3Ci0JICogUGx1Z2luSGVscGVySW1wbCgpLmdldE1zZ0xvZ2dlckNvbmZpZyhwbHVnaW4pKTsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gX3BsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb2dnZXIncyBwcmVmZXJlbmNlcyBiYXNlZCBvbiB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlciBoYXNodGFibGUuCi0JICogCi0JICogVGhlIGxvZ2dlcidzIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHBhcmFtZXRlciBoYXNodGFibGUgdXNpbmcgdGhlIHN0YXRpYyBpbnN0YW5jZQotCSAqIHZhcmlhYmxlcyBpbiBMb2dnZXJTdGF0ZUhhc2hLZXlzIGFzIGtleXMuCi0JICogCi0JICogQHBhcmFtIG1zZ0xvZ2dlckNvbmZpZwotCSAqICAgICAgICAgICAgaGFzaHRhYmxlIG9mIHRoZSBsb2dnZXIncyBwcmVmZXJlbmNlcwotCSAqLwotCS8qCi0JICogcHVibGljIHZvaWQgc2V0TXNnTG9nZ2VyQ29uZmlnKEhhc2h0YWJsZSBtc2dMb2dnZXJDb25maWcpIHsKLQkgKiBnZXRNc2dMb2dnZXIoKS5zZXRNc2dMb2dnZXJDb25maWcobXNnTG9nZ2VyQ29uZmlnKTsgfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGl2YXRlZCgpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihFdmVudE1hbmFnZXIuZ2V0TWFuYWdlcigpLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggRXZlbnRNYW5hZ2VyLmdldE1hbmFnZXIoKSApOwkJCi0JCUV2ZW50TWFuYWdlci5nZXRNYW5hZ2VyKCkuc2h1dGRvd24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9WYWxpZGF0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9WYWxpZGF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWE0NjE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvVmFsaWRhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25GYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gYWNjZXNzIGFuIGluc3RhbmNlIG9mIHRoZSBWYWxpZGF0aW9uRmFjdG9yeUltcGwKLSAqIGluc3RhbmNlLCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBzb21lIG9mIHRoZSBpbnRlcm5hbCBzdGF0ZQotICogb2YgdmFsaWRhdG9ycy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqIFtpc3N1ZTogTE0gLSAyIGlzc3Vlcy4KLSAqICAxLiBJIGRvbid0IHRoaW5rIHRoZSBuYW1lICdmYWN0b3J5JyBwcm92aWRlcyBhIGdvb2QgZGVzY3JpcHRpb24gb2YgCi0gKiAgICAgdGhpcyBpbnRlcmZhY2UuIFVubGVzcyBJJ20gbWlzdGFrZW4gdGhlIFZhbGlkYXRpb25GYWN0b3J5IGRvZXNuJ3QKLSAqICAgICBhY3R1YWxseSBjcmVhdGUgdmFsaWRhdG9ycyBidXQgc2ltcGx5IHJldHVybnMgZXhpc3RpbmcgdmFsaWRhdG9ycy4KLSAqICAgICBMb29raW5nIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gSSBzdWdnZXN0Ci0gKiAgICAgcmVuYW1pbmcgdGhpcyB0byBWYWxpZGF0b3JSZWdpc3RyeSBvciBzb21ldGhpbmcgc2ltaWxhci4KLSAqICAyLiBJIHRoaW5rIHRoZSBjb21tb24gd2F5IGZvciBjcmVhdGluZyBhIGZhY3RvcnkgaXMgdG8gY3JlYXRlIGEgY2xhc3MKLSAqICAgICB3aXRoIGEgc3RhdGljIG1ldGhvZCBzdWNoIGFzIGdldEZhY3RvcnkuIElmIHRoaXMgaXMgdG8gYmUgYSBmYWN0b3J5Ci0gKiAgICAgaXQgc2hvdWxkIHByb2JhYmx5IGJlIHN0cnVjdHVyZWQgYXMgcGVyIHRoZSBjb252ZW50aW9uLl0KLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uRmFjdG9yeSB7Ci0JCi0JVmFsaWRhdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBWYWxpZGF0aW9uRmFjdG9yeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkvKioKLQkgKiBUaGlzIGFwaSByZXR1cm5zIHRoZSBJVmFsaWRhdG9yIGdpdmVuIHRoZSB2YWxpZGF0b3JVbmlxdWVOYW1lIGlkLiBUaGUgdW5pcXVlCi0JICogaWQgbmFtZSBpcyB0aGUgY2xhc3MgbmFtZSB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGNsYXNzIG5hbWUgZWxlbWVudCBpbiB0aGUgCi0JICogcGx1Z2luIGV4dGVuc2lvbiBvZiB0aGUgdmFsaWRhdG9yLgotCSAqIEBwYXJhbSB2YWxpZGF0b3JVbmlxdWVJZAotCSAqIEByZXR1cm4gSVZhbGlkYXRvcgotCSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoU3RyaW5nIHZhbGlkYXRvclVuaXF1ZUlkKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRW1wdHlTY2hlZHVsaW5nUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRW1wdHlTY2hlZHVsaW5nUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWNiNTk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0VtcHR5U2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlTY2hlZHVsaW5nUnVsZSBpbXBsZW1lbnRzIElTY2hlZHVsaW5nUnVsZSB7Ci0JCQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSAKLSAgICB7Ci0gICAgICAgICByZXR1cm4gcnVsZSA9PSB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLSAgICAgICAgIHJldHVybiBydWxlID09IHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvRmlsZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9GaWxlRGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNmJhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9GaWxlRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLQotCi0vKioKLSAqIDxwPgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUZpbGVEZWx0YQotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YQotICogCi0gKiAgW2lzc3VlOiBDUyAtIGlzIHRoZXJlIGEgcmVhc29uIHRoYXQgd2UgbmVlZCB0byBleHBvc2UgdGhpcyBpbXBsIGNsYXNzIGFzIGFuIEFQST8KLSAqICAgSXQgd291bGQgc2VlbSBiZXR0ZXIgdG8gb25seSBleHBvc2UgSUZpbGVEZWx0YS4gIEkgY2FuJ3QgdGhpbmsgb2YgYSByZWFzb24gd2hlcmUgCi0gKiAgIGEgdHlwaWNhbCBjbGllbnQgd291bGQgbmVlZCB0byBjcmVhdGUgb25lIG9mIHRoZXNlLl0KLSAqLwotcHVibGljIGNsYXNzIEZpbGVEZWx0YSBpbXBsZW1lbnRzIElGaWxlRGVsdGEgewotCXByaXZhdGUgaW50IGZpbGVEZWx0YTsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBGaWxlRGVsdGEKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEZpbGVEZWx0YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ29uc3RydWN0b3IgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMuIAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYUZpbGVOYW1lIHNwZWNpZmllcyB0aGUgZmlsZSBuYW1lCi0JICogQHBhcmFtIGFGaWxlRGVsdGEgc3BlY2lmaWVzIHRoZSAKLQkgKi8KLQlwdWJsaWMgRmlsZURlbHRhKFN0cmluZyBhRmlsZU5hbWUsIGludCBhRmlsZURlbHRhKSB7Ci0JCWZpbGVOYW1lID0gYUZpbGVOYW1lOwotCQlmaWxlRGVsdGEgPSBhRmlsZURlbHRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZpbGVEZWx0YSNnZXREZWx0YVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVsdGFUeXBlKCkgewotCQlyZXR1cm4gZmlsZURlbHRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZpbGVEZWx0YSNnZXRGaWxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNldCB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY2hhbmdlIHRoYXQgdGhlIGZpbGUgCi0JICogaGFzIHVuZGVyZ29uZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsdGFUeXBlKGludCBkZWx0YVR5cGUpIHsKLQkJZmlsZURlbHRhID0gZGVsdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCBoYXMgY2hhbmdlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGFGaWxlTmFtZSkgewotCQlmaWxlTmFtZSA9IGFGaWxlTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JRmlsZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JRmlsZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDhlZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSUZpbGVEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQsIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0byBlbmNhcHN1bGF0ZSB0aGUgY2hhbmdlIAotICogc3RhdHVzIG9mIGEgcmVzb3VyY2UuIElGaWxlRGVsdGEgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggaGFzIAotICogY2hhbmdlZCwgYW5kIGEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY2hhbmdlIHdoaWNoIGhhcyBvY2N1cnJlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiA8L3A+Ci0gKiBbaXNzdWU6IExNIC0gRnJvbSBzcGVha2luZyB3aXRoIFZpamF5IHRoZSBuYW1lIElGaWxlRGVsdGEgZG9lc24ndCByZWFsbHkgY2FwdHVyZQotICogIHdoYXQgdGhpcyBpbnRlcmZhY2UgaXMgZm9yLiBWYWxpZGF0aW9uIG1heSBvY2N1ciBvZiBmaWxlcywgaXQgbWF5IG9jY3VyIG9uIHJlc291cmNlcywKLSAqICBvciBpdCBtYXkgb2NjdXIgb24gc29tZXRoaW5nIG1vcmUgYWJzdHJhY3Qgc2ltcGx5IGtub3duIGFzIGFuIGFydGlmYWN0LiBUaGUgZGVsdGEgcGFydAotICogIG9mIHRoZSBuYW1lIGFsc28gc2VlbXMgbWlzbGVhZGluZyBhcyB0aGlzIGludGVyZmFjZSBkb2Vzbid0IHByb3ZpZGUgdGhlIGRlbHRhIGJ1dAotICogIHJhdGhlciBwcm92aWRlcyB0aGUgdHlwZSBvZiBjaGFuZ2UuIEkgc3VnZ2VzdCByZW5hbWluZyB0aGlzIGludGVyZmFjZSB0byBJTW9kaWZpZWRBcnRpZmFjdAotICogIG9yIHNvbWV0aGluZyBhbG9uZyB0aG9zZSBsaW5lcyB0byBiZXR0ZXIgY2FwdHVyZSBpdHMgdXNlLiBdCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVEZWx0YSB7Ci0JCi0JLyoqIDEgLSB0aGUgZmlsZSBoYXMgYmVlbiBhZGRlZCAqLwotCWludCBBRERFRCA9IDE7Ci0JCi0JLyoqIDIgLSB0aGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkICovCi0JaW50IENIQU5HRUQgPSAyOwotCQotCS8qKiAzIC0gdGhlIGZpbGUgaGFzIGJlZW4gZGVsZXRlZCAqLwotCWludCBERUxFVEVEID0gMzsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNoYW5nZSB3aGljaCBoYXMgb2NjdXJyZWQ6Ci0JICogSUZpbGVEZWx0YS5BRERFRCwgSUZpbGVEZWx0YS5DSEFOR0VELCBvciBJRmlsZURlbHRhLkRFTEVURUQuCi0JICogPC9wPgotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVsdGEgdHlwZS4KLQkgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0JICogCi0JICogW2lzc3VlOiBMTSAtIEZyb20gbXkgZXhwZXJpZW5jZSBhIHZhbGlkYXRvciBzaW1wbHkgbmVlZHMgdG8ga25vdyB3aGF0IGFydGlmYWN0IG5lZWRzCi0JICogIHRvIGJlIHZhbGlkYXRlZC4gQ2FuIHlvdSBwcm92aWRlIGEgdXNlIGNhc2Ugd2hlcmUgdGhlIHR5cGUgb2YgY2hhbmdlIGlzIG5lZWRlZCBmb3IKLQkgKiAgdmFsaWRhdGlvbj8gXQotCSAqLwotCWludCBnZXREZWx0YVR5cGUoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVjbGlwc2UgcmVzb3VyY2UgZmlsZSB3aGljaCBoYXMgY2hhbmdlZC4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IG5vdCBiZSAKLQkgKiBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4KLQkgKiA8L3A+Ci0JICogQHJldHVybiByZXR1cm5zIHRoZSBmaWxlIG5hbWUuCi0JICogQHBsYW5uZWRmb3IgV1RQIDEuMAotCSAqIAotCSAqIFtpc3N1ZTogTE0gLSBGb2xsb3dpbmcgbXkgY29tbWVudHMgYWJvdmUgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlbmFtZWQgdG8gZ2V0QXJ0aWZhY3ROYW1lIG9yCi0JICogIHNvbWV0aGluZyB0aGF0IGZvbGxvd3MgYWxvbmcgd2l0aCB0aGUgaW50ZXJmYWNlIHJlbmFtZS4gXQotCSAqLwotCVN0cmluZyBnZXRGaWxlTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSU1lc3NhZ2VBY2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL0lNZXNzYWdlQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODVmNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSU1lc3NhZ2VBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEludGVyZmFjZSB3aGljaCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgbWVzc2FnZXMgd2hpY2ggYXJlIHN0b3JlZCB3aXRoaW4gYSByZXBvcnRlciB3aGljaCByZXRhaW5zCi0gKiBpdHMgbWVzc2FnZSBoaXN0b3J5LgotICogPC9wPgotICogCi0gKiBbaXNzdWU6IENTIC0gVGhpcyBpbnRlcmZhY2Ugc2VlbXMgbGlrZSBvdmVya2lsbC4gIEknZCB0aGluayB0aGF0IGFuIElSZXBvcnQgc2hvdWxkIHNpbXBseSBoYXZlIGEgZ2V0TWVzc2FnZXMoKSBtZXRob2QuCi0gKiBJIHRoaW5rIE1lc3NhZ2VGaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgYXQgdGhlICdkaXNwbGF5JyBsZXZlbCBhbmQgbm90IGF0IHRoaXMgbGV2ZWwgb2YgdGhlIEFQSS5dCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VBY2Nlc3MgewotCS8qKgotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIEEgZmlsdGVyIHdoaWNoIHNwZWNpZmllcyBhIHN1YnNldCBvZiBtZXNzYWdlcyB0byByZXRyaWV2ZS4gbnVsbCBzcGVjaWZpZXMsICJhbGwKLQkgKiAgICAgICAgICAgIG1lc3NhZ2VzIi4KLQkgKiBAcmV0dXJuIExpc3QgbGlzdCBvZiBtZXNzYWdlcyByZWxhdGVkIHRvIHRoZSB0YXJnZXQgb2JqZWN0Ci0JICovCi0JYWJzdHJhY3QgTGlzdCBnZXRNZXNzYWdlcyhNZXNzYWdlRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBBIGZpbHRlciB3aGljaCBzcGVjaWZpZXMgYSBzdWJzZXQgb2YgbWVzc2FnZXMgdG8gcmV0cmlldmUuIG51bGwgc3BlY2lmaWVzLCAiYWxsCi0JICogICAgICAgICAgICBtZXNzYWdlcyIuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBsb2NhbCB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2VzIGludG8uIG51bGwgc3BlY2lmaWVzLCAidXNlIGRlZmF1bHQKLQkgKiAgICAgICAgICAgIGxvY2FsZSIuCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBtZXNzYWdlcyByZWxhdGVkIHRvIHRoZSB0YXJnZXQgb2JqZWN0LCB0cmFuc2xhdGVkIGludG8gdGhlIHNwZWNpZmllZAotCSAqIGxvY2FsZS4KLQkgKi8KLQlhYnN0cmFjdCBMaXN0IGdldE1lc3NhZ2VzQXNUZXh0KE1lc3NhZ2VGaWx0ZXIgZmlsdGVyLCBMb2NhbGUgdGFyZ2V0TG9jYWxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxZmU3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogPHA+Ci0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTWVzc2FnZSBpbnRlcmZhY2UsIHByb3ZpZGVkIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlCi0gKiBJVmFsaWRhdG9ycy4gSWYgYW4gSVZhbGlkYXRvciBuZWVkcyB0byBydW4gaW4gYm90aCBBQVQgYW5kIFdTQUQgdGhlbiB0aGlzIElNZXNzYWdlIGltcGxlbWVudGF0aW9uCi0gKiBzaG91bGQgYmUgdXNlZDsgaWYgdGhlIElWYWxpZGF0b3IgcnVucyBpbiBXU0FEIGFsb25lLCB0aGUgV1NBRCBMb2NhbGl6ZWRNZXNzYWdlIG1heSBiZSB1c2VkIGluCi0gKiBwbGFjZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UKLSAqIAotICogW2lzc3VlOiBDUyAtIEknZCBzdWdnZXN0IHNwbGl0dGluZyB0aGlzIGNsYXNzIGludG8gTWVzc2FnZSBhbmQgQnVuZGxlTWVzc2FnZSAod2hlcmUgdGhlIGxhdHRlciBpbmhlcml0cwotICogZnJvbSB0aGUgZm9ybWVyLiAgV2UgaGF2ZSBtYW55IG1lc3NhZ2VzIHRoYXQgY29tZSAoZnJvbSB4ZXJjZXMpIHByZXRyYW5zbGF0ZWQgYW5kIGRvbid0IHJlcXVpcmUgJ2J1bmRsZScKLSAqIHJlbGF0ZWQgZmllbGRzIGFuZCBtZXRob2RzLiBTcGxpdHRpbmcgdGhpcyBjbGFzcyB3b3VsZCBtYWtlIGl0IGVhc2llciB0byB1bmRlcnN0YW5kIHdoZXJlIGJ1bmRsZSByZWxhdGVkCi0gKiBmdW5jdGlvbiBpcyBjb21pbmcgaW50byBwbGF5LiBCZWxvdyBJJ3ZlIGxpc3RlZCBvdXQgd2hhdCB3b3VsZCBnbyBpbnRvIEJ1bmRsZU1lc3NhZ2UgdG8gZGVtb25zdHJhdGUgaG93IAotICogd2UgY2FuIHNpbXBsaWZ5IHRoZSAnTWVzc2FnZScgY2xhc3MgYnkgZmFjdG9yaW5nIG91dCB0aGUgYnVuZGxlIHJlbGF0ZWQgZGV0YWlscy4KLSAqIAotICogTWVzc2FnZQotICoJcHJpdmF0ZSBPYmplY3QgdGFyZ2V0T2JqZWN0ID0gbnVsbDsKLSAqCXByaXZhdGUgU3RyaW5nIGdyb3VwTmFtZSA9IG51bGw7Ci0gKglwcml2YXRlIGludCBsaW5lTnVtYmVyID0gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotICoJcHJpdmF0ZSBpbnQgbGVuZ3RoID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotICoJcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotICoKLSAqICAgIAotICogQnVuZGxlTWVzc2FnZQotICoJcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotICoJcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbXMgPSBudWxsOwotICoJcHJpdmF0ZSBTdHJpbmcgYnVuZGxlTmFtZSA9IG51bGw7Ci0gKiAgIAotICogICAtIGdldElkKCkKLSAqICAgLSBnZXRCdW5kbGUoLi4uKQotICogICAtIGdldEJ1bmRsZU5hbWUoKQotICogICAtIGdldFBhcmFtcygpCi0gKiAgIC0gZ2V0VGV4dChMb2NhbGUpCi0gKiAgIC0gZ2V0VGV4dChDbGFzc0xvYWRlcikKLSAqICAgLSBnZXRUZXh0KExvY2FsZSwgQ2xhc3NMb2FkZXIpCi0gKiAgIC0gc2V0SWQoU3RyaW5nKQotICogICAtIHNldEJ1bmRsZU5hbWUoU3RyaW5nKQotICogICAtIHNldFBhcmFtcyhTdHJpbmdbXSkKLSAqIF0KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2UgaW1wbGVtZW50cyBJTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbXM7Ci0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHkgPSBNZXNzYWdlRmlsdGVyLkFOWV9TRVZFUklUWTsKLQlwcml2YXRlIE9iamVjdCB0YXJnZXRPYmplY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgYnVuZGxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBncm91cE5hbWU7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQlwcml2YXRlIGludCBsZW5ndGggPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCXByaXZhdGUgSGFzaE1hcCBtZXNzYWdlQXR0cmlidXRlczsKLQlwcml2YXRlIFN0cmluZyBtYXJrZXJJZDsKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBNZXNzYWdlCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBNZXNzYWdlIG9iamVjdCB3aXRoIGJ1bmRsZSBuYW1lLCBzZXZlcml0eSBhbmQgYSB1bmlxdWUgaWQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFCdW5kbGVOYW1lIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5IAotCSAqIAkJCU11c3QgYmUgb25lIG9mIHRoZSBzZXZlcml0aWVzIHNwZWNpZmllZCBpbiBJTWVzc2FnZS4gCi0JICogQHBhcmFtIGFuSWQgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuCi0JICovCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCkgewotCQl0aGlzKGFCdW5kbGVOYW1lLCBhU2V2ZXJpdHksIGFuSWQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBNZXNzYWdlIG9iamVjdCB3aXRoIGJ1bmRsZSBuYW1lLCBzZXZlcml0eSwgYSB1bmlxdWUgaWQsIGFuZCAKLQkgKiBhIGxpc3Qgb2YgcGFyYW1ldGVycy4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhQnVuZGxlTmFtZSAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4gCi0JICogQHBhcmFtIGFTZXZlcml0eSAKLQkgKiAJCQlNdXN0IGJlIG9uZSBvZiB0aGUgc2V2ZXJpdGllcyBzcGVjaWZpZWQgaW4gSU1lc3NhZ2UuCi0JICogQHBhcmFtIGFuSWQgCi0JICogCQkJTXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nICgiIikuCi0JICogQHBhcmFtIGFQYXJhbXMgCi0JICogCQkJTWF5IGJlIG51bGwsIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzIGluIHRoZSBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBhQnVuZGxlTmFtZSwgaW50IGFTZXZlcml0eSwgU3RyaW5nIGFuSWQsIFN0cmluZ1tdIGFQYXJhbXMpIHsKLQkJdGhpcyhhQnVuZGxlTmFtZSwgYVNldmVyaXR5LCBhbklkLCBhUGFyYW1zLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIE1lc3NhZ2Ugb2JqZWN0IHdpdGggYnVuZGxlIG5hbWUsIHNldmVyaXR5LCBhIHVuaXF1ZSBpZCwgYW5kIAotCSAqIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCB0aGUgdGFyZ2V0IG9iamVjdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFCdW5kbGVOYW1lIAotCSAqIAkJCU11c3Qgbm90IGJlIG51bGwgb3IgdGhlIGVtcHR5IHN0cmluZyAoIiIpLiAKLQkgKiBAcGFyYW0gYVNldmVyaXR5IAotCSAqIAkJCU11c3QgYmUgb25lIG9mIHRoZSBzZXZlcml0aWVzIHNwZWNpZmllZCBpbiBJTWVzc2FnZS4KLQkgKiBAcGFyYW0gYW5JZCAKLQkgKiAJCQlNdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgKCIiKS4KLQkgKiBAcGFyYW0gYVBhcmFtcyAKLQkgKiAJCQlNYXkgYmUgbnVsbCwgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgaW4gdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIHRhcmdldE9iamVjdCAKLQkgKiAJCQlNYXkgYmUgbnVsbCwgaWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgcGVydGFpbiB0byBhIHBhcnRpY3VsYXIgCi0JICogCQkJb2JqZWN0LgotCSAqLwotCXB1YmxpYyBNZXNzYWdlKFN0cmluZyBhQnVuZGxlTmFtZSwgaW50IGFTZXZlcml0eSwgU3RyaW5nIGFuSWQsIFN0cmluZ1tdIGFQYXJhbXMsIE9iamVjdCBhVGFyZ2V0T2JqZWN0KSB7Ci0JCWJ1bmRsZU5hbWUgPSBhQnVuZGxlTmFtZTsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCWlkID0gYW5JZDsKLQkJcGFyYW1zID0gYVBhcmFtczsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2UoU3RyaW5nIGFCdW5kbGVOYW1lLCBpbnQgYVNldmVyaXR5LCBTdHJpbmcgYW5JZCwgU3RyaW5nW10gYVBhcmFtcywgT2JqZWN0IGFUYXJnZXRPYmplY3QsIFN0cmluZyBhR3JvdXBOYW1lKSB7Ci0JCWJ1bmRsZU5hbWUgPSBhQnVuZGxlTmFtZTsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCWlkID0gYW5JZDsKLQkJcGFyYW1zID0gYVBhcmFtczsKLQkJdGFyZ2V0T2JqZWN0ID0gYVRhcmdldE9iamVjdDsKLQkJZ3JvdXBOYW1lID0gYUdyb3VwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2VzLCBhcyBpZGVudGlmaWVkIGJ5Ci0JICogCi0JICogQGxpbmsgI2dldEJ1bmRsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3RyeSB0byAgbG9hZCB0aGUgYnVuZGxlIGZyb20gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHBsdWdpbgotCQkJYnVuZGxlID0gZ2V0RnJhbWV3b3JrQnVuZGxlKGxvY2FsZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldEZyYW1ld29ya0J1bmRsZShMb2NhbGUgbG9jYWxlKSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldEJ1bmRsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRHcm91cE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBOYW1lKCkgewotCQlyZXR1cm4gZ3JvdXBOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRMaW5lTnVtYmVyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBsaW5lTnVtYmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0T2Zmc2V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFBhcmFtcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIHBhcmFtczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRUYXJnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2UjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRleHQoQ2xhc3NMb2FkZXIpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBnZXRUZXh0KExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI2dldFRleHQoTG9jYWxlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlKSB7Ci0JCXJldHVybiBnZXRUZXh0KGxvY2FsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVzc2FnZSNnZXRUZXh0KExvY2FsZSwgQ2xhc3NMb2FkZXIpCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZShsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhnZXRJZCgpKTsKLQotCQkJaWYgKGdldFBhcmFtcygpICE9IG51bGwpIHsKLQkJCQltZXNzYWdlID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIGdldFBhcmFtcygpKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4YykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKGdldElkKCkpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihnZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0QnVuZGxlTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlTmFtZShTdHJpbmcgYUJ1bmRsZU5hbWUpIHsKLQkJYnVuZGxlTmFtZSA9IGFCdW5kbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0R3JvdXBOYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZ3JvdXBOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldElkKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldExlbmd0aChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA8IDApIHsKLQkJCWxlbmd0aCA9IElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQkJfQotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZXNzYWdlI3NldExpbmVObyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZU5vKGludCBsaW5lTnVtYmVyKSB7Ci0JCWlmIChsaW5lTnVtYmVyIDwgMCkgewotCQkJdGhpcy5saW5lTnVtYmVyID0gSU1lc3NhZ2UuTElORU5PX1VOU0VUOwotCQl9IGVsc2UgewotCQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0T2Zmc2V0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJb2Zmc2V0ID0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCQl9Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0UGFyYW1zKFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtcyhTdHJpbmdbXSBuZXdQYXJhbXMpIHsKLQkJcGFyYW1zID0gbmV3UGFyYW1zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0U2V2ZXJpdHkoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBuZXdTZXZlcml0eSkgewotCQlzZXZlcml0eSA9IG5ld1NldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lc3NhZ2Ujc2V0VGFyZ2V0T2JqZWN0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRPYmplY3QoT2JqZWN0IG9iaikgewotCQl0YXJnZXRPYmplY3QgPSBvYmo7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYobWVzc2FnZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1lc3NhZ2VBdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlpZihtZXNzYWdlQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJbWVzc2FnZUF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZU5hbWUsdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgSGFzaE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbWVzc2FnZUF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJJZCgpIHsKLQkJcmV0dXJuIG1hcmtlcklkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcmtlcklkKFN0cmluZyBtYXJrZXJJZCkgewotCQl0aGlzLm1hcmtlcklkID0gbWFya2VySWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvTWVzc2FnZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGU5N2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogPHA+Ci0gKiBFbmNhcHN1bGF0ZXMgY29tbW9uIG1lc3NhZ2UgZmlsdGVyaW5nIHBhcmFtZXRlcnMuIE1lc3NhZ2UgRmlsdGVycyBhcmUgdXNlZCB3aGVuIHJldHJpZXZpbmcKLSAqIG1lc3NhZ2VzIHZpYSBhbiBJTWVzc2FnZUFjY2Vzcy4gVGhlIGZpbHRlciBlbmNhcHN1bGF0ZXMgYSBzaW1wbGUgc2V0IG9mIHR5cGljYWwgZmlsdGVyIGNyaXRlcmlhCi0gKiB3aGljaCBpcyB1c2VkIHRvIHNlbGVjdCBhIHN1YnNldCBvZiBtZXNzYWdlcyB0byByZXRyaWV2ZS4gSWYgbXVsdGlwbGUgYXR0cmlidXRlcyBvZiB0aGUgbWVzc2FnZQotICogZmlsdGVyIGFyZSBzcGVjaWZpZWQsIHRoZXkgc2hvdWxkIGJlIGxvZ2ljYWxseSBBTkQnZCB0b2dldGhlciBieSB0aGUgTWVzc2FnZUFjY2VzcwotICogaW1wbGVtZW50YXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRmlsdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTllfU0VWRVJJVFkgPSAtMTsKLQotCS8qKgotCSAqIDxwPgotCSAqIE1lc3NhZ2VzIG1hdGNoaW5nIHRoaXMgc2V2ZXJpdHkocykgd2lsbCBiZSByZXRyaWV2ZWQuIE9uZSBvZiBTZXZlcml0eUVudW0gWFhYX3NldmVyaXR5Ci0JICogY29uc3RhbnRzLCBvciBBTllfU0VWRVJJVFkgdG8gc3BlY2lmeSB0aGF0IG1lc3NhZ2VzIG9mIGFueSBzZXZlcml0eSB3aWxsIGJlIHJldHVybmVkLiBUaGlzCi0JICogZmllbGQgY2FuIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgZmlsdGVyIGF0dHJpYnV0ZXMgdG8gbmFycm93IHRoZSBzZWxlY3Rpb24gc2V0IGZ1cnRoZXIuCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgaW50IHNldmVyaXR5ID0gQU5ZX1NFVkVSSVRZOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIHZhbGlkYXRvciB3aGljaCByZXBvcnRlZCB0aGUgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQuIEFsbCBtZXNzYWdlcyB3aGljaCB3ZXJlCi0JICogcmVwb3J0ZWQgdXNpbmcgdmFsaWRhdG9yIG1hdGNoaW5nIHRoaXMgdmFsaWRhdG9yIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMgZmllbGQgY2FuIGJlIGNvbWJpbmVkCi0JICogd2l0aCBvdGhlciBmaWx0ZXIgYXR0cmlidXRlcyB0byBuYXJyb3cgdGhlIHNlbGVjdGlvbiBzZXQgZnVydGhlci4KLQkgKiA8L3A+Ci0JICovCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSB0YXJnZXQgb2JqZWN0IG9mIHRoZSBtZXNzYWdlcyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCwgb3IgbnVsbCB0byBzcGVjaWZ5IHRvIHJldHJpZXZlCi0JICogbWVzc2FnZXMgb2YgYW55IHRhcmdldC4gQWxsIG1lc3NhZ2VzIGhhdmluZyBhIHRhcmdldCBvYmplY3QgbWF0Y2hpbmcgdGhpcyBvYmplY3Qgd2lsbCBiZQotCSAqIHJldHVybmVkLiBUaGlzIGZpZWxkIGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGZpbHRlciBhdHRyaWJ1dGVzIHRvIG5hcnJvdyB0aGUgc2VsZWN0aW9uIHNldAotCSAqIGZ1cnRoZXIuCi0JICogPC9wPgotCSAqLwotCXByaXZhdGUgT2JqZWN0IHRhcmdldE9iamVjdDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFTZXZlcml0eQotCSAqIAkJCVNldmVyaXR5IG9mIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqIAkJCUlWYWxpZGF0b3Igd2hpY2ggcmVwb3J0ZWQgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gYVRhcmdldE9iamVjdAotCSAqIAkJCVRhcmdldCBvYmplY3Qgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUZpbHRlcihpbnQgYVNldmVyaXR5LCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IGFUYXJnZXRPYmplY3QpIHsKLQkJc3VwZXIoKTsKLQkJc2V2ZXJpdHkgPSBhU2V2ZXJpdHk7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0YXJnZXRPYmplY3QgPSBhVGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGZpbHRlciBjb25zdHJhaW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0YXJnZXQgb2JqZWN0IGZpbHRlciBjb25zdHJhaW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFRhcmdldE9iamVjdCgpIHsKLQkJcmV0dXJuIHRhcmdldE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0b3IgdG8gZmlsdGVyIG9uLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNldmVyaXR5IGZpbHRlciBjb25zdHJhaW50LgotCSAqIAotCSAqIEBwYXJhbSBuZXdTZXZlcml0eQotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgZmlsdGVyIGNvbnN0cmFpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgbmV3U2V2ZXJpdHkpIHsKLQkJc2V2ZXJpdHkgPSBuZXdTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRhcmdldCBvYmplY3QgZmlsdGVyIGNvbnN0cmFpbnQuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldE9iamVjdAotCSAqICAgICAgICAgICAgIHRhcmdldCBvYmplY3QgZmlsdGVyIGNvbnN0cmFpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRPYmplY3QoamF2YS5sYW5nLk9iamVjdCBuZXdUYXJnZXRPYmplY3QpIHsKLQkJdGFyZ2V0T2JqZWN0ID0gbmV3VGFyZ2V0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsaWRhdG9yIHRvIHJldHVybiBtZXNzYWdlcyBmb3IuCi0JICogCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqICAgICAgICAgICAgdmFsaWRhdG9yIHRvIHJldHVybiBtZXNzYWdlcyBmb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk3MGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbiB3aGljaCBzaG91bGQgYmUgdGhyb3duIGJ5IElWYWxpZGF0b3JzLiBUaGUgbWVzc2FnZSBpbiB0aGlzCi0gKiBleGNlcHRpb24gbXVzdCBiZSBzdWl0YWJsZSBmb3Igc2hvd2luZyB0byB0aGUgdXNlci4gQWxsIFZhbGlkYXRpb25FeGNlcHRpb25zIHdpbGwgaGF2ZSB0aGVpcgotICogbWVzc2FnZSBleHRyYWN0ZWQgd2hlbiB0aGV5J3JlIGNhdWdodCwgYW5kIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBUaHJvd2FibGUgX2xvd0xldmVsRXhjZXB0aW9uOwotCXByaXZhdGUgSU1lc3NhZ2UgX21lc3NhZ2U7Ci0JcHJpdmF0ZSBDbGFzc0xvYWRlciBfbG9hZGVyOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzg3NTE2OTkzMTI0MjI5OTQ5TDsKLQotCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCBhIGdpdmVuIG1lc3NhZ2Ugc3RyaW5nLiA8YnI+Ci0JICogPGJyPgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBJTWVzc2FnZSwgd2hpY2ggaXMgTG9jYWxlLWluZGVwZW5kZW50LCB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZSB0byBiZSBzaG93biB0bwotCSAqICAgICAgICAgICAgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25FeGNlcHRpb24oSU1lc3NhZ2UgbWVzc2FnZSkgewotCQl0aGlzKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggYSBnaXZlbiBtZXNzYWdlIHN0cmluZywgYW5kIGxvdy1sZXZlbCBleGNlcHRpb24uIDxicj4KLQkgKiA8YnI+Ci0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIElNZXNzYWdlIExvY2FsZS1pbmRlcGVuZGVudCBtZXNzYWdlIHRvIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIHJlbGV2YW50IGxvdy1sZXZlbCBleGNlcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuIDxicj4KLQkgKiAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwIEZvciBleGFtcGxlLCB3aGVuIGEgbWV0aG9kIGZhaWxzIGJlY2F1c2Ugb2YgYSBuZXR3b3JrCi0JICogICAgICAgICAgICBjb21tdW5pY2F0aW9ucyAmbmJzcDsmbmJzcDsmbmJzcCBwcm9ibGVtLCB0aGlzIHdvdWxkIGJlIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+amF2YS5pby5JT0V4Y2VwdGlvbjwvY29kZT4gJm5ic3A7Jm5ic3A7Jm5ic3AgZGVzY3JpYmluZyB0aGUgZXhhY3QgbmF0dXJlCi0JICogICAgICAgICAgICBvZiB0aGUgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkV4Y2VwdGlvbihJTWVzc2FnZSBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQkJX2xvd0xldmVsRXhjZXB0aW9uID0gZXhjZXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvdy1sZXZlbCBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfbG93TGV2ZWxFeGNlcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgSU1lc3NhZ2UgdG8gYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwgaWYgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIGhhbmRsZWQKLQkgKiBpbnRlcm5hbGx5LgotCSAqLwotCXB1YmxpYyBJTWVzc2FnZSBnZXRBc3NvY2lhdGVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaWYgdGhlIElWYWxpZGF0b3Igd2hpY2ggdGhyZXcgdGhpcyBleGNlcHRpb24gd2FzIGxvYWRlZCBieSBhIGRpZmZlcmVudCBDbGFzc0xvYWRlciB0aGFuIHRoZQotCSAqIGZyYW1ld29yaywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgQ2xhc3NMb2FkZXIgb2YgdGhlIElWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gX2xvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHN0cmluZyBvZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IGlmIGl0IHdhcwotCSAqICAgICAgICAge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKFN0cmluZykgY3JlYXRlZH13aXRoIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nOwotCSAqICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgd2FzIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZSgpIGNyZWF0ZWR9d2l0aAotCSAqICAgICAgICAgbm8gZXJyb3IgbWVzc2FnZS4KLQkgKiAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2UuZ2V0VGV4dChnZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogCQkJVGhlIGxvY2FsZSBvZiB3aGljaCB0byBnZXQgdGhlIG1lc3NhZ2UuCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBzdHJpbmcgb2YgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdCBpZiBpdCB3YXMKLQkgKiAgICAgICAgIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlI1Rocm93YWJsZShTdHJpbmcpIGNyZWF0ZWR9d2l0aCBhbiBlcnJvciBtZXNzYWdlIHN0cmluZzsKLQkgKiAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoKSBjcmVhdGVkfXdpdGgKLQkgKiAgICAgICAgIG5vIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIF9tZXNzYWdlLmdldFRleHQobG9jYWxlLCBnZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZiB0aGUgSVZhbGlkYXRvciB3aGljaCB0aHJldyB0aGlzIGV4Y2VwdGlvbiB3YXMgbG9hZGVkIGJ5IGEgZGlmZmVyZW50IENsYXNzTG9hZGVyIHRoYW4gdGhlCi0JICogZnJhbWV3b3JrLCB0aGlzIG1ldGhvZCBzaG91bGQgc2V0IHRoZSBDbGFzc0xvYWRlciB0byBiZSB0aGUgQ2xhc3NMb2FkZXIgb2YgdGhlIElWYWxpZGF0b3IuCi0JICogPC9wPgotCSAqIEBwYXJhbSBsb2FkZXIKLQkgKiAgCQlDbGFzc0xvYWRlciBvZiB0aGUgdmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0JCV9sb2FkZXIgPSBsb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoaXMgdGhyb3dhYmxlIG9iamVjdC4gSWYgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdAotCSAqIHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoU3RyaW5nKSBjcmVhdGVkfXdpdGggYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoZW4KLQkgKiB0aGUgcmVzdWx0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRocmVlIHN0cmluZ3M6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgbmFtZSBvZiB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoaXMgb2JqZWN0Ci0JICogPGxpPiI6ICIgKGEgY29sb24gYW5kIGEgc3BhY2UpCi0JICogPGxpPlRoZSByZXN1bHQgb2YgdGhlIHtAbGluayAjZ2V0TWVzc2FnZX1tZXRob2QgZm9yIHRoaXMgb2JqZWN0Ci0JICogPC91bD4KLQkgKiBJZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IHdhcyB7QGxpbmsgamF2YS5sYW5nLlRocm93YWJsZSNUaHJvd2FibGUoKSBjcmVhdGVkfQotCSAqIHdpdGggbm8gZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoZW4gdGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGlzIG9iamVjdCBpcyByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRvU3RyaW5nKExvY2FsZS5nZXREZWZhdWx0KCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIHRocm93YWJsZSBvYmplY3QuIElmIHRoaXMgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKiB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKFN0cmluZykgY3JlYXRlZH13aXRoIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGVuCi0JICogdGhlIHJlc3VsdCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aHJlZSBzdHJpbmdzOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIG5hbWUgb2YgdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGlzIG9iamVjdAotCSAqIDxsaT4iOiAiIChhIGNvbG9uIGFuZCBhIHNwYWNlKQotCSAqIDxsaT5UaGUgcmVzdWx0IG9mIHRoZSB7QGxpbmsgI2dldE1lc3NhZ2V9bWV0aG9kIGZvciB0aGlzIG9iamVjdAotCSAqIDwvdWw+Ci0JICogSWYgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IG9iamVjdCB3YXMge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGUjVGhyb3dhYmxlKCkgY3JlYXRlZH0KLQkgKiB3aXRoIG5vIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLCB0aGVuIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhpcyBvYmplY3QgaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoTG9jYWxlIGxvY2FsZSkgewotCQlTdHJpbmcgcyA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgbWVzc2FnZSA9IGdldE1lc3NhZ2UobG9jYWxlKTsKLQkJcmV0dXJuIChtZXNzYWdlICE9IG51bGwpID8gKHMgKyAiOiAiICsgbWVzc2FnZSkgOiBzOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdG9yTGF1bmNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL1ZhbGlkYXRvckxhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjk3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdG9yTGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5NZXNzYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgc2luZ2xldG9uIGxhdW5jaGVzIHRoZSB2YWxpZGF0aW9uIG9uIGEgc2luZ2xlIHZhbGlkYXRvci4gQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIGNsYXNzJ3MKLSAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBtZXRob2QgdG8gYmVnaW4gdGhlIHZhbGlkYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JMYXVuY2hlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdG9yTGF1bmNoZXIgX2xhdW5jaGVyOwotCi0JcHJpdmF0ZSBWYWxpZGF0b3JMYXVuY2hlcigpIHsKLQkJLy9EZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGxhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTGF1bmNoZXIgZ2V0TGF1bmNoZXIoKSB7Ci0JCWlmIChfbGF1bmNoZXIgPT0gbnVsbCkgewotCQkJX2xhdW5jaGVyID0gbmV3IFZhbGlkYXRvckxhdW5jaGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9sYXVuY2hlcjsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyB0aGUgbGF1bmNoIHBvaW50IG9mIHRoZSB2YWxpZGF0aW9uLiBJdCBydW5zIHZhbGlkYXRpb24gb24gdGhlIHZhbGlkYXRvcgotCSAqIGFjY2Vzc2VkIGJ5IHRoZSBJVmFsaWRhdGlvbkNvbnRleHQuIFdoZW4gdGhlIHZhbGlkYXRpb24gaXMgY29tcGxldGUsIGVhY2ggdmFsaWRhdG9yIG1heSBwZXJmb3JtIHJlc291cmNlCi0JICogY2xlYW51cCwgaWYgbmVjZXNzYXJ5LgotCSAqIAotCSAqIDxicj4KLQkgKiA8YnI+Ci0JICogSWYgPGNvZGU+aGVscGVyPC9jb2RlPiw8Y29kZT52YWxpZGF0b3I8L2NvZGU+LCBvciA8Y29kZT5yZXBvcnRlcjwvY29kZT4gYXJlIG51bGwsCi0JICogdmFsaWRhdGlvbiBpcyBub3QgcGVyZm9ybWVkLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+IG1heSBiZSBudWxsLCBvciBlbXB0eSwgaWYgYSBmdWxsCi0JICogYnVpbGQgc2hvdWxkIGJlIGRvbmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBoZWxwZXIgCi0JICogCQkJbG9hZHMgYW4gb2JqZWN0LiAKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogCQkJdmFsaWRhdG9yIG9iamVjdCB0byBsYXVuY2ggdmFsaWRhdGlvbi4KLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiAJCQlJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvcgotCSAqIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICogQHBhcmFtIGNoYW5nZWRGaWxlcwotCSAqIAkJCUlzIGFuIGFycmF5IG9mIGZpbGVzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCwgY2hhbmdlZCwgb3IgZGVsZXRlZAotCSAqIHNpbmNlIHRoZSBsYXN0IHZhbGlkYXRpb24uIElmIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4gaXMgbnVsbCwgb3IgaWYgaXQgaXMgYW4gZW1wdHkKLQkgKiBhcnJheSwgdGhlbiBhIGZ1bGwgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBPdGhlcndpc2UsIHZhbGlkYXRpb24gb24ganVzdCB0aGUgZmlsZXMKLQkgKiBsaXN0ZWQgaW4gdGhlIGFycmF5IHNob3VsZCBwZXJmb3JtZWQgaWYgdGhlIHZhbGlkYXRvciBzdXBwb3J0cyBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKChoZWxwZXIgPT0gbnVsbCkgfHwgKHZhbGlkYXRvciA9PSBudWxsKSB8fCAocmVwb3J0ZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENhbid0IGZvcmNlIGVhY2ggdmFsaWRhdG9yIHRvIGNoZWNrIGlmIGl0J3MgY2FuY2VsbGVkIG9yIG5vdCwKLQkJLy8gc28gY2hlY2sgZm9yIGNhbmNlbGxhdGlvbiBoZXJlLiBIb3BlZnVsbHkgdGhlIHVzZXIgd29uJ3Qgd2FpdAotCQkvLyB0b28gbG9uZy4KLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIElmIHRoZSB2YWxpZGF0b3IgaXMgYWJvdXQgdG8gcGVyZm9ybSBhIGZ1bGwgYnVpbGQsIHJlbW92ZSBhbGwgb2YgaXRzIHByZXZpb3VzIHZhbGlkYXRpb24KLQkJLy8gbWVzc2FnZXMuCi0JCWlmICgoaGVscGVyLmdldFVSSXMoKSA9PSBudWxsKSB8fCAoaGVscGVyLmdldFVSSXMoKS5sZW5ndGggPT0gMCkpIHsKLQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JCX0KLQkJaWYoIHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IgKXsKLQkJCSgoSVZhbGlkYXRvckpvYil2YWxpZGF0b3IpLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCByZXBvcnRlcik7Ci0JCX1lbHNlewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JCWlmKCB2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iICl7Ci0JCQkvL3RoZSAgdmFsaWRhdG9ycyB3aG8gaGF2ZSBpbXBsZW1lbnRlZCBJVmFsaWRhdG9ySm9iIGJ1dCBhcmUgcnVubmluZyBzeW5jaHJvbm91c2x5Ci0JCQkvL3dvdWxkIGxvZyBtZXNzYWdlcyBub3cgLi4uCi0JCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkJZmluYWwgQXJyYXlMaXN0IGxpc3QgPSBtZ3IuZ2V0TWVzc2FnZXMoKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yKTsKLQotCSAgICAJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSggaXQuaGFzTmV4dCgpICl7Ci0JCQkJTWVzc2FnZUluZm8gaW5mbyA9IChNZXNzYWdlSW5mbylpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQlUYXNrTGlzdFV0aWxpdHkuYWRkVGFzayggaW5mby5nZXRNZXNzYWdlT3duZXJJZCgpLCBpbmZvLmdldFJlc291cmNlKCksCi0JCQkJCQkJaW5mby5nZXRMb2NhdGlvbigpLCBpbmZvLmdldE1zZygpLmdldElkKCksIGluZm8uZ2V0VGV4dCgpLAotCQkJCQkJCWluZm8uZ2V0TXNnKCkuZ2V0U2V2ZXJpdHkoKSwgaW5mby5nZXRUYXJnZXRPYmplY3ROYW1lKCksCi0JCQkJCQkJaW5mby5nZXRNc2coKS5nZXRHcm91cE5hbWUoKSwgaW5mby5nZXRNc2coKS5nZXRPZmZzZXQoKSwgaW5mby5nZXRNc2coKS5nZXRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJfQotCQkJCX0JCQkJCQkJCQkJCi0JCQl9Ci0JCQltZ3IuY2xlYXJNZXNzYWdlcyggKElWYWxpZGF0b3JKb2IpdmFsaWRhdG9yICk7Ci0JCX0KLQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWExYTMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsb2NhbGUtaW5kZXBlbmRlbnQgdmFsaWRhdGlvbiBtZXNzYWdlLgotICogPC9wPgotICogPHA+Ci0gKiBHaXZlbiB0aGVzZSB0aHJlZSB2YWx1ZXMgYXMgaW5wdXQsIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSBxdWVyaWVkIGZvciB0aGUgZmluYWwgbWVzc2FnZSBzdHJpbmcuCi0gKiAoaS5lLiwgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGFyYW1ldGVycyBhbHJlYWR5IHN1YnN0aXR1dGVkIGluLikgRWl0aGVyIHRoZSBkZWZhdWx0IExvY2FsZSBjYW4gYmUKLSAqIHVzZWQsIG9yIHRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgYSBMb2NhbGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogPC9wPgotICogCi0gKiBbaXNzdWU6IENTIC0gVGhlICdJTWVzc2FnZScgaW50ZXJmYWNlIHdvdWxkIGJlIHNpbXBsZXIgd2l0aG91dCB0aGUgYnVuZGxlIHJlbGF0ZWQgZGV0YWlscy4gIEknZCBsaWtlIHRvIHVuZGVyc3RhbmQKLSAqIHdoeSB3ZSBjYW4gJ3ByZWNvbXB1dGUnIHRoZSB0cmFuc2xhdGVkIG1lc3NhZ2UuIElzIHRoZXJlIHNvbWUgYmVuZWZpdCB0byBwZXJmb3JtICdsYXRlIGNvbXB1dGF0aW9uJyBvZiB0aGVzZSBtZXNzYWdlcz8KLSAqIEhvdyBkb2VzIHRoaXMgY29tcGFyZSB0byB0aGUgZWNsaXBzZSBNYXJrZXIgKGFzIGZhciBhcyBJIGtub3cgdGhlIE1hcmtlcidzIHRleHQoKSBpcyBwcmVMb2NhbGl6ZWQpLgotICogSGVyZSdzIGEgbGlzdCBvZiB0aGUgbWV0aG9kcyB0aGF0IGFyZSByZWxhdGVkIHRvICdidW5kbGUgc3BlY2lmaWMnIGFzcGVjdHMgYW5kIGNvdWxkIGJlIHNlcGFyYXRlIG91dCAob3IgZGVzaWduZWQgYXdheSk/Ci0gKiAgICAKLSAqICAgLSBnZXRJZCgpCi0gKiAgIC0gZ2V0QnVuZGxlKC4uLikKLSAqICAgLSBnZXRCdW5kbGVOYW1lKCkKLSAqICAgLSBnZXRQYXJhbXMoKQotICogICAtIGdldFRleHQoTG9jYWxlKQotICogICAtIGdldFRleHQoQ2xhc3NMb2FkZXIpCi0gKiAgIC0gZ2V0VGV4dChMb2NhbGUsIENsYXNzTG9hZGVyKQotICogICAtIHNldElkKFN0cmluZykKLSAqICAgLSBzZXRCdW5kbGVOYW1lKFN0cmluZykKLSAqICAgLSBzZXRQYXJhbXMoU3RyaW5nW10pCi0gKiBdCi0gKiAKLSAqICAgLSB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgT2JqZWN0IHZhbHVlKQotICogICAtIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotICogXQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlIHsKLQlpbnQgT0ZGU0VUX1VOU0VUID0gLTE7IC8vIHNlZSBnZXRMZW5ndGgoKSwgZ2V0T2Zmc2V0KCkKLQlpbnQgTElORU5PX1VOU0VUID0gMDsKLQkKLQkvKioKLQkgKiBUeXBpY2FsbHkgdXNlZCB0byBzcGVjaWZ5IGVycm9yIG1lc3NhZ2VzLgotCSAqLwotCWludCBISUdIX1NFVkVSSVRZID0gMHgwMDAxOwotCS8qKgotCSAqIFR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgd2FybmluZyBtZXNzYWdlcy4KLQkgKi8KLQlpbnQgTk9STUFMX1NFVkVSSVRZID0gMHgwMDAyOwotCS8qKgotCSAqIFR5cGljYWxseSB1c2VkIHRvIHNwZWNpZnkgaW5mb3JtYXRpb24gbWVzc2FnZXMuCi0JICovCi0JaW50IExPV19TRVZFUklUWSA9IDB4MDAwNDsKLQkvKioKLQkgKiBTcGVjaWZ5IGhpZ2ggKGVycm9yKSBhbmQgbm9ybWFsICh3YXJuaW5nKSBtZXNzYWdlcy4gVHlwaWNhbGx5IHVzZWQgd2l0aCBhIE1lc3NhZ2VGaWx0ZXIsIHRvCi0JICogZmlsdGVyIG91dCBpbmZvcm1hdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlpbnQgRVJST1JfQU5EX1dBUk5JTkcgPSBISUdIX1NFVkVSSVRZIHwgTk9STUFMX1NFVkVSSVRZOwotCS8qKgotCSAqIFNwZWNpZnkgYWxsIHR5cGVzIG9mIG1lc3NhZ2VzLiBUeXBpY2FsbHkgdXNlZCB3aXRoIGEgTWVzc2FnZUZpbHRlci4KLQkgKi8KLQlpbnQgQUxMX01FU1NBR0VTID0gRVJST1JfQU5EX1dBUk5JTkcgfCBMT1dfU0VWRVJJVFk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotCSAqIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpCi0JICogbWVhbnMgbm8gZ3JvdXAuCi0JICogPC9wPgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGdyb3VwIHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuCi0JICovCi0JU3RyaW5nIGdldEdyb3VwTmFtZSgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UuIE1lc3NhZ2UgaWRzIGFyZSB1c2VkIGFzIHRoZSBjb25zdGFudHMgaW4gcHJvcGVydHkgYnVuZGxlcwotCSAqIHdoaWNoIGxvY2FsaXplIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCBmYXNoaW9uLiBUaGUgaWQgaXMgdGhlCi0JICoga2V5LCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBzdHJpbmcgdG8gYmUgbG9hZGVkLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsCi0JICogb3IgdGhlIGVtcHR5IHN0cmluZy4KLQkgKiA8L3A+Ci0JICogQHJldHVybiB0aGUgaWQgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSBhcmVhLCBzdGFydGluZyBmcm9tIHRoZSBvZmZzZXQuIElmIHVuc2V0LCB2YWx1ZSA9Ci0JICogSU1lc3NhZ2UuT0ZGU0VUX1VOU0VULgotCSAqIAotCSAqIEBzZWUgI2dldE9mZnNldCgpCi0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogSWYgdGhlcmUgaXMgYSB0YXJnZXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElNZXNzYWdlLCBhbmQgdGhhdCB0YXJnZXQgb2JqZWN0IGlzIGEgZmlsZSwKLQkgKiB0aGVuIGFuIG9wdGlvbmFsIGxpbmUgbnVtYmVyIG1heSBiZSBzZXQuIFRoZSBsaW5lIG51bWJlciBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgKiBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhpcyBtZXNzYWdlLiBJZiBubyBsaW5lIG51bWJlciBoYXMgYmVlbiBzZXQsICNMSU5FTk9fVU5TRVQgd2lsbCBiZQotCSAqIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiBAcmV0dXJuIGxpbmUgbnVtYmVyIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvYmxlbS4KLQkgKiAKLQkgKi8KLQlpbnQgZ2V0TGluZU51bWJlcigpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLiBJZiB1bnNldCwgdmFsdWUgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuIEZvciBleGFtcGxlLCBpZgotCSAqIHRoZSBqYXZhIGNvbXBpbGVyIHdlcmUgYSB2YWxpZGF0b3IsIGFuZCBpdCByZXBvcnRlZCB0aGF0IGEgdmFyaWFibGUgbmFtZSB3YXMgdW5rbm93biwgb2Zmc2V0Ci0JICogd291bGQgaWRlbnRpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVua25vd24gdmFyaWFibGUuIChUaGUgcG9zaXRpb24gaXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4pCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gb2Zmc2V0IG9mIHRoZSBtZXNzYWdlCi0JICovCi0JaW50IGdldE9mZnNldCgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSB0aGUgdmFsdWVzIHdoaWNoIGFyZQotCSAqIHN1YnN0aXR1dGVkIGludG8gcGFyYW1ldGVyIHNsb3RzIGluIGxvY2FsaXplZCBtZXNzYWdlIHRleHQgZGRzY3JpcHRpb25zLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhcmFtZXRlcnMgb2YgdGhlIG1lc3NhZ2UKLQkgKi8KLQlTdHJpbmdbXSBnZXRQYXJhbXMoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlLiBPbmUgb2YgU2V2ZXJpdHlFbnVtIGNvbnN0YW50cy4KLQkgKiAKLQkgKiBAc2VlIElNZXNzYWdlI0hJR0hfU0VWRVJJVFkKLQkgKiBAc2VlIElNZXNzYWdlI05PUk1BTF9TRVZFUklUWQotCSAqIEBzZWUgSU1lc3NhZ2UjTE9XX1NFVkVSSVRZCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlCi0JICovCi0JaW50IGdldFNldmVyaXR5KCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHRoaXMgSU1lc3NhZ2UgaXMgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFnYWluc3QsIGlmIGFueS4gbnVsbCB3aWxsIGJlCi0JICogcmV0dXJuZWQgaWYgdGhpcyBpcyBhIGdlbmVyYWwgbWVzc2FnZSB3aGljaCBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgb2JqZWN0OyBmb3IKLQkgKiBleGFtcGxlLCAiaW50ZXJuYWwgZXJyb3IiLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgbWVzc2FnZQotCSAqLwotCU9iamVjdCBnZXRUYXJnZXRPYmplY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgTG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciAKLQkgKiAJCQkJVGhlIENsYXNzTG9hZGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBSZXNvdXJjZUJ1bmRsZS4KLQkgKiAgICAgICAgICAgIAotCSAqIEByZXR1cm4gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVzc2FnZSBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIHNwZWNpZmllZCBDbGFzc0xvYWRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogICAgICAgICAgICAKLQkgKiBAcmV0dXJuIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1lc3NhZ2UgZm9ybWF0dGVkIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLCB3aXRoIHRoZQotCSAqIGJ1bmRsZSBsb2FkZWQgYnkgdGhlIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBUaGUgbG9jYWxlIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSB0ZXh0IGludG8uCi0JICogQHBhcmFtIGNsYXNzTG9hZGVyCi0JICogICAgICAgICAgICBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFJlc291cmNlQnVuZGxlLgotCSAqICAgICAgICAgICAgCi0JICogQHJldHVybiBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgd2l0aCB0aGUKLQkgKiBidW5kbGUgbG9hZGVkIGJ5IHRoZSBzcGVjaWZpZWQgQ2xhc3NMb2FkZXIuCi0JICovCi0JU3RyaW5nIGdldFRleHQoTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpOwotCQotCS8qKgotCSAqIFByb3ZpZGVzIGEgd2F5IHRvIHN0b3JlIHNvbWUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgYSBtZXNzYWdlIHdvdWxkIGxpa2UgdG8gc3RvcmUKLQkgKiB0aGF0IGNhbiB1c2VkIGJ5IHNvbWUgb3RoZXIgcGFydGllcyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGF0dHJpYnV0ZSB2YWx1ZXMuIEJhc2ljYWxseQotCSAqIGEgY29udmllbmluY2UgdG8gcGFzcyBvYmplY3QgdmFsdWVzIGFyb3VuZCB0aGF0IGNhbiBjb25zdW1lZCBieSBvdGhlciBPYmplY3RzIGl0IHRoZXkgbmVlZCBpdAotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHJldHVybiBhbiBPYmplY3QgYmFzaWNhbGx5IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBuYW1lLgotCSAqLwotCQotCSBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGF0dHJpYnV0ZU5hbWUgYW5kIHZhbHVlIGFzIGtleSB2YWx1ZSBwYWlyCi0JICogQHNlZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpLgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICovCi0JCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0JICAgCi0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIAotCSAqIAkJCU5hbWUgb2YgdGhlIGJ1bmRsZSB3aGljaCBjb250YWlucyB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldEJ1bmRsZU5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IgbWF5IGFzc2lnbiBncm91cCBuYW1lcwotCSAqIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZCBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpCi0JICogbWVhbnMgbm8gZ3JvdXAuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogCQkJTmFtZSBvZiB0aGUgZ3JvdXAuCi0JICovCi0Jdm9pZCBzZXRHcm91cE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0IHRoZSBpZCBvZiB0aGUgbWVzc2FnZS4gTWVzc2FnZSBpZHMgYXJlIHVzZWQgYXMgdGhlIGNvbnN0YW50cyBpbiBwcm9wZXJ0eSBidW5kbGVzIHdoaWNoCi0JICogbG9jYWxpemUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIGluIGEgbG9jYWxlLWluZGVwZW5kZW50IGZhc2hpb24uIFRoZSBpZCBpcyB0aGUga2V5LAotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIHN0cmluZyB0byBiZSBsb2FkZWQuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwgb3IKLQkgKiB0aGUgZW1wdHkgc3RyaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiAgICAgICAgICAgIElkIG9mIHRoZSBtZXNzYWdlLgotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvYmxlbSwgc3RhcnRpbmcgZnJvbSB0aGUgb2Zmc2V0LiBJZiB1bnNldCwgdmFsdWUgPQotCSAqIElNZXNzYWdlLk9GRlNFVF9VTlNFVC4KLQkgKiAKLQkgKiBAc2VlICNzZXRPZmZzZXQoaW50KQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoIAotCSAqCQkJc2V0cyB0aGUgbGVuZ3RoIAkJCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBpcyBhIHRhcmdldCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU1lc3NhZ2UsIGFuZCB0aGF0IHRhcmdldCBvYmplY3QgaXMgYSBmaWxlLAotCSAqIHRoZW4gYW4gb3B0aW9uYWwgbGluZSBudW1iZXIgbWF5IGJlIHNldC4gVGhlIGxpbmUgbnVtYmVyIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAqIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGlzIG1lc3NhZ2UuIFRvIGluZGljYXRlIG5vIGxpbmUgbnVtYmVyLCB1c2UgI0xJTkVOT19VTlNFVC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIGxpbmVOdW1iZXIgCi0JICoJCQlzZXRzIHRoZSBsaW5lIG5vLiAJCi0JICovCi0Jdm9pZCBzZXRMaW5lTm8oaW50IGxpbmVOdW1iZXIpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBtZXNzYWdlLiBJZiB1bnNldCwgdmFsdWUgPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQuIEZvciBleGFtcGxlLCBpZiB0aGUKLQkgKiBqYXZhIGNvbXBpbGVyIHdlcmUgYSB2YWxpZGF0b3IsIGFuZCBpdCByZXBvcnRlZCB0aGF0IGEgdmFyaWFibGUgbmFtZSB3YXMgdW5rbm93biwgb2Zmc2V0Ci0JICogd291bGQgaWRlbnRpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVua25vd24gdmFyaWFibGUuIChUaGUgcG9zaXRpb24gaXMKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4pCi0JICogPC9wPgotCSAqIEBwYXJhbSBvZmZzZXQgCi0JICoJCQlzZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1lc3NhZ2UuCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXNzYWdlLiBNZXNzYWdlIHBhcmFtZXRlcnMgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHN1YnN0aXR1dGVkCi0JICogaW50byBwYXJhbWV0ZXIgc2xvdHMgaW4gbG9jYWxpemVkIG1lc3NhZ2UgdGV4dCBkZXNjcmlwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBpZiBnZXRJZCgpIHJldHVybnMgIk1ZX0lEIiwgdGhlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaWRlbnRpZmllZCBieQotCSAqIGdldEJ1bmRsZU5hbWUoKSBpcyBzZWFyY2hlZCBmb3IgdGhlIG1lc3NhZ2UgbmFtZWQgIk1ZX0lEIiwgYW5kIGlmIGZvdW5kLAotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKSBpcyBpbnZva2VkIG9uIHRoZSBtZXNzYWdlLCB3aXRoCi0JICogICAgICA8Y29kZT5uZXdQYXJhbXM8L2NvZGU+IHBhc3NlZCBpbiBhcyB0aGUgT2JqZWN0W10uCi0JICogQHBhcmFtIG5ld1BhcmFtcwotCSAqICAgICAgICAgICAgcGFyYW1ldGVycyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQl2b2lkIHNldFBhcmFtcyhTdHJpbmdbXSBuZXdQYXJhbXMpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UuIE9uZSBvZiBTZXZlcml0eUVudW0gY29uc3RhbnRzLgotCSAqIAotCSAqIEBzZWUgSU1lc3NhZ2UjSElHSF9TRVZFUklUWQotCSAqIEBzZWUgSU1lc3NhZ2UjTk9STUFMX1NFVkVSSVRZCi0JICogQHNlZSBJTWVzc2FnZSNMT1dfU0VWRVJJVFkKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlCi0JICovCi0Jdm9pZCBzZXRTZXZlcml0eShpbnQgbmV3U2V2ZXJpdHkpOwotCi0JLyoqCi0JICogPHA+Ci0JICogQXNzb2NpYXRlIHRoaXMgSU1lc3NhZ2Ugd2l0aCB0aGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBwcm9ibGVtLiBBIG51bGwgdmFsdWUgaXMgcGVybWl0dGVkLiBJZiBhCi0JICogbWVzc2FnZSBpcyBhcHBsaWNhYmxlIHRvIG9uZSBvYmplY3QsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0LiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0Ci0JICogdmFsdWUgKG51bGwpIHNob3VsZCBiZSBrZXB0LiBHaXZlbiB0aGlzIHRhcmdldCBvYmplY3QsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlCi0JICogZXhhY3QgbG9jYXRpb24gb2YgdGhlIHByb2JsZW0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIHByb2JsZW0uCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRPYmplY3QoT2JqZWN0IG9iaik7Ci0JCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBhIE1lc3NhZ2Ugb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCUhhc2hNYXAgZ2V0QXR0cmlidXRlcygpOwotCQotCS8qKgotCSAqIHJldHVybiB0aGUgbWFya2VyIGlkIGlmIG9uZSBpcyBzZXQgb24gdGhpcyBvYmplY3Qgd2hlbiBjcmVhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hcmtlcklkKCk7Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBtYXJrZXIgaWQgb24gYSBNZXNzYWdlIG9iamVjdAotCSAqLwotCSB2b2lkIHNldE1hcmtlcklkKFN0cmluZyBtYXJrZXJJZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZV9jb3JlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1ldGFNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhOWNmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWV0YU1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGFNb2RlbENvbnRleHQgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoU3RyaW5nIFVSSSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MzNkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGEKLSAqIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdCBvbiB3aGljaCBhIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIElWYWxpZGF0aW9uQ29udGV4dAotewotICAvKioKLSAgICogUHJvdmlkZXMgdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcyBiZWluZyBpbnZva2VkLgotICAgKiAKLSAgICogQHJldHVybiBhbiBJUHJvamVjdCByZWZlcmVuY2UgdG8gdGhlIHByb2plY3Qgb24gd2hpY2ggdGhlIHZhbGlkYXRvciBpcwotICAgKiAgICAgICAgIGJlaW5nIGludm9rZWQuCi0gICAqLwotICBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUmVwb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI1MmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoKLSAqIENDTSAtIFJlcG9ydGVyIGlzIG5vdyBwYXNzZWQgbG9jYWxlLWluZGVwZW5kZW50IG1lc3NhZ2VzLgotICogICAgICAgTWVzc2FnZXMgc2hvdWxkIG9ubHkgYmUgdHJhbnNsYXRlZCB0byBhIGxvY2FsZSB1cG9uIGFjY2Vzcy4KLSAqICAgICAgIE9yIGluIHNwZWNpYWwgbG9jYWxlLWRlcGVuZGVudCByZXBvcnRlciBpbXBsZW1lbnRhdGlvbnMgKGNvbnNvbGUgbG9nZ2VyKS4KLSAqLwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgdXNlZCBieSBJVmFsaWRhdG9yJ3MgdG8gcmVwb3J0IG1lc3NhZ2VzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElSZXBvcnRlciBjb3VsZAotICogc2ltcGx5IGxvZyB0aGUgbWVzc2FnZXMgdG8gc3Rkb3V0LCBhIGZpbGUsIG9yIHJldGFpbiB0aGVtIGluIGEgYnVmZmVyIGZvciBsYXRlciBhY2Nlc3MgYnkgYSB1c2VyCi0gKiBpbnRlcmZhY2UuCi0gKiAKLSAqIFJlcG9ydGVyIGltcGxlbWVudGF0aW9ucyBzaG91bGQga2VlcCBub24tbG9jYWxpemVkIHZlcnNpb25zIG9mIHRoZWlyIG1lc3NhZ2VzCi0gKiAKLSAqIEFueSBtZXNzYWdlcyB3aGljaCBuZWVkIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcmUgZG9uZSB0aHJvdWdoIHRoaXMgY2xhc3MsIGFuZCBpZiB0aGUgdXNlcgotICogY2FuY2VscyB0aGUgY3VycmVudCBmdW5jdGlvbiwgdGhpcyBjbGFzcyBpcyB0aGUgb25lIHdoaWNoIHJlZ2lzdGVycyB0aGUgY2FuY2VsbGF0aW9uLgotICogCi0gKiBUaGUgSVJlcG9ydGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQgYXQgdGhlIHRpbWUgdmFsaWRhdGlvbiBiZWdpbnMgYW5kIGVuZHMgd2hlbiB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgotICogVGhlcmUgaXMgb25seSBvbmUgSVJlcG9ydGVyIGluc3RhbmNlIGNyZWF0ZWQgZm9yIGFsbCB2YWxpZGF0b3JzIHRoYXQgYXJlIHJ1biBvbiBhIElSZXNvdXJjZS4gVGhlIElSZXNvdXJjZQotICogcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IG1lc3NhZ2VzIHB1dCBvdXQgZWFjaCB2YWxpZGF0b3IgYW5kIGFkZCBhbmQgZGVsZXRlIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yCi0gKiBhdCBhIHRpbWUuIAotICogXSAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVwb3J0ZXIgewotCS8qKgotCSAqIDxwPgotCSAqIEFkZCBhIGxvY2FsZS1pbmRlcGVuZGVudCB2YWxpZGF0aW9uIG1lc3NhZ2UuIEl0IHdpbGwgYmUgZGlzcGxheWVkIGxhdGVyLCB3aXRoIGFsbCBvZiB0aGUKLQkgKiBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgSVZhbGlkYXRvciBwYXNzZWQgaW4gaXMgbmVlZGVkIGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uICh3aGVuIGEgbWVzc2FnZSBuZWVkcyB0byBiZQotCSAqIHJlbW92ZWQsIG9uZSB2YWxpZGF0b3Igc2hvdWxkIG5vdCByZW1vdmUgbWVzc2FnZXMgZW50ZXJlZCBieSBhbm90aGVyIHZhbGlkYXRvci4pIFRoZQotCSAqIHZhbGlkYXRvciBpcyBhbHNvIHF1ZXJpZWQgZm9yIGluZm9ybWF0aW9uIGFib3V0IGl0cyByZXNvdXJjZSBidW5kbGUsIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotCSAqIGxvY2FsaXphdGlvbiBvZiBtZXNzYWdlcyBpbiBhIGNsaWVudC1zZXJ2ZXIgZW52aXJvbm1lbnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb3JpZ2luCi0JICogICAgICAgICAgICBUaGUgdmFsaWRhdG9yIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIEEgbWVzc2FnZSB0byBiZSByZXBvcnRlZAotCSAqIEBleGNlcHRpb24gTWVzc2FnZUxpbWl0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaXMgdGhyb3duIHdoZW4gdGhlIHRvdGFsIG51bWJlciBvZiBtZXNzYWdlcyByZXBvcnRlZCBleGNlZWRzIHRoZSBtYXhpbXVtCi0JICogICAgICAgICAgICAgICAgYWxsb3dlZC4KLQkgKiBbaXNzdWU6IExNIC0gVGhpcyBleGNlcHRpb24gc2VlbXMgcXVlc3Rpb25hYmxlIHRvIG1lLiBXaHkgZG8gdmFsaWRhdG9ycyBuZWVkIHRvIGtub3cgaG93Ci0JICogIHRvIGhhbmRsZSBhIE1lc3NhZ2VMaW1pdEV4Y2VwdGlvbj8gU2VlbXMgdG8gbWUgdGhhdCB0aGlzIGlzIGEgdmFsaWRhdGlvbiBmcmFtZXdvcmsKLQkgKiAgc3BlY2lmaWMgaXNzdWUgYW5kIHRoYXQgY2xpZW50IHZhbGlkYXRvcnMgc2hvdWxkbid0IGtub3cgYWJvdXQgdGhpcyBhdCBhbGwuIF0KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogPHA+Ci0JICogU2hvdyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtZXNzYWdlLCBmb3JtYXR0ZWQgaW4gdGhlIGRlZmF1bHQgTG9jYWxlLCB0byB0aGUgdXNlcgotCSAqIGltbWVkaWF0ZWx5LiBUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHdoaWNoIHN1YnRhc2sgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIG1lc3NhZ2UKLQkgKiBpcyBub3Qgc3RvcmVkLiBUaGUgc3VidGFzayBtZXNzYWdlIGluIHRoaXMgY29udGV4dCBpcyB0aGUgc3VidGFzayBpbiBhIElQcm9ncmVzc01vbnRpb3IgCi0JICogCi0JICogQHNlZSBzdWJUYXNrKFN0cmluZyBuYW1lKSBpbiBJUHJvZ3Jlc3NNb25pdG9yCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEJvdGggcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIElWYWxpZGF0b3IKLQkgKiAgICAgICAgICAgIHZhbGlkYXRvciBUaGUgdmFsaWRhdG9yIGlzc3VpbmcgdGhlIHN1YnRhc2sgbWVzc2FnZS4KLQkgKiBAcGFyYW0gSU1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgYWNjZXNzIGludGVyZmFjZSB0byB0aGlzIHJlcG9ydGVyLCBvciBudWxsIGlmIG1lc3NhZ2UgYWNjZXNzIGlzIG5vdAotCSAqIHN1cHBvcnRlZC4KLQkgKiAgICAgCi0JICovCi0JTGlzdCBnZXRNZXNzYWdlcygpOwotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQotCSAqIGNhbGxlZCBieSBJVmFsaWRhdG9ycyBwZXJpb2RpY2FsbHksIGJlY2F1c2Ugbm8gZXZlbnQgaXMgZmlyZWQgdG8gbm90aWZ5IElWYWxpZGF0b3JzIHRoYXQgdGhlCi0JICogdXNlciBjYW5jZWxsZWQgdmFsaWRhdGlvbi4gSWYgYSB2YWxpZGF0b3IgZG9lcyBub3QgY2hlY2sgdGhpcyBtZXRob2QsIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QKLQkgKiBpcyBpZ25vcmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHZhbGlkYXRpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICogIAotCSAqLwotCWFic3RyYWN0IGJvb2xlYW4gaXNDYW5jZWxsZWQoKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIFJlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcyBlbnRlcmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvci4gVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQKLQkgKiBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBJVmFsaWRhdG9yIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb3JpZ2luCi0JICogCQkJb3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuICAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdmFsaWRhdGlvbiBtZXNzYWdlcywgZW50ZXJlZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsIHBlcnRhaW5pbmcgdG8gdGhlIE9iamVjdAotCSAqIHByb3ZpZGVkLiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gPGJyPgotCSAqIDxicj4KLQkgKiBJZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG51bGwsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQgYnkgdGhlCi0JICogdmFsaWRhdG9yLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHRoZSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKSA8YnI+Ci0JICogPGJyPgotCSAqIDxwPgotCSAqIFRoZSBJVmFsaWRhdG9yIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gb3JpZ2luCi0JICogCQkJb3JpZ2luYXRvciB2YWxpZGF0b3Igb2YgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIG9iamVjdAotCSAqIAkJCU9iamVjdCB0byB3aGljaCB0aGUgbWVzc2FnZSBiZWxvbmdzLiBPYmplY3QgaXMgdGhlIHRhcmdldCBvYmplY3QgdGhhdCB3YXMgc2V0IG9uIHRoZSBJTWVzc2FnZQotCSAqIHdoZW4gYWRkaW5nIHRoZSBtZXNzYWdlIGFzIHByb2JsZW0gbWFya2VyLgotCSAqIAotIAkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3Igb3JpZ2luLCBPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIFRvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yIG1heSBhc3NpZ24gZ3JvdXAgbmFtZXMKLQkgKiB0byBJTWVzc2FnZXMuIEFuIElNZXNzYWdlIHN1YnNldCB3aWxsIGJlIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgb2YgaXRzIGdyb3VwLiBUaGlzIG1ldGhvZAotCSAqIHdpbGwgcmVtb3ZlIG9ubHkgdGhlIElNZXNzYWdlJ3MgdGhhdCBhcmUgaW4gdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLiA8YnI+Ci0JICogPGJyPgotCSAqIDxicj4KLQkgKiAKLQkgKiBUaGUgSVZhbGlkYXRvciBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4gPGJyPgotCSAqIDxicj4KLQkgKiAKLQkgKiBJZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIG51bGwsIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQgYnkgdGhlCi0JICogdmFsaWRhdG9yLiAoaS5lLiwgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHRoZSByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKSBtZXRob2QuKQotCSAqIAotCSAqIElmIGdyb3VwTmFtZSBpcyBudWxsLCB0aGF0J3MgdGhlIHNhbWUgYXMgbm8gZ3JvdXAgKGkuZS4sIHRoZSBzYW1lIGJlaGF2aW91ciBhcyB0aGUKLQkgKiA8Y29kZT5yZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpPC9jb2RlPiBtZXRob2QuKSA8YnI+Ci0JICogCi0JICogQHBhcmFtIG9yaWdpbgotCSAqIAkJCW9yaWdpbmF0b3IgdmFsaWRhdG9yIG9mIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAJCQlPYmplY3QgdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYmVsb25ncy4gCi0JICogQHBhcmFtIGdyb3VwTmFtZQotCSAqIAkJCW5hbWUgb2YgdGhlIGdyb3VwIHRvIHdoaWNoIHRoZSBtZXNzYWdlIGJlbG9uZ3MuIAotCSAqLwotCXZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNhMmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotCi0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gdG8gc2VwYXJhdGUgdGhlIElWYWxpZGF0b3IgZnJvbSB0aGUgbW9kZWwgbG9hZGluZy4gQSBtb2RlbCAKLSAqIGlzIGEgZ3JvdXAgb2Ygb2JqZWN0KHMpIHRoYXQgbXVzdCBmb2xsb3cgc29tZSBydWxlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIG1vZGVsIGlzIGxvYWRlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdmFsaWRhdG9yIGlzIHJ1bm5pbmcgaW4gCi0gKiBVSSBvciBoZWFkbGVzcyBjb250ZXh0LiBJZiB0aGUgPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2Qgd2FzIGEgbWV0aG9kIG9uIHRoZSBJVmFsaWRhdG9yLCAKLSAqIHRoZW4gdGhlcmUgd291bGQgbmVlZCB0byBiZSB0d28gdmVyc2lvbnMgb2YgdmFsaWRhdG9ycywgb25lIGZvciBoZWFkbGVzcyBhbmQgb25lIGZvciAKLSAqIFVJLiBCZWNhdXNlIDxjb2RlPmxvYWRNb2RlbDwvY29kZT4gaXMgc2VwYXJhdGUgZnJvbSB0aGUgSVZhbGlkYXRvciwgd2UgcHJvdmlkZSAKLSAqIHR3byBkaWZmZXJlbnQgSUhlbHBlcnMgaW5zdGVhZCwgYW5kIHNoaXAgdGhlIG9uZSBzcGVjaWZpYyB0byB0aGUgZW52aXJvbm1lbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVhY2ggSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uIGxvYWRzIGEgc3BlY2lmaWMgbW9kZWwgYXMgaWRlbnRpZmllZCBieSBhIFN0cmluZwotICogPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPi4gVGhlIHN5bWJvbGljTmFtZSBjYW4gYmUgYW55IHZhbHVlIGV4Y2VwdCBudWxsIG9yIHRoZSAKLSAqIGVtcHR5IHN0cmluZy4gRWFjaCB2YWxpZGF0b3IgaWRlbnRpZmllcyB0aGUgc3ltYm9saWMgbmFtZXMgd2hpY2ggaXQgbmVlZHMsIGFuZCB0aGUKLSAqIHR5cGUgb2YgbW9kZWwgd2hpY2ggbmVlZHMgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGF0IHN5bWJvbGljIG5hbWUgaXMgbG9hZGVkIHZpYSBhIAotICogPGNvZGU+bG9hZE1vZGVsPC9jb2RlPiBtZXRob2QuIEFuIElWYWxpZGF0aW9uQ29udGV4dCBjYW4gc3VwcG9ydCBtb3JlIHRoYW4gb25lIElWYWxpZGF0b3I7IAotICogdGhlIGhlbHBlciBuZWVkcyB0byBzdXBwb3J0IGV2ZXJ5IG1vZGVsIHRoYXQgZWFjaCB2YWxpZGF0b3IgbmVlZHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25Db250ZXh0IHsKLQkvKioKLQkgKiA8cD4KLQkgKiBMb2FkIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4uPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiAKLQkgKiBtdXN0IG5vdCBiZSBudWxsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbGlkYXRvciBuZWVkcyB0byBiZSBydW4gaW4gYm90aCAKLQkgKiBIZWFkbGVzcyBhbmQgVUkuCi0JICogCi0JICogVGhlIHN5bWJvbGljTmFtZSBpcyBhIHN0cmluZyBuYW1lIHRoYXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICogSVZhbGlkYXRvckNvbnRleHQuIEZvciBhbiBleGFtcGxlIG91ciBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbG9hZE1vZGVsIHVzZQotCSAqIG1ldGhvZCBuYW1lcyBmb3Igc3ltYm9saWNOYW1lcyB0byBsb2FkIHRoZSBtb2RlbCBvYmplY3QgdG8gYmUgdmFsaWRhdGVkLiBVc2VycyBjYW4KLQkgKiB1c2UgdGhlaXIgb3duIG1vZGVsIGxvYWQgbWVjaGFuaXNtLgotCSAqIEBzZWUgPGNvZGU+V29ya2JlbmNoQ29udGV4dDwvY29kZT4KLQkgKiAKLQkgKiA8L3A+Ci0JICogQHBsYW5uZWRmb3IgMS4wCi0JICovCi0JT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKTsKLQotCS8qKgotCSAqIDxwPgotCSAqIExvYWQgdGhlIG1vZGVsIGlkZW50aWZpZWQgYnkgPGNvZGU+c3ltYm9saWNOYW1lPC9jb2RlPiBhbmQgPGNvZGU+cGFybXM8L2NvZGU+LgotCSAqIDxjb2RlPnN5bWJvbGljTmFtZTwvY29kZT4gbXVzdCBub3QgYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWxpZGF0b3IgCi0JICogbmVlZHMgdG8gYmUgcnVuIGluIGJvdGggSGVhZGxlc3MgYW5kIFVJLiBJZiA8Y29kZT5wYXJtczwvY29kZT4gaXMgbnVsbCB0aGVuIHRoaXMKLQkgKiBtZXRob2QgYmVoYXZlcyB0aGUgc2FtZSBhcwotCSAqIAotCSAqIEBsaW5rICNsb2FkTW9kZWwoU3RyaW5nKS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20KLQkgKiBAbGluayAjbG9hZE1vZGVsKFN0cmluZykgYmVjYXVzZSBpdCB0YWtlcyBwYXJhbWV0ZXJzLCBmcm9tIHRoZSBJVmFsaWRhdG9yLCB3aGljaCAKLQkgKiAJCSBhcmUgYXZhaWxhYmxlIG9ubHkgYXQgcnVudGltZS4gSWYgeW91IG5lZWQgdG8gcGFzcyBhIGxpdmUgb2JqZWN0IHRvIHRoZSBJVmFsaWRhdGlvbkNvbnRleHQsIAotCSAqIAkJIHRoaXMgaXMgdGhlIGxvYWRNb2RlbCBtZXRob2QgdG8gdXNlLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lIFN0cmluZyBpZGVudGlmaWVyIGZvciBtb2RlbAotCSAqIEBwYXJhbSBwYXJtcyAJICAgcGFybXMgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhlIG1vZGVsIHRha2VzIGZvciBpbnZvY2F0aW9uCi0JICogCi0JICogW2lzc3VlIDogQ1MgLSBJdCdzIG5vdCBhdCBhbGwgY2xlYXIgaG93IHRoZXNlIHBhcmFtZXRlcnMgd291bGQgZ2V0IHBhc3NlZCBpbnRvIGEgaGVscGVyLiAgSSdkIHN1Z2dlc3QKLQkgKiBwcm92aWRpbmcgZ2V0UHJvcGVydHkoKSBhbmQgc2V0UHJvcGVydHkoKSBtZXRob2RzIG9uIHRoZSBjbGFzcyB0byBhbGxvdyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRvIGJlIAotCSAqIHN1cHBsaWVkIGFuZCBxdWVyaWVkIGluIGEgZ2VuZXJpYyBtYW5uZXIuXQotCSAqLwotCU9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpOwotCQotCS8qKgotCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgd2l0aCB0aGUgbGlzdCBvZiBVUkkncyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkIGluIHRoZQotCSAqIGNhc2Ugb2YgSW5jcmVtZW50YWwgYnVpbGQKLQkgKi8KLQkKLQlTdHJpbmdbXSBnZXRVUklzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNzllOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgVmFsaWRhdG9ycy4gQSBWYWxpZGF0b3IgaXMgYSBjbGFzcyB3aGljaCB2ZXJpZmllcyB0aGF0IG9iamVjdHMKLSAqIGZvbGxvdyBzb21lIHJ1bGVzLiBGb3IgZXhhbXBsZSwgaW4gYSBNT0YgbW9kZWwgd2hpY2ggcmVwcmVzZW50cyBhbiBFSkIgamFyLCB0aGUgRUpCIHNwZWNpZmljYXRpb24KLSAqIGRldGVybWluZXMgdGhlIHJ1bGVzLiA8YnI+Ci0gKiA8YnI+Ci0gKiBBIHZhbGlkYXRvciBjYW4gcGVyZm9ybSBmdWxsIHZhbGlkYXRpb24gb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gQWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQKLSAqIGZ1bGwgdmFsaWRhdGlvbiBidXQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbiBpcyBvcHRpb25hbC4gPGJyPgotICogPGJyPgotICogRWFjaCB2YWxpZGF0b3IgbXVzdCBub3QgYmUgdGllZCB0byBhbnkgcGFydGljdWxhciB3b3JrYmVuY2ggaW1wbGVtZW50YXRpb24uIDxicj4KLSAqIDxicj4KLSAqIEEgdmFsaWRhdG9yJ3MgdmVyaWZpY2F0aW9uIHN0YXJ0cyB3aGVuIHRoZSBWYWxpZGF0b3JMYXVuY2hlciBzaW5nbGV0b24gY2FsbHMKLSAqIDxjb2RlPnZhbGlkYXRlPC9jb2RlPi4KLSAqIAotICogW2lzc3VlOiBMTSAtIFRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNhbmRpZGF0ZSBmb3IKLSAqICBhbiBhYnN0cmFjdCBjbGFzcy4gXSAgIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3J7Ci0JLyoqCi0JICogPHA+Ci0JICogUGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cCBvbmNlIHZhbGlkYXRpb24gaXMgY29tcGxldGUuIElmIGNsZWFudXAgd2lsbCB0YWtlIHNvbWUgdGltZSwgdGhlCi0JICogSVZhbGlkYXRvciBzaG91bGQgcmVwb3J0IHN1YnRhc2sgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgdGhyb3VnaCB0aGUgSVJlcG9ydGVyIHBhcmFtZXRlci4gVGhlCi0JICogSVJlcG9ydGVyIHBhcmFtZXRlciB3aWxsIG5vdCBiZSBudWxsLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gcmVwb3J0ZXIgdXNlZCBmb3IgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIKLQkgKiBAcGxhbm5lZGZvciBXVFAgMS4wCi0JICogCi0JICogW2lzc3VlIDogQ1MgLSBQZXJoYXBzIHRoZSBJVmFsaWRhdG9yIHNob3VsZCBiZSByZXF1aXJlZCB0byBwcm92aWRlIGEgJ25hbWUnIHRoYXQgY2FuIGJlIHVzZWQgZGVzY3JpYmUgCi0JICogdGhlIHJ1bm5pbmcgdmFsaWRhdGlvbiAnSm9iJy4gIFRoZW4gdGhlIGZyYW1ld29yayBjb3VsZCBhdXRvbWF0aWNhbGx5IHNheSBzb21ldGhpbmcgbGlrZSAnWFlaIHZhbGlkYXRvciA6IGNsZWFudXAnLgotCSAqIFJlbHlpbmcgb24gdGhlIElWYWxpZGF0b3IgdG8gcHJvdmlkZSBzdWJ0YXNrIGluZm9ybWF0aW9uIHNlZW1zIGVycm9yIHByb25lLl0KLQkgKiBbaXNzdWU6IExNIC0gSXMgdGhlIGNsZWFudXAgbWV0aG9kIG5lY2Vzc2FyeT8gQ2FuIHRoZSBmcmFtZXdvcmsgcHV0IGEgcmVxdWlyZW1lbnQgdGhhdCBjbGllbnQgdmFsaWRhdG9ycyAnY2xlYW4gdXAnCi0JICogIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgdmFsaWRhdGUgbWV0aG9kPyBdIAotCSAqLwotCXZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uIG9uIHRoZSBvYmplY3RzLiA8YnI+Ci0JICogPGJyPgotCSAqIDxjb2RlPmhlbHBlcjwvY29kZT4gYW5kIDxjb2RlPnJlcG9ydGVyPC9jb2RlPiBtYXkgbm90IGJlIG51bGwuIDxjb2RlPmNoYW5nZWRGaWxlczwvY29kZT4KLQkgKiBtYXkgYmUgbnVsbCwgaWYgYSBmdWxsIGJ1aWxkIGlzIGRlc2lyZWQuIDxicj4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIGhlbHBlciAKLQkgKiAJCQlsb2FkcyBhbiBvYmplY3QuIAotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIAkJCUlzIGFuIGluc3RhbmNlIG9mIGFuIElSZXBvcnRlciBpbnRlcmZhY2UsIHdoaWNoIGlzIHVzZWQgZm9yCi0JICogaW50ZXJhY3Rpb24gd2l0aCB0aGUgdXNlci4KLQkgKiBAcGFyYW0gY2hhbmdlZEZpbGVzCi0JICogCQkJSXMgYW4gYXJyYXkgb2YgZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIGFkZGVkLCBjaGFuZ2VkLCBvciBkZWxldGVkCi0JICogc2luY2UgdGhlIGxhc3QgdmFsaWRhdGlvbi4gSWYgPGNvZGU+Y2hhbmdlZEZpbGVzPC9jb2RlPiBpcyBudWxsLCBvciBpZiBpdCBpcyBhbiBlbXB0eQotCSAqIGFycmF5LCB0aGVuIGEgZnVsbCB2YWxpZGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIE90aGVyd2lzZSwgdmFsaWRhdGlvbiBvbiBqdXN0IHRoZSBmaWxlcwotCSAqIGxpc3RlZCBpbiB0aGUgYXJyYXkgc2hvdWxkIHBlcmZvcm1lZCBpZiB0aGUgdmFsaWRhdG9yIHN1cHBvcnRzIGluY3JlbWVudGFsIHZhbGlkYXRpb24uCi0JICogCi0JICogW2lzc3VlIDogQ1MgLSBJJ20gY3VyaW91cyB0byB1bmRlcnN0YW5kIHdoeSB0aGUgdmFsaWRhdG9yIGlzIG5vdCBpbnZva2VkIGRpcmVjdGx5IG9uIGEgZmlsZS4gIEl0IHNlZW1zIGl0IHNob3VsZCBiZSB0aGUKLQkgKiBkb21haW4gb2YgYW5vdGhlciBBUEkgdG8gbWFuYWdlIG1hbmFnZSBpbmNyZW1lbnRhbCBmaWxlIGNoYW5nZXMgYW5kIHRyaWdnZXJpbmcgdmFsaWRhdGlvbnMgYWNjb3JkaW5nbHkuIAotCSAqIERvIHdlIGhhdmUgYSBjdXJyZW50IHVzZSBjYXNlIGluIFdUUCB3aGVyZSB0aGUgdmFsaWRhdG9yIGRvZXMgYW55dGhpbmcgbW9yZSB2YWxpZGF0ZSBhIGZpbGUgZnJvbSB0aGUgY2hhbmdlZEZpbGVzIGxpc3Q/XQotCSAqLwotCXZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOGE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIEpvYiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0b3IuIFZhbGlkYXRvcnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGFyZSBleGVjdXRlZCBhcwotICogYmFja2dyb3VuZCBqb2JzLiAKLSAqIEZvbGxvd2luZyBpcyBhICBzZXF1ZW5jZSBvZiAgY2FsbCAgPGJyLz4KLSAqIHZhbGlkYXRvci5nZXRTY2hlZHVsaW5nUnVsZShoZWxwZXIpIDxici8+Ci0gKiB2YWxpZGF0b3IudmFsaWRhdGUocmVwb3J0ZXIpCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVmFsaWRhdG9ySm9iIGV4dGVuZHMgSVZhbGlkYXRvcnsKLQotCUlTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLCAwLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGljaCBwZXJmb3JtcyB0aGUgdmFsaWRhdGlvbiBvbiB0aGUgb2JqZWN0cy4gPGJyPgotCSAqIDxicj4KLQkgKiA8Y29kZT5yZXBvcnRlcjwvY29kZT4gbWF5IG5vdCBiZSBudWxsLiA8Y29kZT5jaGFuZ2VkRmlsZXM8L2NvZGU+Ci0JICogbWF5IGJlIG51bGwsIGlmIGEgZnVsbCBidWlsZCBpcyBkZXNpcmVkLiA8YnI+Ci0JICogPGJyPgotICAgICAqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogICAgICAgICAgICBJcyBhbiBpbnN0YW5jZSBvZiBhbiBJUmVwb3J0ZXIgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGZvciBpbnRlcmFjdGlvbiB3aXRoIHRoZQotCSAqICAgICAgICAgICAgdXNlci4KLQkgKiBAcGFyYW0gaGVscGVyIHdpbGwgbm90IGJlIG51bGwsCi0JICoJCWxvYWRzIGFuIG9iamVjdC4KLQkgKi8KLQlJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldCB0aGUgc2NoZWR1bGluZyBydWxlLCB3aGljaCB0aGUgZnJhbWV3b3JrIGFwcGxpZXMgdG8gdGhlIFZhbGlkYXRvciBqb2IsIAotCSAqIEBwYXJhbSBoZWxwZXIgd2lsbCBub3QgYmUgbnVsbCwKLQkgKgkJbG9hZHMgYW4gb2JqZWN0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlX2NvcmUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9NZXNzYWdlTGltaXRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzYyZGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGVfY29yZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL01lc3NhZ2VMaW1pdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZTsKLQotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieQotICogCi0gKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKSBtZXRob2QgaWYgbm8gbW9yZSBtZXNzYWdlcyBjYW4gYmUgcmVwb3J0ZWQKLSAqICAgICAgYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaGFzIGJlZW4gcmVwb3J0ZWQuCi0gKiBbaXNzdWU6IExNIC0gR29pbmcgYWxvbmcgd2l0aCBteSBjb21tZW50IG9uIHRoZSBhZGRNZXNzYWdlIG1ldGhvZCBpbiBJUmVwb3J0ZXIgSSAKLSAqICB0aGluayB0aGlzIGNsYXNzIHNob3VsZCBiZSBpbnRlcm5hbCB0byB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKiAgSSBkb24ndCB0aGluayB0aGVyZSdzIGEgbmVlZCBmb3IgdGhpcyBjbGFzcyB0byBiZSBleHBvc2VkIHRvIGNsaWVudHMuIElmIHRvbyBtYW55Ci0gKiAgbWVzc2FnZXMgYXJlIGFkZGVkIHRoZSBmcmFtZXdvcmsgc2hvdWxkIGhhbmRsZSB0aGlzIHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBjbGllbnQKLSAqICB2YWxpZGF0b3IuIF0KLSAqICBAZGVwcmVjYXRlZCBUaGlzIGNsYXNzIGlzIG5vdCBsb25nZXIgdXNlZCBieSB0aGUgZnJhbWV3b3JrLiBUaGUgZnJhbWV3b3JrIGlzCi0gKiAgbm90IGdvaW5nIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgZGlzcGxheWVkIGJ5IGEgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUxpbWl0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcwMzQ4OTcxOTA3NDU3NjY5NDBMOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3JlZmVyZW5jaWFsRmlsZUV4dFNjaGVtYS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ZlODczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy9yZWZlcmVuY2lhbEZpbGVFeHRTY2hlbWEuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIGlkPSJyZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IiIG5hbWU9IlJlZmVyZW5jaWFsIEZpbGUgVmFsaWRhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgZm9yIHJlZmVyZW50aWFsIGZpbGUgdmFsaWRhdGlvbi4gVGhpcyBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGJlIGV4dGVuZGVkIGlmIHlvdSBoYXZlIGZpbGVzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGZpbGVzIGFuZCB3b3VsZCBsaWtlIHRoZSB2YWxpZGF0aW9uIG9uIHJlZmVyZW5jZWQgZmlsZXMgdG8gcnVuIHdoZW4gdGhlIHZhbGlkYXRpb24gb24gdGhlIHJlZmVyZW5jaW5nIGZpbGUgaXMgcnVuLiBUaGUgUG9zdCBWYWxpZGF0b3Igb3BlcmF0aW9uIHRoYXQgaXMgdXNlZCBieSB0aGlzIGV4dGVuc2lvbiBwb2ludCBleHBlY3RzIGEgZmxhdCBsaXN0IG9mIGZpbGVzIHRvIHJ1biB2YWxpZGF0aW9uIG9uIHJlZmVyZW5jZWQgZmlsZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlZmVyZW5jaWFsRmlsZVZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1biIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1biI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5SZWZlcmVuY2lhbEZpbGVWYWxpZGF0b3IuIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvbkhlbHBlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRpb25IZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4NTRkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvbkhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InZhbGlkYXRpb25IZWxwZXIiIG5hbWU9IlZhbGlkYXRpb24gSGVscGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0aW9uSGVscGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uSGVscGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVscGVyQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLklQcm9qZWN0VmFsaWRhdGlvbkhlbHBlci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZmJmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3hzZHMvdmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIGlkPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciIgbmFtZT0iVmFsaWRhdGlvbiBTZWxlY3Rpb24gSGFuZGxlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhhbmRsZXJDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIElWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VsZWN0aW9uVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckRlbGVnYXRlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckRlbGVnYXRlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTVmODUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3JEZWxlZ2F0ZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iIGlkPSJ2YWxpZGF0b3JEZWxlZ2F0ZXMiIG5hbWU9IlZhbGlkYXRvciBEZWxlZ2F0ZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHZhbGlkYXRvciBwcm92aWRlcnMgdG8gY29udHJpYnV0ZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIGZvciBhIGRlbGVnYXRpbmcgdmFsaWRhdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZWxlZ2F0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZWxlZ2F0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIHZhbGlkYXRvciBkZWxlZ2F0ZS4gRGVsZWdhdGluZyB2YWxpZGF0b3JzIGNhbiBoYXZlIG9uZSBvciBtb3JlIGRlbGVnYXRlcyByZWdpc3RlcmVkLCBvbmx5IG9uZSBvZiB3aGljaCBjYW4gYmUgYWN0aXZlIChzZWxlY3RlZCkgYXQgb25jZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3IuIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJVmFsaWRhdG9ySm9iLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvciBleHRlbnNpb24gZm9yIHdoaWNoIHRoaXMgZGVsZWdhdGUgaXMgYmVpbmcgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JEZWxlZ2F0ZXMmcXVvdDsmZ3Q7Ci0gICAgJmx0O2RlbGVnYXRlCi0gICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmFjbWUuZmFzdC5TdXBlckZhc3RWYWxpZGF0b3ImcXVvdDsKLSAgICAgICAgICBuYW1lPSZxdW90O1N1cGVyIGZhc3QgdmFsaWRhdG9yJnF1b3Q7Ci0gICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5hY21lLmNvcmUuQUNNRURlbGVnYXRpbmdWYWxpZGF0b3ImcXVvdDsvJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEEgZGVsZWdhdGUgdmFsaWRhdG9yIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIElWYWxpZGF0b3JKb2IgaW50ZXJmYWNlLgotVGhlIHRhcmdldCB2YWxpZGF0b3IsIHRoZSBvbmUgd2hvIHdpbGwgZGVsZWdhdGUgaXRzIGltcGxlbWVudGF0aW9uIHRvIGEgZGVsZWdhdGUgdmFsaWRhdG9yIHdpbGwgaGF2ZSB0byBleHRlbmQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZGVsZWdhdGVzLkJhc2VEZWxlZ2F0aW5nVmFsaWRhdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckV4dFNjaGVtYS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi94c2RzL3ZhbGlkYXRvckV4dFNjaGVtYS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWEwYTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24veHNkcy92YWxpZGF0b3JFeHRTY2hlbWEuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIgaWQ9InZhbGlkYXRvciIgbmFtZT0iVmFsaWRhdG9yIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGdpdmUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGEgbmV3IHZhbGlkYXRvciB0aGF0IGNhbiB2YWxpZGF0ZSByZXNvdXJjZXMgaW4gYSBKYXZhIFByb2plY3QuIFRoZSB2YWxpZGF0b3IgbmVlZHMgdG8gcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBuYXR1cmUgb2YgdGhlIHByb2plY3QgZm9yIGl0IHRvIHJ1biBvbiB0aGF0IHByb2plY3QuIFRoZSB1c2VyIGNhbiBzcGVjaWZpeSBmaWxlIGZpbHRlcnMgdG8gZmlsdGVyIG91dCBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkLiBUaGUgbmV3IHZhbGlkYXRvciByZWdpc3RlcmVkIGJ5IHRoZSBwcm9qZWN0IG5hdHVyZSBvbiB0aGUgcHJvamVjdCBjYW4gYmUgcnVuIG1hbnVhbGx5IG9yIGluY3JlbWVudGFsbHkgaWYgIEF1dG8gQnVpbGQgaXMgdHVybmVkIG9uLCBkdXJpbmcgaW5jcmVtZW50YWwgYnVpbGRzIHRoZSBjaGFuZ2VkIGRlbHRhIG9mIGZpbGVzIGFyZSBvbmx5IHZhbGlkYXRlZCBpZiB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgdmFsaWRhdGlvbiBmaWx0ZXJzIHNwZWNpZmllZC4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRvciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdE5hdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Lz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImhlbHBlciIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGVwZW5kZW50VmFsaWRhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icnVuIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtYXJrZXJJZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZhY2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUJpbmRpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG8iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgbWlncmF0aW9uIHRhZw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmcm9tIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIG1pZ3JhdGlvbiB0YWcNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3ROYXR1cmUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIA0KLSAgIA0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlQmluZGluZyI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY29udGVudFR5cGVJZCIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NvY2lhdGVzIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUgd2l0aCB0aGUgY3VycmVudCB2YWxpZGF0b3IsIGFuZCBlbmFibGVzIHRoZSB2YWxpZGF0b3IgdG8gYmUgcnVuIG9uIHJlc291cmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZS4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyLiBUaGlzIGlzIGFuIElEIGRlZmluZWQgYnkgdGhlICZhcG9zO29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMmYXBvczsgZXh0ZW5zaW9uIHBvaW50Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgDQotICAgDQotICAgDQotDQotICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3RDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZUZpbHRlciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImhlbHBlciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJkZXBlbmRlbnRWYWxpZGF0b3IiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcFZhbFZhbHVlIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InJ1biI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY3JlbWVudGFsIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZ1bGxCdWlsZCIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzeW5jIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1hcmtlcklkIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGUgbWFya2VySWQgZWxlbWVudCBpcyBpcyB1c2VkIHRvIGdldCBhIGN1c3RvbSBwcm9ibGVtIG1hcmtlciBmb3IgdGhlIGN1c3RvbSB2YWxpZGF0b3IgaW1wbGVtZW50ZWQgdXNpbmcgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0NCi1UaGlzIG1hcmtlcklkIGVsZW1lbnQgYWxzbyBuZWVkcyBhIGNvcnJlc3BvbmRpbmcgcHJvYmxlbU1hcmtlciBleHRlbnNpb24gdG8gYmUgZGVmaW5lZCBieXRoaXMgdmFsaWRhdG9yIHdpdGggdGhlIHNhbWUgSWQgYXMgdGhlIG1ha2VySWRWYWx1ZSBmb3IgdGhlIHZhbGlkYXRvciB0byBoYXZlIGl0cyBvd24gbWFya2VyIHR5cGUuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgYSBwcm9ibGVtTWFya2VyIGV4dGVuc2lvbiBkZWZpbmVkIGZvciBhIG1hcmtlcklkVmFsdWUgJnF1b3Q7Rm9vTWFya2VyJnF1b3Q7DQotDQotICZsdDtleHRlbnNpb24NCi0gICAgICAgICBpZD0mcXVvdDtGb29NYXJrZXImcXVvdDsNCi0gICAgICAgICBuYW1lPSZxdW90OyVFSkJfVkFMSURBVElPTl9QUk9CTEVNTUFSS0VSX05BTUUmcXVvdDsNCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtzdXBlcg0KLSAgICAgICAgICAgIHR5cGU9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciZxdW90OyZndDsNCi0gICAgICAmbHQ7L3N1cGVyJmd0Ow0KLSAgICAgICZsdDtwZXJzaXN0ZW50DQotICAgICAgICAgICAgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsNCi0gICAgICAmbHQ7L3BlcnNpc3RlbnQmZ3Q7DQotICAgICAgJmx0O2F0dHJpYnV0ZQ0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7b3duZXImcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9hdHRyaWJ1dGUmZ3Q7DQotICAgICAgJmx0O2F0dHJpYnV0ZQ0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7dmFsaWRhdGlvblNldmVyaXR5JnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvYXR0cmlidXRlJmd0Ow0KLSAgICAgICZsdDthdHRyaWJ1dGUNCi0gICAgICAgICAgICBuYW1lPSZxdW90O3RhcmdldE9iamVjdCZxdW90OyZndDsNCi0gICAgICAmbHQ7L2F0dHJpYnV0ZSZndDsNCi0gICAgICAmbHQ7YXR0cmlidXRlDQotICAgICAgICAgICAgbmFtZT0mcXVvdDtncm91cE5hbWUmcXVvdDsmZ3Q7DQotICAgICAgJmx0Oy9hdHRyaWJ1dGUmZ3Q7DQotICAgICAgJmx0O2F0dHJpYnV0ZQ0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7bWVzc2FnZUlkJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvYXR0cmlidXRlJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSAgIA0KLSAgIFdpdGhvdXQgYSBwcm9ibGVtTWFya2VyIGV4dGVuc2lvbiBkZWZpbmVkLCB0aGUgY3VzdG9tZXIgdmFsaWRhdG9yIHdpbGwgdXNlIHRoZSBiYXNlIFZhbGlkYXRpb24gTWVzc2FnZSBwcm9ibGVtTWFya2VyIHR5cGUuDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXJrZXJJZFZhbHVlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZmFjZXQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgZGVwcmVjYXRlZD0idHJ1ZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgZGVwcmVjYXRlZCBhbmQgZW5hYmxlbWVudCBpcyB0aGUgbmV3IHJlY29tbWVuZGVkIGFwcHJvYWNoIHRvIGZpbHRlciB2YWxpZGF0b3JzIGJhc2VkIG9uIGZhY2V0cy4NCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY2V0SWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0K